泰勒级数

把线性近似继续做下去:用各阶导数在一点的值造出一串多项式,越加越贴合原函数。eˣ、sin x 因此都能写成多项式的极限。

10 分钟思维方法: 换表示

同一个对象换一种写法,难题可能自动变简单

这一片为什么存在

你按计算器算 sin 1,机器其实并不会算正弦——它只会加、减、乘、除。这一片要回答的是:只有四则运算,怎么把 e、sin、ln 的值算出来。切线近似已经给了第一步答案,但它只在一点附近管用。泰勒级数就是把那一步一直做下去得到的东西,以及为此要付的代价。

内容

先看你已经会的那一步。在 a 点给 f 作切线,得到 f(a)+f′(a)(x−a)。这条直线做对了两件事:在 a 点取的值和 f 一样,在 a 点的斜率也和 f 一样。它错在哪儿?它不知道 f 在弯。sin x 在 0 附近是往下弯的,而 y=x 一直笔直往上走,所以 x 稍微大一点,误差就撑不住了。

补救的想法很朴素:既然差在弯,就再加一项,让新的多项式在 a 点的二阶导数也和 f 对上。对完二阶你会发现还差三阶,那就再加一项。每加一项,你就多交出函数在 a 这一点的一条信息。泰勒的全部动机就在这里——把“f 在 a 处的第 n 阶导数”一条条塞进多项式里,塞到你满意为止。

那为什么第 n 项长成 f⁽ⁿ⁾(a)/n!·(x−a)ⁿ,n! 是从哪冒出来的?它不是凑的,是解出来的。(x−a)ⁿ 求 n 次导恰好得到 n!,求不满 n 次时在 x=a 处为 0,求超过 n 次就直接变成 0。所以除掉 n! 之后,每一项只负责它自己那一阶导数,完全不打扰前面已经对好的部分。你想让第 n 阶导对上,系数就只能是这个值。

到这里有个特别容易滑过去的坑。你造出来的其实是一串多项式 P₁, P₂, P₃, …,每一个都只是在 a 附近像 f。让项数趋于无穷得到的级数,是这串多项式的极限,不是 f 换了个写法。它可能只在某个半径内收敛;也可能处处收敛,但收敛到的东西并不是 f。“级数等于原函数”是要证的结论,不是定义白送的。

还有一件事:展开点 a 是这套东西的地基。所有系数只用到 f 在 a 这一点的信息,所以近似好不好,是按“离 a 有多远”来算的,不是只按“取了多少项”来算的。ln x 在 x=1 处展开很自然,在 x=0 处则根本无从下手,因为 ln 在那里连值都没有。

最后说说为什么值得这么折腾。多项式是我们唯一真正会算的函数:加、减、乘,外加一个除。把 eˣ 换成 1+x+x²/2+x³/6+… 之后,“求 e 的值”就变成“把几个分数加起来”。换来的好处不止算数值:想知道 x→0 时两个函数谁跑得快,比一下各自第一个不为零的项就够了;想求 sin x / x 在 0 处的极限,把分子换成级数、约掉一个 x,答案是 1,一眼就看见。函数一点没变,变的是你手上的表示。

设 f 在 a 的某个邻域上有任意阶导数。f 在 a 处的 n 阶泰勒多项式定义为 Pₙ(x) = Σ(k=0..n) f⁽ᵏ⁾(a)/k! ·(x−a)ᵏ。

符号逐个交代:f⁽ᵏ⁾(a) 是 f 的 k 阶导数在 a 处取的值,它是一个数,不是函数;k! 是 k 的阶乘;(x−a)ᵏ 表示所有信息都相对展开点 a 记录;约定 0!=1、f⁽⁰⁾=f,所以 k=0 那一项就是 f(a)。

把上限 n 换成 ∞,得到 f 在 a 处的泰勒级数 Σ(k=0..∞) f⁽ᵏ⁾(a)/k! ·(x−a)ᵏ;a=0 时习惯称它为麦克劳林级数。

两者不是一回事。Pₙ 是有限和,对任何 x 都算得出值;级数是部分和序列 Pₙ(x) 的极限,只在收敛的那些 x 上才有值,范围大小由收敛半径 R 描述。

把它们连起来的是余项 Rₙ(x) = f(x) − Pₙ(x)。拉格朗日形式说:存在夹在 a 与 x 之间的某个 ξ,使 Rₙ(x) = f⁽ⁿ⁺¹⁾(ξ)/(n+1)! ·(x−a)ⁿ⁺¹。

于是“级数在 x 处收敛到 f(x)”等价于该点的 Rₙ(x)→0。收敛半径管的是级数有没有值,余项管的是那个值到底是不是 f。

跟着做一遍

不查表、不按计算器上的 sin 键,只用加减乘除算出 sin 0.5;并且在核对真值之前就说清楚:你的答案能保证精确到第几位小数?

  1. 在 a=0 展开。sin 的导数是循环的:sin→cos→−sin→−cos→sin,在 0 处依次取值 0, 1, 0, −1,然后重复。
  2. 代进系数 f⁽ᵏ⁾(0)/k!:偶数阶导数在 0 处全是 0,于是偶次项整体消失,只剩奇次项,系数为 ±1/k!。写到五次:P₅(x) = x − x³/6 + x⁵/120。
  3. 取 x=0.5,先把幂算出来:x=0.5,x³=0.125,x⁵=0.03125。
  4. 相加:0.5 − 0.125/6 + 0.03125/120 = 0.5 − 0.0208333 + 0.0002604 = 0.4794271。
  5. 现在卡误差,用拉格朗日余项:R₅(0.5) = f⁽⁶⁾(ξ)/6! ·0.5⁶,其中 f⁽⁶⁾ = −sin,而不管 ξ 是多少都有 |−sin ξ| ≤ 1。
  6. 所以 |R₅(0.5)| ≤ 0.5⁶/720 = 0.015625/720 ≈ 2.2×10⁻⁵。这一步才是关键:你在还不知道真值的时候,就已经知道自己最多错多少。
  7. 再去对真值 sin 0.5 = 0.4794255…,实际误差约 1.5×10⁻⁶,确实落在刚才的上界之内。
  8. 换展开点重做一遍:在 a=π/2 展开,记 h = x−π/2 = −1.0708,同样只保留三个非零项,得 1 − h²/2 + h⁴/24 ≈ 0.48148,误差约 2×10⁻³。同一个函数、同样的项数,只因为展开点离 0.5 更远,误差就差了三个数量级。

结果

P₅(0.5)=0.4794271,事先给出的误差上界 2.2×10⁻⁵,实际误差 1.5×10⁻⁶,真值 0.4794255。只用加减乘除就把正弦算了出来,而且知道自己错在什么范围内。而在 π/2 处展开、项数完全相同时误差约 2×10⁻³:精度由“离展开点多远”和“取了几项”共同决定,多取几项救不了一个选错的展开点。

它在树上的位置

概念不是一篇一篇平铺的。下面两组是这一片真实的上下游:它靠着什么,又撑起了什么。

读完之后

这一页是产品里的一天。产品是那棵树:你学到哪、哪块在衰减、明天该学什么。一篇读物回答不了这三个问题,树才回答。

看看那是什么意思