前言
本文对泰勒公式的由来以及证明做一些简单的总结,方便自己在闲暇时品读。
本人对泰勒公式的记忆只停留在大学时期的期末考试复习阶段,说来也是十分的惭愧。
俗话说,温故而知新,可以为师矣,以下内容均来自于知乎大神承志。
一、泰勒公式的用途
泰勒公式本质解决的是近似的问题,比如说我们有一个看起来很复杂的方程,我们直接计算方程本身的值可能会非常的麻烦。所以我们希望能够找到一个近似的方法来获得一个足够近似的值。
从这里,我们得到了两个重点,一个是近似的方法,另一个是近似的精度。我们既需要找到合适的方法来近似,同时也需要保证近似的精度是可控的。否则一切都没有意义,结合实际其实很好理解,比如我们用机床造一个零件。我们都知道世界上不存在完美的圆,实际上我们也并不需要完美,但是我们需要保证偏差是可控的,并且在一定的范围内。泰勒公式也是一样,它既可以帮助我们完成近似,也可以保证得到的结果是足够精确的。
二、泰勒公式的定义
我们下面来看看泰勒公式的定义,我们已经知道了它的用途是求一个函数的近似值。但是我们如何去求呢,其实一个比较朴素的思路是通过斜率逼近。
举个例子:
这是一张经典的导数图,从上图我们可以看到,随着
Δ
x
\Delta x
Δx 的减小,点
P
0
P_0
P0 和
P
P
P 也会越来越接近,这就带来了
Δ
y
\Delta y
Δy 越来越接近
Δ
x
⋅
f
′
(
x
0
)
\Delta x \cdot f'(x_0)
Δx⋅f′(x0) 。
当然,当
Δ
x
\Delta x
Δx 比较大的时候显然误差就会比较大,为了缩小误差,我们可以引入二阶导数、三阶导数以及高阶导数。由于我们并不知道函数究竟可以有多少阶导数,我们不妨假设
f
(
x
)
f(x)
f(x) 在区间内一直有
(
n
+
1
)
(n+1)
(n+1) 阶导数,我们试着写出一个多项式来逼近原函数:
P
n
(
x
)
=
a
0
+
a
1
(
x
−
x
0
)
+
a
2
(
x
−
x
0
)
2
+
⋯
+
a
n
(
x
−
x
0
)
n
⋯
①
P_n(x) = a_0 + a_1 (x - x_0) + a_2 (x - x_0)^2 + \cdots + a_n (x - x_0)^n \quad \text{$\cdots$①}
Pn(x)=a0+a1(x−x0)+a2(x−x0)2+⋯+an(x−x0)n⋯①
我们希望这个式子与原值的误差越小越好,究竟要多小才算足够好呢?数学家们给出了定义,希望它是
(
x
−
x
0
)
n
(x - x_0)^n
(x−x0)n 的高阶无穷小。也就是说误差比上
(
x
−
x
0
)
n
(x - x_0)^n
(x−x0)n 的极限是
0
0
0 。
前面已经提到过,我们是通过导数来逼近的,所以我们假设:
P
n
(
x
0
)
=
f
(
x
0
)
,
P
n
′
(
x
0
)
=
f
′
(
x
0
)
P
n
′
′
(
x
0
)
=
f
′
′
(
x
0
)
,
⋯
,
P
n
(
n
)
(
x
0
)
=
f
(
n
)
(
x
0
)
⋯
②
P_n(x_0) = f(x_0), \quad P_n'(x_0) = f'(x_0) \\ P_n''(x_0) = f''(x_0), \; \cdots,\; P_n^{(n)}(x_0) = f^{(n)}(x_0) \quad \text{$\cdots$②}
Pn(x0)=f(x0),Pn′(x0)=f′(x0)Pn′′(x0)=f′′(x0),⋯,Pn(n)(x0)=f(n)(x0)⋯②
按照这个假设我们可以很方便地得到多项式的系数
{
a
0
,
a
1
,
⋯
,
a
n
}
\{a_0, a_1, \cdots, a_n\}
{a0,a1,⋯,an} 了,其实很简单,我们只需将上述式①和式②结合计算便可求得:
a
0
=
f
(
x
0
)
,
1
⋅
a
1
=
f
′
(
x
0
)
2
!
⋅
a
2
=
f
′
′
(
x
0
)
,
⋯
,
n
!
⋅
a
n
=
f
(
n
)
(
x
0
)
⋯
③
a_0 = f(x_0), \quad 1 \cdot a_1 = f'(x_0) \\ 2! \cdot a_2 = f''(x_0), \; \cdots, \; n! \cdot a_n = f^{(n)}(x_0) \quad \text{$\cdots$③}
a0=f(x0),1⋅a1=f′(x0)2!⋅a2=f′′(x0),⋯,n!⋅an=f(n)(x0)⋯③
我们再将式③代入到式①中即可得到:
P
n
(
x
)
=
f
(
x
0
)
+
f
′
(
x
0
)
(
x
−
x
0
)
+
f
′
′
(
x
0
)
2
!
(
x
−
x
0
)
2
+
⋯
+
f
(
n
)
(
x
0
)
n
!
(
x
−
x
0
)
n
P_n(x) = f(x_0) + f'(x_0)(x - x_0) + \frac{f''(x_0)}{2!}(x - x_0)^2 + \cdots + \frac{f^{(n)}(x_0)}{n!}(x - x_0)^n
Pn(x)=f(x0)+f′(x0)(x−x0)+2!f′′(x0)(x−x0)2+⋯+n!f(n)(x0)(x−x0)n
三、泰勒公式的证明
其实上面的式子就是泰勒公式的内涵了,也就是说我们通过高阶导数来逼近了原函数。最后我们只需要证明这个式子就是我们想要的,也就是它的误差足够小。
我们同样用一个函数 R n ( x ) R_n(x) Rn(x) 来表示 P n ( x ) P_n(x) Pn(x) 与原函数 f ( x ) f(x) f(x) 的差值。我们直接比较 P n ( x ) P_n(x) Pn(x) 和 f ( x ) f(x) f(x) 的大小比较困难,所以数学家采取了一系列花里胡哨、叹为观止的操作。
我们带入一下可以发现,
R
n
(
x
0
)
=
0
R_n(x_0) = 0
Rn(x0)=0 ,不仅如此:
R
n
′
(
x
0
)
=
R
n
′
′
(
x
0
)
=
⋯
=
R
n
(
n
)
(
x
0
)
=
0
⋯
④
R_n'(x_0) = R_n''(x_0) = \cdots = R_n^{(n)}(x_0) = 0 \quad \text{$\cdots$④}
Rn′(x0)=Rn′′(x0)=⋯=Rn(n)(x0)=0⋯④
这里我们以
R
n
′
(
x
0
)
=
0
R_n'(x_0) = 0
Rn′(x0)=0 为例进行证明:
R
n
(
x
)
=
P
n
(
x
)
−
f
(
x
)
R_n(x) = P_n(x) - f(x)
Rn(x)=Pn(x)−f(x)
⇒
R
n
′
(
x
)
=
P
n
′
(
x
)
−
f
′
(
x
)
\Rightarrow R_n'(x) = P_n'(x) - f'(x)
⇒Rn′(x)=Pn′(x)−f′(x)
⇒
R
n
′
(
x
)
=
[
f
′
(
x
0
)
+
2
⋅
f
′
′
(
x
0
)
2
!
(
x
−
x
0
)
+
⋯
+
n
⋅
f
(
n
)
(
x
0
)
n
!
(
x
−
x
0
)
n
−
1
]
−
f
′
(
x
)
\Rightarrow R_n'(x) = [f'(x_0) + 2 \cdot \frac{f''(x_0)}{2!}(x - x_0) + \cdots + n \cdot \frac{f^{(n)}(x_0)}{n!}(x - x_0)^{n-1}] - f'(x)
⇒Rn′(x)=[f′(x0)+2⋅2!f′′(x0)(x−x0)+⋯+n⋅n!f(n)(x0)(x−x0)n−1]−f′(x)
⇒
R
n
′
(
x
0
)
=
f
′
(
x
0
)
−
f
′
(
x
0
)
=
0
\Rightarrow R_n'(x_0) = f'(x_0) - f'(x_0) = 0
⇒Rn′(x0)=f′(x0)−f′(x0)=0
证毕。
很明显,因为求导后存在大量的携带有 x − x 0 x - x_0 x−x0 的多项式,当 x = x 0 x = x_0 x=x0 的时候,可以得到式④的结论。
到这里,我们需要进行一个猜测:根据上面的规律,以及我们的目标——证明这个 R n ( x ) R_n(x) Rn(x) 函数是一个关于 ( x − x 0 ) n (x - x_0)^n (x−x0)n 的无穷小,所以我们可以进一步猜测 R n ( x ) R_n(x) Rn(x) 应该是一个与 ( x − x 0 ) n + 1 (x - x_0)^{n+1} (x−x0)n+1 相关的函数。
有了这个猜测之后,我们套用一下柯西中值定理:
f
(
b
)
−
f
(
a
)
F
(
b
)
−
F
(
a
)
=
f
′
(
ξ
)
F
′
(
ξ
)
\frac{f(b) - f(a)}{F(b) - F(a)} = \frac{f'(\xi)}{F'(\xi)}
F(b)−F(a)f(b)−f(a)=F′(ξ)f′(ξ)
我们令
f
(
x
)
=
R
n
(
x
)
,
F
(
x
)
=
(
x
−
x
0
)
n
+
1
f(x) = R_n(x), \; F(x) = (x - x_0)^{n+1}
f(x)=Rn(x),F(x)=(x−x0)n+1 ,套用中值定理可以得到:
R
n
(
x
)
(
x
−
x
0
)
n
+
1
=
R
n
(
x
)
−
0
(
x
−
x
0
)
n
+
1
−
0
=
R
n
(
x
)
−
R
n
(
x
0
)
F
(
x
)
−
F
(
x
0
)
\frac{R_n(x)}{(x - x_0)^{n+1}} = \frac{R_n(x) - 0}{(x - x_0)^{n+1} - 0} = \frac{R_n(x) - R_n(x_0)}{F(x) - F(x_0)} \\
(x−x0)n+1Rn(x)=(x−x0)n+1−0Rn(x)−0=F(x)−F(x0)Rn(x)−Rn(x0)
=
R
′
(
ξ
1
)
F
′
(
ξ
1
)
=
R
n
′
(
ξ
1
)
(
n
+
1
)
(
ξ
1
−
x
0
)
n
,
(
ξ
1
∈
(
x
0
,
x
)
)
= \frac{R'(\xi_1)}{F'(\xi_1)} = \frac{R_n'(\xi_1)}{(n + 1)(\xi_1 - x_0)^n}, \quad (\xi_1 \in (x_0, x))
=F′(ξ1)R′(ξ1)=(n+1)(ξ1−x0)nRn′(ξ1),(ξ1∈(x0,x))
有了这个结论之后,我们再对函数
R
n
′
(
ξ
1
)
R_n'(\xi_1)
Rn′(ξ1) 和
(
n
+
1
)
(
ξ
1
−
x
0
)
n
(n + 1)(\xi_1 - x_0)^n
(n+1)(ξ1−x0)n 在区间
(
x
0
,
ξ
1
)
(x_0, \xi_1)
(x0,ξ1) 上再次应用柯西中值定理:
R
n
′
(
ξ
1
)
(
n
+
1
)
(
ξ
1
−
x
0
)
n
=
R
n
′
(
ξ
1
)
−
0
(
n
+
1
)
(
ξ
1
−
x
0
)
n
−
0
=
R
n
′
(
ξ
1
)
−
R
n
′
(
x
0
)
(
n
+
1
)
(
ξ
1
−
x
0
)
n
−
(
n
+
1
)
(
x
0
−
x
0
)
n
\frac{R_n'(\xi_1)}{(n + 1)(\xi_1 - x_0)^n} = \frac{R_n'(\xi_1) - 0}{(n + 1)(\xi_1 - x_0)^n - 0} = \frac{R_n'(\xi_1) - R_n'(x_0)}{(n + 1)(\xi_1 - x_0)^n - (n + 1)(x_0 - x_0)^n}
(n+1)(ξ1−x0)nRn′(ξ1)=(n+1)(ξ1−x0)n−0Rn′(ξ1)−0=(n+1)(ξ1−x0)n−(n+1)(x0−x0)nRn′(ξ1)−Rn′(x0)
=
R
n
′
′
(
ξ
2
)
n
(
n
+
1
)
(
ξ
2
−
x
0
)
n
−
1
,
(
ξ
2
∈
(
x
0
,
ξ
1
)
)
= \frac{R_n''(\xi_2)}{n(n + 1)(\xi_2 - x_0)^{n-1}}, \quad (\xi_2 \in (x_0, \xi_1))
=n(n+1)(ξ2−x0)n−1Rn′′(ξ2),(ξ2∈(x0,ξ1))
接下来就是熟悉的套娃环节了,经过一共
n
+
1
n+1
n+1 次套娃之后,我们可以得到:
R
n
(
x
)
(
x
−
x
0
)
n
+
1
=
R
n
(
n
+
1
)
(
ξ
)
(
n
+
1
)
!
,
(
ξ
∈
(
x
0
,
ξ
n
)
)
⋯
⑤
\frac{R_n(x)}{(x - x_0)^{n+1}} = \frac{R_n^{(n+1)}(\xi)}{(n+1)!}, \quad (\xi \in (x_0, \xi_n)) \quad \text{$\cdots$⑤}
(x−x0)n+1Rn(x)=(n+1)!Rn(n+1)(ξ),(ξ∈(x0,ξn))⋯⑤
我们对
P
n
(
x
)
P_n(x)
Pn(x) 求
n
+
1
n+1
n+1 次导数,可以得到
0
0
0 ,因为所有项最高次项只有
n
n
n 次,求
n
+
1
n+1
n+1 次导数之后全部变成
0
0
0 。也就是说
P
n
(
n
+
1
)
(
x
)
=
0
P_n^{(n+1)}(x) = 0
Pn(n+1)(x)=0 ,所以
R
n
(
n
+
1
)
(
x
)
=
f
(
n
+
1
)
(
x
)
R_n^{(n+1)}(x) = f^{(n+1)}(x)
Rn(n+1)(x)=f(n+1)(x) ,我们把这项代入到式⑤中,即可得到:
R
n
(
x
)
=
f
(
n
+
1
)
(
ξ
)
(
n
+
1
)
!
(
x
−
x
0
)
n
+
1
,
(
ξ
∈
(
x
0
,
x
)
)
R_n(x) = \frac{f^{(n+1)}(\xi)}{(n+1)!} (x - x_0)^{n+1}, \quad (\xi \in (x_0, x))
Rn(x)=(n+1)!f(n+1)(ξ)(x−x0)n+1,(ξ∈(x0,x))
四、误差的证明
接下来我们要证明这个误差 R n ( x ) R_n(x) Rn(x) 是 ( x − x 0 ) n (x - x_0)^{n} (x−x0)n 的高阶无穷小。
到这里,证明就很简单了,在固定的区间 ( a , b ) (a, b) (a,b) 中,很明显函数 f ( n + 1 ) ( x ) f^{(n+1)}(x) f(n+1)(x) 存在最大值,我们假设这个最大值是 M M M 。也就是说 f ( n + 1 ) ( x ) ≤ M , x ∈ ( a , b ) f^{(n+1)}(x) \leq M, \; x \in (a, b) f(n+1)(x)≤M,x∈(a,b) 。
那么:
lim
x
→
x
0
R
n
(
x
)
(
x
−
x
0
)
n
≤
lim
x
→
x
0
M
(
n
+
1
)
!
(
x
−
x
0
)
n
+
1
(
x
−
x
0
)
n
=
lim
x
→
x
0
M
(
x
−
x
0
)
(
n
+
1
)
!
\lim_{x \rightarrow x_0} \frac{R_n(x)}{(x-x_0)^n} \leq \lim_{x \rightarrow x_0} \frac{\frac{M}{(n+1)!} (x - x_0)^{n+1}}{(x-x_0)^n} = \lim_{x \rightarrow x_0} \frac{M(x - x_0)}{(n+1)!}
x→x0lim(x−x0)nRn(x)≤x→x0lim(x−x0)n(n+1)!M(x−x0)n+1=x→x0lim(n+1)!M(x−x0)
由于
x
x
x 逼近
x
0
x_0
x0 ,
M
M
M 是一个常数,所以这个极限趋向于
0
0
0 ,我们可以用极限的定义很容易证明。于是我们证明了,误差
R
n
(
x
)
R_n(x)
Rn(x) 是比
(
x
−
x
0
)
n
+
1
(x - x_0)^{n + 1}
(x−x0)n+1 更高阶的无穷小。
所以我们可以得到:
f
(
x
)
=
f
(
x
0
)
+
f
′
(
x
0
)
(
x
−
x
0
)
+
f
′
′
(
x
0
)
2
!
(
x
−
x
0
)
2
+
⋯
+
f
(
n
)
(
x
0
)
n
!
(
x
−
x
0
)
n
+
R
n
(
x
)
f(x) = f(x_0) + f'(x_0)(x - x_0) + \frac{f''(x_0)}{2!}(x - x_0)^2 + \cdots + \frac{f^{(n)}(x_0)}{n!}(x - x_0)^n + R_n(x)
f(x)=f(x0)+f′(x0)(x−x0)+2!f′′(x0)(x−x0)2+⋯+n!f(n)(x0)(x−x0)n+Rn(x)
由于我们一共用到了
n
n
n 阶导数来表达原函数,所以我们称为这是原函数
f
(
x
)
f(x)
f(x) 的
n
n
n 阶泰勒展开。最后的:
R
n
(
x
)
=
f
(
n
+
1
)
(
ξ
)
(
n
+
1
)
!
(
x
−
x
0
)
n
+
1
,
(
ξ
∈
(
x
0
,
x
)
)
R_n(x) = \frac{f^{(n+1)}(\xi)}{(n+1)!} (x - x_0)^{n+1}, \quad (\xi \in (x_0, x))
Rn(x)=(n+1)!f(n+1)(ξ)(x−x0)n+1,(ξ∈(x0,x))
我们称它为拉格朗日余项。我们也可以简写为
o
[
(
x
−
x
0
)
n
]
o[(x - x_0)^n]
o[(x−x0)n] ,它称为佩亚诺型余项,其实和拉格朗日余项是一回事,只是写的形式不同。
我们如果令
x
0
=
0
x_0 = 0
x0=0 的话,还可以将式子进一步化简。由于
ξ
∈
(
0
,
1
)
\xi \in (0, 1)
ξ∈(0,1) ,所以我们可以令
ξ
=
θ
x
,
(
0
<
θ
<
1
)
\xi = \theta x, \; (0 \lt \theta \lt 1)
ξ=θx,(0<θ<1) ,原公式可以写成:
f
(
x
)
=
f
(
0
)
+
f
′
(
0
)
x
+
f
′
′
(
0
)
2
!
x
2
+
⋯
+
f
(
n
)
(
0
)
n
!
x
n
+
f
(
n
+
1
)
(
θ
x
)
(
n
+
1
)
!
x
n
+
1
,
(
0
<
θ
<
1
)
f(x) = f(0) + f'(0)x + \frac{f''(0)}{2!}x^2 + \cdots + \frac{f^{(n)}(0)}{n!}x^n + \frac{f^{(n+1)}(\theta x)}{(n+1)!} x^{n+1}, \quad (0 \lt \theta \lt 1)
f(x)=f(0)+f′(0)x+2!f′′(0)x2+⋯+n!f(n)(0)xn+(n+1)!f(n+1)(θx)xn+1,(0<θ<1)
和上面的式子相比,这个式子要简单许多,它也有一个名字,叫做麦克劳林公式。在麦克劳林公式下的佩亚诺余项写成
o
(
x
n
)
o(x^n)
o(xn) ,看起来也非常简单。
如果觉得上面的式子有点多记不过来可以忽略原式,只需要记住麦克劳林公式即可。对于拉格朗日余项,我们也只会在计算误差的时候用到,在不需要考虑误差的场景下也可以忽略。
五、实例
下面我们来看一个实际的例子,来感受一下泰勒公式的强大。
我们都知道有一些函数的值我们很难直接计算,比如 f ( x ) = e x f(x) = e^x f(x)=ex ,和正弦余弦函数等。由于 e e e 本身就是一个无理数,有没有想过我们怎么来求一个带 e e e 的函数值?其实很多时候,就是用的泰勒公式。
我们就用 f ( x ) = e x f(x) = e^x f(x)=ex 举例,看看怎么利用泰勒公式来计算 e x e^x ex 。
为了简化计算,我们显然考虑麦克劳林公式。由于 x = 0 x = 0 x=0 时, e x = 1 e^x=1 ex=1 ,并且 f ′ ( x ) = e x f'(x) = e^x f′(x)=ex 。
所以我们可以得到:
f
′
(
0
)
=
f
′
′
(
0
)
=
f
′
′
′
(
0
)
=
⋯
=
f
(
n
)
(
0
)
=
1
f'(0) = f''(0) = f'''(0) = \cdots = f^{(n)}(0) = 1
f′(0)=f′′(0)=f′′′(0)=⋯=f(n)(0)=1
代入泰勒公式,可以得到:
e
x
=
1
+
x
+
1
2
!
x
2
+
1
3
!
x
3
+
⋯
+
1
n
!
x
n
+
e
θ
x
(
n
+
1
)
!
x
n
+
1
e^x = 1 + x + \frac{1}{2!} x^2 + \frac{1}{3!} x^3 + \cdots + \frac{1}{n!} x^n + \frac{e^{\theta x}}{(n+1)!} x^{n+1}
ex=1+x+2!1x2+3!1x3+⋯+n!1xn+(n+1)!eθxxn+1
我们如果把最后一项当成误差,那么可以得到:
e
x
≈
1
+
x
+
1
2
!
x
2
+
1
3
!
x
3
+
⋯
+
1
n
!
x
n
e^x \approx 1 + x + \frac{1}{2!} x^2 + \frac{1}{3!} x^3 + \cdots + \frac{1}{n!} x^n
ex≈1+x+2!1x2+3!1x3+⋯+n!1xn
当
n
=
10
,
x
=
1
n = 10, \; x = 1
n=10,x=1 时,产生的误差为:
e
θ
x
(
n
+
1
)
!
x
n
+
1
≤
e
11
!
<
3
11
!
\frac{e^{\theta x}}{(n+1)!} x^{n+1} \leq \frac{e}{11!} \lt \frac{3}{11!}
(n+1)!eθxxn+1≤11!e<11!3
我们稍微算一下就可以知道,这个误差小于
1
0
−
6
10^{-6}
10−6 ,已经足够接近了。也就是说我们把原本不太好计算的函数转化成了若干个多项式的和,可以非常简单地获得一个足够接近的近似值。并且除此之外,我们还能算出它的最大误差,实在是太完美了。
六、一些思考
到这里还没有结束,看完所有的推导和计算之后,不知道你们有没有一个疑惑,这么一个牛叉并且复杂并且有用的公式,泰勒是如何能够想到的呢?好像用一时的灵感很难解释。毕竟人的灵感往往都是一瞬间对某个点的顿悟,而这么多公式和结论是很难顿悟的。
之前上学的时候我完全没有意识到这个问题,这次重温的时候才觉得不对。当然你可能会说这里有这么多数学家的名字,这显然不是一个人的功劳。但即使是这样,我仍然好奇,这么伟大的公式是在多么的因缘巧合之下被人类给发明出来的?
我们设想一个问题,如果 f ( x ) = g ( x ) f(x)=g(x) f(x)=g(x) ,那么显然 f ( x ) f(x) f(x) 和 g ( x ) g(x) g(x) 的各阶导数全都相等。那么问题来了,如果我们人为地构造一个函数 h ( x ) h(x) h(x) ,使得它的各阶导数和 g ( x ) g(x) g(x) 吻合,那么是不是可以认为这个我们人为构造出来的函数也和 g ( x ) g(x) g(x) 相等呢?
然而有些函数的高阶导数是无穷无尽的,我们不可能人工全部拟合,所以只能退而求其次,拟合其中的 n n n 项。显然这样做会存在误差,那么我们需要知道这个误差的大小。于是就有了后面的拉格朗日余项大小的推算。
泰勒公式的出现和推导过程正是基于这样的思路应运而生的,想到这里,如果我们把各阶导数的项看成是特征数据,那么这个问题就转化成了机器学习当中的回归问题,只不过在机器学习当中我们是设定了优化目标和优化方法,让模型自行训练来拟合逼近,而泰勒公式其实是通过思维和数学的力量推算出了结果,两者的目的和结果是一样的,但是过程完全迥异,两个看似完全风马牛不相及的问题殊途同归,不得不说数学的魅力真的很是令人折服。