【机器学习微积分】02 函数近似与泰勒级数

本文深入探讨了函数近似和泰勒级数的概念,解释了dy和Δy的含义,以及它们在微分中的作用。通过线性近似和无穷级数的讨论,阐述了泰勒级数如何表示和近似函数。举例展示了如何利用泰勒级数在特定点进行函数的高精度近似,并通过代码和图像验证了泰勒级数的近似效果。
摘要由CSDN通过智能技术生成

1.谈谈 Δ y \Delta y Δy d y dy dy

在上一讲的内容中,我们提到了利用 d y d x \frac{dy}{dx} dxdy来表示因变量 y y y关于自变量 x x x的导数,而我们到目前为止,都是将其作为一个整体来看待的。在这一讲的开头,我们尝试分别来单独讨论 d y dy dy d x dx dx的含义。

首先我们还是来看导数的含义,如果函数 f ( x ) f(x) f(x)在点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)处是可微的,那么依照定义就有:

l i m Δ x → 0 f ( x 0 + Δ x ) − f ( x 0 ) Δ x = f ′ ( x 0 ) lim_{\Delta x\rightarrow 0}\frac{f(x_0+\Delta x)- f(x_0)}{\Delta x}= f'(x_0) limΔx0Δxf(x0+Δx)f(x0)=f(x0)

从这个式子中我们发现了什么端倪呢?那就是 Δ x \Delta x Δx的值越小,越趋近于 0 0 0,那么式子的左边,即: f ( x 0 + Δ x ) − f ( x 0 ) Δ x \frac{f(x_0+\Delta x)- f(x_0)}{\Delta x} Δxf(x0+Δx)f(x0)就越趋近于 x 0 x_0 x0处导数的真实值 f ′ ( x 0 ) f'(x_0) f(x0)

我们简单的对式子进行一下变换就有:

f ( x 0 + Δ x ) − f ( x 0 ) ≈ Δ x f ′ ( x 0 ) f(x_0+\Delta x)-f(x_0)\approx \Delta xf'(x_0) f(x0+Δx)f(x0)Δxf(x0)

这个表达式的左侧部分 f ( x 0 + Δ x ) − f ( x 0 ) f(x_0+\Delta x)-f(x_0) f(x0+Δx)f(x0)称作是 Δ y \Delta y Δy,顾名思义就是当自变量 x x x x 0 x_0 x0变到 x 0 + Δ x x_0+\Delta x x0+Δx时, y y y的真实改变量,而右侧部分 Δ x f ′ ( x 0 ) \Delta xf'(x_0) Δxf(x0)我们称之为 d y dy dy,他充当的是 Δ y \Delta y Δy的近似值,如下图所示:

图1.y值改变量的近似

因此, d y dy dy可以作为 Δ y \Delta y Δy的一个近似值来看待,特别是当 Δ x \Delta x Δx越小的时候,近似效果越好。

我们最后来总结一下 Δ x \Delta x Δx d x dx dx Δ y \Delta y Δy d y dy dy这几个概念:

对于自变量为 x x x的可微函数 y = f ( x ) y=f(x) y=f(x) Δ x \Delta x Δx d x dx dx Δ y \Delta y Δy d y dy dy的含义分别总结如下:

Δ x \Delta x Δx:表示自变量 x x x的任意增量。

d x dx dx:表示自变量 x x x的微分,实际上就等于 Δ x \Delta x Δx

Δ y \Delta y Δy:表示当自变量 x x x变化到 x + Δ x x+\Delta x x+Δx时,因变量 y y y的真实改变量,即: Δ y = f ( x + Δ x ) − f ( x ) \Delta y=f(x+\Delta x)-f(x) Δy=f(x+Δx)f(x)

d y dy dy:因变量 y y y的微分,实际上 d y = f ′ ( x ) d x dy=f'(x)dx dy=f(x)dx,这里请大家注意,微分 d y dy dy可以作为真实值 Δ y \Delta y Δy的一个近似。

因此可以看出,微分的作用非常广,我们这里首要关心的就是他在近似过程中的应用:

f ( x + Δ x ) = f ( x ) + Δ y ≈ f ( x ) + d y = f ( x ) + f ′ ( x ) Δ x f(x+\Delta x)=f(x)+\Delta y \approx f(x)+dy=f(x)+f'(x)\Delta x f(x+Δx)=f(x)+Δyf(x)+dy=f(x)+f(x)Δx

⇒ f ( x + Δ x ) ≈ f ( x ) + f ′ ( x ) Δ x \Rightarrow f(x+\Delta x) \approx f(x)+f'(x)\Delta x f(x+Δx)f(x)+f(x)Δx

2.线性近似的概念

基于上面的式子,进一步的,我们可以表示出:假如函数 f f f c c c点处可微,由直线方程的写法可以拿出函数 f f f的曲线在点 c , f ( c ) c,f(c) c,f(c)处的切线方程 g ( x ) g(x) g(x)

f ′ ( c ) = g ( x ) − f ( c ) x − c ⇒ g ( x ) = f ( c ) + f ′ ( c ) ( x − c ) f'(c)=\frac{g(x)-f(c)}{x-c}\Rightarrow g(x)=f(c)+f'(c)(x-c) f(c)=xcg(x)f(c)g(x)=f(c)+f(c)(xc)

那么此时,过点 ( c , f ( c ) ) (c,f(c)) (c,f(c))的切线 g ( x ) g(x) g(x)就可以看做是原函数 f f f在点 c c c处的线性近似。

概念还是很空洞的,我们还是结合一个例子简单的说明一下:

我们试着用上面的方法来观察一下函数 f ( x ) = 1 + s i n 2 x f(x)=1+sin2x f(x)=1+sin2x在取值 x = π / 2 x=\pi/2 x=π/2处的线性近似情况:

我们首先按照上面的公式写出 x = π / 2 x=\pi/2 x=π/2处的切线方程:

g ( x ) = f ( c ) + f ′ ( c ) ( x − c ) g(x)=f(c)+f'(c)(x-c) g(x)=f(c)+f(c)(xc) = f ( π / 2 ) + f ′ ( π / 2 ) ( x − π / 2 ) =f(\pi/2)+f'(\pi/2)(x-\pi/2) =f(π/2)+f(π/2)(xπ/2) = 1 + s i n π + 2 c o s π ( x − π / 2 ) =1+sin\pi+2cos\pi(x-\pi/2) =1+sinπ+2cosπ(xπ/2) = − 2 x + ( 1 + π ) =-2x+(1+\pi) =2x+(1+π)

即: g ( x ) = − 2 x + ( 1 + π ) g(x)=-2x+(1+\pi) g(x)=2x+(1+π)

然后我们绘制出函数 f ( x ) f(x) f(x) x = π / 2 x=\pi/2 x=π/2处切线的图像,并在不同的自变量区域尺度内观察:

代码片段:

import matplotlib.pyplot as plt
import numpy as np
import seaborn
from math import pi
seaborn.set()

def f(x):
    return 1+np.sin(2*x)

def g(x):
    return -2*x+(1+pi)

fig, ax = plt.subplots(2, 2)

x = np.linspace(0, pi, 1000)
ax[0, 0].plot(x, f(x), color='k')
ax[0, 0].plot(x, g(x), color='r')
ax[0, 0].plot(pi/2, f(pi/2), 'ko', markersize=4)

x = np.linspace(pi/4, 3*pi/4, 1000)
ax[0, 1].plot(x, f(x), color='k')
ax[0, 1].plot(x, g(x), color='r')
ax[0, 1].plot(pi/2, f(pi/2), 'ko', markersize=4)

x = np.linspace(3*pi/8, 5*pi/8, 1000)
ax[1, 0].plot(x, f(x), color='k')
ax[1, 0].plot(x, g(x), color='r')
ax[1, 0].plot(pi/2, f(pi/2), 'ko', markersize=4)

x = np.linspace(7*pi/16, 9*pi/16, 1000)
ax[1, 1].plot(x, f(x), color='k')
ax[1, 1].plot(x, g(x), color='r')
ax[1, 1].plot(pi/2, f(pi/2), 'ko', markersize=4)

plt.show()

运行结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DqKwclUP-1605432381443)(https://images.gitbook.cn/f7320210-e061-11e9-8b74-3dd44b38685a)]

很明显的是,随着自变量 x x x区间的不断收窄,在点 ( π / 2 , f ( π / 2 ) ) (\pi/2,f(\pi/2)) (π/2,f(π/2))的领域附近,切线的图像和原函数是高度重合的,因此在 Δ x \Delta x Δx越来越小的时候,线性近似的效果就会显得越好。

但是,如果我们仅仅使用这种线性近似,他的效果毕竟还是不算太好,他的近似精度其实还是有很大的提升空间的,那么我们下一步该如何做呢?也许级数是一个很不错的想法。

3.关于无穷级数

3.1.无穷级数的前 n n n项和

这里我们引入一个背景知识进行讨论:当我们用计算机来计算正余弦函数或者是自然对数的幂,即 e n e^n en的时候,通常是基于下面的无穷数列来给出满足较高精度的近似值:

s i n ( x ) = x − x 3 3 ! + x 5 5 ! − x 7 7 ! + . . . sin(x)=x-\frac{x^3}{3!}+\frac{x^5}{5!}-\frac{x^7}{7!}+... sin(x)=x3!x3+5!x57!x7+...

c o s ( x ) = 1 − x 2 2 ! + x 4 4 ! − x 6 6 ! + . . . cos(x)=1-\frac{x^2}{2!}+\frac{x^4}{4!}-\frac{x^6}{6!}+... cos(x)=12!x2+4!x46!x6+...

e x = 1 + x + x 2 2 ! + x 3 3 ! + x 4 4 ! + . . . e^x=1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\frac{x^4}{4!}+... ex=1+x+2!x2+3!x3+4!x4+...

上面的表达式就是无穷级数。无穷级数的概念很多,我们先看最简单的:一组数字的无穷级数:

1 2 + 1 4 + 1 8 + . . . \frac{1}{2}+\frac{1}{4}+\frac{1}{8}+... 21+41+81+...

在这个级数当中,如果只包含第一项,那么和就为 1 / 2 1/2 1/2,如果包含前两项,那么和为 1 / 2 + 1 / 4 = 3 / 4 1/2+1/4=3/4 1/2+1/4=3/4,如果只包含前三项,那么和就为 1 / 2 + 1 / 4 + 1 / 8 = 7 / 8 1/2+1/4+1/8=7/8 1/2+1/4+1/8=7/8

级数的前有限项的和,我们叫作部分和。我们把前 n n n项部分和记为是 S n S_n Sn,很显然对照上面所描述的就有: S 1 = 1 2 S_1=\frac{1}{2} S1=21 S 2 = 3 4 S_2=\frac{3}{4} S2=43 S 3 = 7 8 S_3=\frac{7}{8} S3=87,显然还可以归纳出 S n = 1 − 1 2 n S_n=1-\frac{1}{2^n} Sn=12n1,并且可以看得出, S n S_n Sn收敛于 1 1 1

而至于说无穷级数的和,我们将其定义为部分和 S n S_n Sn的极限: l i m n → ∞ S n lim_{n\rightarrow \infty}S_n limnSn

当然,我们脱离上面这些个具体的数字来谈定义,我们给出无穷级数前 n n n项和的一般表示方法,即:考虑无穷级数: a 1 + a 2 + a 3 + a 4 + a 5 + . . . . . . a_1+a_2+a_3+a_4+a_5+...... a1+a2+a3+a4+a5+......,那么在这种表示方法之下,前 n n n项的和我们定义为: S n = a 1 + a 2 + a 3 + . . . + a n = ∑ k = 1 n a k S_n=a_1+a_2+a_3+...+a_n=\sum_{k=1}^{n}a_k Sn=a1+a2+a3+...+an=k=1nak

3.2.级数的收敛性

对于无穷级数,我们最关注的便是级数的收敛性,这里我们给出一个比较严格的定义和说法:

对于一个无穷级数 ∑ k = 1 ∞ a k \sum_{k=1}^{\infty}a_k k=1ak,如果由他的前 n n n项和构成的数列 { S 1 , S 2 , S 3 , . . . , S n } \{S_1,S_2,S_3,...,S_n\} {S1,S2,S3,...,Sn}最终收敛于 S S S,那么我们就称无穷级数 ∑ k = 1 ∞ a k \sum_{k=1}^{\infty}a_k k=1ak收敛并且他的和为 S S S。反之,如果数列 { S 1 , S 2 , S 3 , . . . , S n } \{S_1,S_2,S_3,...,S_n\} {S1,S2,S3,...,Sn}发散,那么无穷级数也是发散的,这个无穷级数是没有和的。

3.3.几何级数

对于无穷级数,我们特别的需要关注以下这种形式:

∑ k = 1 ∞ a r k − 1 = a + a r + a r 2 + a r 3 + . . . \sum_{k=1}^{\infty}ar^{k-1}=a+ar+ar^2+ar^3+... k=1ark1=a+ar+ar2+ar3+...,其中 a ≠ 0 a\neq 0 a=0。这种形式所表示的级数,称之为几何级数,这是一种比较常见的级数。更具体的,我们可以把几何级数划分为两大类:

一类是常数项级数,即不含自变量的,类似于: 1 2 + 1 4 + 1 8 + 1 16 + . . . \frac{1}{2}+\frac{1}{4}+\frac{1}{8}+\frac{1}{16}+... 21+41+81+161+...,也就是上面写的 ∑ n = 1 ∞ a n \sum_{n=1}^{\infty} a_n n=1an这种形式,非常好理解。

另外一类就是函数项的级数,即 ∑ n = 1 ∞ a n ( x ) \sum_{n=1}^{\infty}a_n(x) n=1an(x)。这其中,级数的每一项 a n ( x ) a_n(x) an(x)都是一个关于自变量 x x x的函数,函数项的级数用处更为广泛,他将是我们后续内容中的重点研究的对象。

最基本、最简单的一种函数项无穷级数: ∑ n = 0 ∞ a n x n = a 0 + a 1 x + a 2 x 2 + a 3 x 3 + . . . . . . \sum_{n=0}^{\infty}a_nx^n=a_0+a_1x+a_2x^2+a_3x^3+...... n=0anxn=a0+a1x+a2x2+a3x3+......,我们就将其称之为自变量 x x x的幂级数。而进一步,我们将这种表达式一般化,写成是: ∑ n = 1 ∞ a n ( x − a ) n = a 0 + a 1 ( x − a ) + a 2 ( x − a ) 2 + a 3 ( x − a ) 3 + . . . \sum_{n=1}^{\infty}a_n(x-a)^n=a_0+a_1(x-a)+a_2(x-a)^2+a_3(x-a)^3+... n=1an(xa)n=a0+a1(xa)+a2(xa)2+a3(xa)3+...,这称为关于 x − a x-a xa的幂级数。

4.函数的幂级数表示及其近似

4.1.利用泰勒级数表示函数

走到这里,你可能还非常困惑,我们为什么铺垫了这么多无穷级数、包括特殊的幂级数的概念,目的到底是想干嘛?

其实很自然,我们是想探究这样一个问题,那就是给定一个已知函数 f ( x ) f(x) f(x),我们能否将这个函数以 x − a x-a xa的幂级数的形式进行表示,并且探索他的一些重要性质?

那么,更具体的:我们的目标就是找到一组数: c 0 c_0 c0, c 1 c_1 c1, c 2 c_2 c2,…, c n c_n cn,使得函数 f ( x ) f(x) f(x)表达成如下的形式: f ( x ) = c 0 + c 1 ( x − a ) + c 2 ( x − a ) 2 + c 3 ( x − a ) 3 + . . . f(x)=c_0+c_1(x-a)+c_2(x-a)^2+c_3(x-a)^3+... f(x)=c0+c1(xa)+c2(xa)2+c3(xa)3+...

如果这个式子想要成立,很显然,我们对上面的级数表达式进行求导,从一阶导数开始,逐步求取他的高阶导数( n n n阶导):

f ( x ) = c 0 + c 1 ( x − a ) + c 2 ( x − a ) 2 + c 3 ( x − a ) 3 + . . . f(x)=c_0+c_1(x-a)+c_2(x-a)^2+c_3(x-a)^3+... f(x)=c0+c1(xa)+c2(xa)2+c3(xa)3+...

f ′ ( x ) = c 1 + 2 c 2 ( x − a ) + 3 c 3 ( x − a ) 2 + 4 c 4 ( x − a ) 3 + . . . f'(x)=c_1+2c_2(x-a)+3c_3(x-a)^2+4c_4(x-a)^3+... f(x)=c1+2c2(xa)+3c3(xa)2+4c4(xa)3+...

f ′ ’ ( x ) = 2 × 1 c 2 + 3 × 2 c 3 ( x − a ) + 4 × 3 c 4 ( x − a ) 2 + . . . f'’(x)=2\times 1c_2+3\times 2c_3(x-a)+4\times 3c_4(x-a)^2+... f(x)=2×1c2+3×2c3(xa)+4×3c4(xa)2+...

f ( 3 ) ( x ) = 3 × 2 × 1 c 3 + 4 × 3 × 2 c 4 ( x − a ) + 5 × 4 × 3 c 5 ( x − a ) 2 . . . f^{(3)}(x)=3\times 2\times 1c_3+4\times 3\times 2c_4(x-a)+5\times 4\times 3c_5(x-a)^2... f(3)(x)=3×2×1c3+4×3×2c4(xa)+5×4×3c5(xa)2...

f ( 4 ) ( x ) = 4 × 3 × 2 × 1 c 4 + 5 × 4 × 3 × 2 c 5 ( x − a ) . . . f^{(4)}(x)=4\times 3\times 2\times 1c_4+5\times 4\times 3\times 2c_5(x-a)... f(4)(x)=4×3×2×1c4+5×4×3×2c5(xa)...

看上去一大篇的式子,我们又该如何处理呢?其实也很容易,我们将 x = a x=a x=a代入到上面的所有表达式中,就可以顺利的消去所有的非常数项:

f ( a ) = c 0 ⇒ c 0 = f ( a ) f(a)=c_0\Rightarrow c_0=f(a) f(a)=c0c0=f(a)

f ′ ( a ) = c 1 ⇒ c 1 = f ′ ( a ) f'(a)=c_1\Rightarrow c_1=f'(a) f(a)=c1c1=f(a)

f ′ ’ ( a ) = 2 × 1 c 2 ⇒ c 2 = f ′ ′ ( a ) 2 ! f'’(a)=2\times 1c_2\Rightarrow c_2=\frac{f''(a)}{2!} f(a)=2×1c2c2=2!f(a)

f ( 3 ) ( a ) = 3 × 2 × 1 c 3 ⇒ c 3 = f ( 3 ) 3 ! f^{(3)}(a)=3\times 2\times 1c_3 \Rightarrow c_3=\frac{f^{(3)}}{3!} f(3)(a)=3×2×1c3c3=3!f(3)

f ( 4 ) ( a ) = 4 × 3 × 2 × 1 c 4 ⇒ c 4 = f ( 4 ) 4 ! f^{(4)}(a)=4\times 3\times 2\times 1c_4 \Rightarrow c_4=\frac{f^{(4)}}{4!} f(4)(a)=4×3×2×1c4c4=4!f(4)

最后,我们可以得出系数 c n c_n cn的一般表达形式: c n = f ( n ) ( a ) n ! c_n=\frac{f^{(n)}(a)}{n!} cn=n!f(n)(a)

从这个推导过程中,我们知道了函数 f ( x ) f(x) f(x)如果能用关于 ( x − a ) (x-a) (xa)的幂级数的形式来进行表示,那么表达的方式不可能多于一种。那么,对于一个给定函数 f ( x ) f(x) f(x)而言,用以 ( x − a ) (x-a) (xa)为表达方式的幂级数,我们就将其称之为泰勒级数,而一种比较特殊的情况,即当 a = 0 a=0 a=0时的幂级数,我们可以将其称之为麦克劳林级数。

如果我们把泰勒级数的项数固化到 n n n项,会更方便于我们在实际过程中的处理,毕竟我们不可能处理无限个级数项。这里我们运用微分中值定理,就可以把无穷项的泰勒级数转化为有限项的泰勒级数,这里运用到的就是带有余项的泰勒公式,即:

如果函数 f ( x ) f(x) f(x) ( n + 1 ) (n+1) (n+1)阶导数 f ( n + 1 ) f^{(n+1)} f(n+1) x = a x=a x=a的邻域内存在,那么在这个邻域内函数 f f f可以表示成以下的有限项的形式:

f ( x ) = f ( a ) + f ′ ( a ) ( x − a ) + f ′ ′ ( a ) 2 ! ( x − a ) 2 + . . . + f ( n ) ( a ) n ! ( x − a ) n + R n ( x ) f(x)=f(a)+f'(a)(x-a)+\frac{f''(a)}{2!}(x-a)^2+...+\frac{f^{(n)}(a)}{n!}(x-a)^n+R_n(x) f(x)=f(a)+f(a)(xa)+2!f(a)(xa)2+...+n!f(n)(a)(xa)n+Rn(x)

最后一项 R n ( x ) R_n(x) Rn(x)我们称之为余项,换句话说他代表了函数真实值 f ( x ) f(x) f(x)与前 n n n项和之间的误差,利用微分中值定理,我们可以将其表示为:

R n ( x ) = f ( n + 1 ) ( c ) ( n + 1 ) ! ( x − a ) n + 1 R_n(x)=\frac{f^{(n+1)}(c)}{(n+1)!}(x-a)^{n+1} Rn(x)=(n+1)!f(n+1)(c)(xa)n+1,在这其中, c c c x x x a a a之间的一点。

4.2.函数的泰勒近似

那么谈到这里,我们就会受到启发,我们似乎可以利用函数 f f f的泰勒级数的前 n n n项和来对函数在 x = a x=a x=a邻域内的实际取值进行近似。

再回过头来看看前面对于函数的线性近似的内容,我们讲过函数 f f f a a a点邻域内的值,可以用经过函数 f f f ( a , f ( a ) ) (a,f(a)) (a,f(a))的切线去近似: p 1 ( x ) = f ( a ) + f ′ ( a ) ( x − a ) p_1(x)=f(a)+f'(a)(x-a) p1(x)=f(a)+f(a)(xa)

看看这是什么?我们发现 p 1 ( x ) p_1(x) p1(x)由两项组成,即包含泰勒级数关于 x = a x=a x=a点展开的 0 0 0阶项和 1 1 1阶项,因此,我们把线性近似称之为是一阶泰勒多项式。

但是我们不难发现,毕竟切线是一条直线,用它去近似函数 f f f所代表的曲线,只要随着自变量 x x x稍微远离 a a a点,近似值和实际的函数取值的差距就会显著增大。

于是我们就在想,线性近似只使用了泰勒级数的第 0 0 0项和第 1 1 1项,似乎丢失了太多后面的信息,那么我们把级数中后续更高阶的项也利用起来,例如用 2 2 2阶泰勒多项式: p 2 ( x ) = f ( a ) + f ′ ( a ) ( x − a ) + f ′ ′ ( a ) 2 ! ( x − a ) 2 p_2(x)=f(a)+f'(a)(x-a)+\frac{f''(a)}{2!}(x-a)^2 p2(x)=f(a)+f(a)(xa)+2!f(a)(xa)2,这个相比于一阶泰勒多项式(也就是线性近似),他的近似效果会显得更好。

如果我们追求更高的近似精度,我们可以使用更高阶数的 n n n阶泰勒多项式进行函数的近似:

p n ( x ) = f ( a ) + f ′ ( a ) ( x − a ) + f ′ ′ ( a ) 2 ! ( x − a ) 2 + . . . + f ( n ) ( a ) n ! ( x − a ) n p_n(x)=f(a)+f'(a)(x-a)+\frac{f''(a)}{2!}(x-a)^2+...+\frac{f^{(n)}(a)}{n!}(x-a)^n pn(x)=f(a)+f(a)(xa)+2!f(a)(xa)2+...+n!f(n)(a)(xa)n

并且相应的,如果此时 a = 0 a=0 a=0,那么 n n n阶泰勒多项式就转化为了 n n n阶麦克劳林多项式,用于对 0 0 0附近邻域内的函数取值进行近似。

f ( x ) ≈ p n ( x ) = f ( 0 ) + f ′ ( 0 ) x + 1 2 ! f ′ ′ ( x ) x 2 + . . . + 1 n ! f ( n ) ( 0 ) x n f(x) \approx p_n(x)=f(0)+f'(0)x+\frac{1}{2!}f''(x)x^2+...+\frac{1}{n!}f^{(n)}(0)x^n f(x)pn(x)=f(0)+f(0)x+2!1f(x)x2+...+n!1f(n)(0)xn

很显然,按照这个公式我们可以很轻松的得到例如 e x e^x ex c o s x cosx cosx的麦克劳林级数:

e x ≈ 1 + x + 1 2 ! x 2 + 1 3 ! x 3 + 1 4 ! x 4 + . . . + 1 n ! x n e^x \approx 1+x+\frac{1}{2!}x^2+\frac{1}{3!}x^3+\frac{1}{4!}x^4+...+\frac{1}{n!}x^n ex1+x+2!1x2+3!1x3+4!1x4+...+n!1xn

c o s x ≈ 1 − 1 2 ! x 2 + 1 4 ! x 4 − . . . + ( − 1 ) n / 2 1 n ! x n cos x\approx 1-\frac{1}{2!}x^2+\frac{1}{4!}x^4-...+(-1)^{n/2}\frac{1}{n!}x^n cosx12!1x2+4!1x4...+(1)n/2n!1xn

4.3.实际的近似试验

为了展示高阶麦克劳林级数(泰勒级数)在指定点附近邻域的良好近似特性,我们在 x = 0 x=0 x=0处利用不同阶数的麦克劳林级数对原函数 y = c o s x y=cosx y=cosx进行近似,并利用函数图像观察近似效果:

代码片段:

import matplotlib.pyplot as plt
import numpy as np
import seaborn
seaborn.set()

##计算n的阶乘
def factorial(n):
    result = n
    for i in range(1,n):
        result *= i
    return result

##原函数
def f(x):
    return np.cos(x)

##1阶麦克劳林级数
def p1(x):
    return 1

##2阶麦克劳林级数
def p2(x):
    return 1-1./factorial(2)*(x**2)

##4阶麦克劳林级数
def p4(x):
    return 1-1./factorial(2)*(x**2)+1./factorial(4)*(x**4)

##6阶麦克劳林级数
def p6(x):
    return 1-1./factorial(2)*(x**2)+1./factorial(4)*(x**4)-1./factorial(6)*(x**6)

##8阶麦克劳林级数
def p8(x):
    return 1-1./factorial(2)*(x**2)+1./factorial(4)*(x**4)-1./factorial(6)*(x**6)+1./factorial(8)*(x**8)

x = np.linspace(-5, 5, 1000)
plt.plot(x, f(x), color='k', label='cosx')
plt.hlines(1, -5, 5, colors='g', label='p1')
plt.plot(x, p2(x), color='b', label='p2')
plt.plot(x, p4(x), color='r', label='p4')
plt.plot(x, p6(x), color='y', label='p6')
plt.plot(x, p8(x), color='m', label='p8')

plt.ylim(-2, 2)
plt.legend()
plt.show()

运行结果:
图3.不同阶数的麦克劳林函数近似效果

从图中我们可以看出, y = c o s x y=cosx y=cosx 8 8 8阶麦克劳林级数在 x = 0 x=0 x=0的附近邻域对原函数 c o s x cosx cosx的近似程度已经是相当高了。

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

石 溪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值