引言
泰勒多项式通过使某一点的函数值及有限阶导数相匹配,来近似该点附近的函数。把这些导数所确定的系数写成无穷和,就得到泰勒级数;展开中心为0时,称为麦克劳林级数。级数是否收敛,以及其和是否等于原函数,需要分别确认。
本文以指数函数和三角函数的近似为例,说明系数的确定方法、展开式成立的条件,以及有限项截断后的误差。最后给出一个用 Python 近似计算0附近 \(\sin x\) 的教学示例。
为什么要用多项式来近似函数?
首先,为什么有必要将一个函数表示为多项式( \(a + bx + cx^2 + \dots\) )呢?
flowchart LR
A["在展开中心附近解析的函数"] -->|"收敛范围内的泰勒展开"| B["幂级数"]
B -->|"有限项截断"| C["多项式近似"]
C -->|"仅基本算术运算"| D["高速计算机计算"]
用多项式近似非线性函数,有时可以简化求值、求导和积分。系数确定后,多项式可用加法和乘法求值。但近似在哪个范围内有效、精度如何,需要根据余项及数值计算误差来判断。
麦克劳林展开的直观理解
首先考虑在 \(x=0\) 附近近似函数的麦克劳林展开。 假设函数 \(f\) 在0附近具有所需阶数的导数。选定有限次数 \(n\),确定下面多项式 \(P_n\) 的系数:
\[ P_n(x) = c_0 + c_1 x + c_2 x^2 + \dots + c_n x^n \]通过匹配0处的函数值和各阶导数来确定系数。以下二阶条件适用于 \(n\ge2\) 的情况。
- 函数值条件:\(P_n(0)=f(0)\),因此 \(c_0=f(0)\)。常数项使0处的函数值相匹配。
- 一阶导数条件:\(P_n'(0)=f'(0)\),因此 \(c_1=f'(0)\)。\(P_1(x)=f(0)+f'(0)x\) 是0处的切线近似。
- 二阶导数条件:要求 \(P_n''(0)=f''(0)\)。由于 \(P_n''(0)=2c_2\),故 \(c_2=f''(0)/2!\)。对于含有高次项的一般 \(P_n\),整个 \(P_n''(x)\) 并不恒等于常数 \(2c_2\)。
- 一般条件:对 \(k\le n\),要求 \(P_n^{(k)}(0)=f^{(k)}(0)\),即可确定 \(c_k=f^{(k)}(0)/k!\)。中心附近的误差由下文的余项估计。
麦克劳林展开的公式与推导
若 \(f\) 无限次可微,就可以用这些系数构造麦克劳林级数。不过,要像下式一样与原函数 \(f(x)\) 用等号连接,级数必须在该点收敛到 \(f(x)\)。例如,函数在0附近解析时,等式在适当的邻域内成立。仅有无限次可微还不够。
\[ f(x) = f(0) + f'(0)x + \frac{f''(0)}{2!}x^2 + \frac{f^{(3)}(0)}{3!}x^3 + \dots \]用求和记号可写为:
\[ f(x) = \sum_{n=0}^{\infty} \frac{f^{(n)}(0)}{n!} x^n \]这里, \(f^{(n)}(0)\) 是函数 \(f(x)\) 求导 \(n\) 次并代入 \(x=0\) 得到的值,而 \(n!\) 表示 \(n\) 的阶乘( \(n \times (n-1) \times \dots \times 1\) )。
典型函数的麦克劳林展开
下面的指数函数、正弦和余弦级数在所有实数 \(x\) 处都收敛到相应的函数。三角函数的自变量用弧度表示。
1. 指数函数 \(e^x\)
指数函数 \(f(x) = e^x\) 无论求导多少次,仍然是 \(e^x\)。因此,各阶导数在0处的值都为 \(1\)( \(f^{(n)}(0) = 1\) )。
\[ e^x = 1 + x + \frac{x^2}{2!} + \frac{x^3}{3!} + \dots = \sum_{n=0}^{\infty} \frac{x^n}{n!} \]2. 三角函数 \(\sin x\) 和 \(\cos x\)
当 \(\sin x\) 被反复求导时,它会循环变化: \(\cos x, -\sin x, -\cos x, \sin x, \dots\)。代入 \(x=0\) 后,只有奇数阶导数的值非零,偶数阶导数的值为 \(0\)。
\[ \sin x = x - \frac{x^3}{3!} + \frac{x^5}{5!} - \frac{x^7}{7!} + \dots = \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n+1)!} x^{2n+1} \]同样,对于 \(\cos x\),只有偶数阶的项保留下来。
\[ \cos x = 1 - \frac{x^2}{2!} + \frac{x^4}{4!} - \frac{x^6}{6!} + \dots = \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n)!} x^{2n} \]推广到泰勒展开
将展开中心从0移到 \(a\),便得到泰勒级数。若 \(f\) 在 \(a\) 附近解析,则在级数表示原函数的范围内,下式成立。只假设有限阶可微的近似,则用下文的有限泰勒多项式和余项来处理。
\[ f(x) = f(a) + f'(a)(x-a) + \frac{f''(a)}{2!}(x-a)^2 + \dots = \sum_{n=0}^{\infty} \frac{f^{(n)}(a)}{n!} (x-a)^n \]当你想要预测在距离 \(x=a\) 稍微有一段距离的位置( \(x = a + \Delta x\) )的函数值时,这个公式就显示出了它的威力。
泰勒展开的应用
物理学中的线性近似
物理学中经常使用泰勒多项式进行线性近似。对于单摆,将角度 \(\theta\) 用弧度表示,并假设 \(|\theta|\ll1\),就可采用正弦函数的一阶近似:
\[ \sin \theta \approx \theta \quad (\text{当 } \theta \text{ 足够小时}) \]这一近似使单摆方程线性化,并在小振幅近似下得到周期与振幅无关的等时性。实际单摆的周期会随振幅变化,不能将相同近似直接用于大振幅摆动。
编程与数值计算
函数的数值求值可以采用多项式近似等多种方法。CPython 的 math 模块主要调用平台的 C 数学库,具体算法取决于实现。下面是一个在0附近(例如 \(|x|\le1\))累加少量项的教学示例,并不是对标准库内部实现的复现。
| |
收敛半径与泰勒定理
收敛半径 \(R\) 是一个数,表示幂级数在距中心 \(a\) 满足 \(|x-a|<R\) 的范围内收敛,而不是区间本身的名称。\(R=0\) 和 \(R=\infty\) 也可能出现。端点 \(|x-a|=R\) 需要另行检查。例如,\(\ln(1+x)\) 的麦克劳林级数收敛半径为1,在实数范围 \(-1<x\le1\) 上等于原函数;在 \(x=1\) 处条件收敛,在 \(x=-1\) 处发散。
对于有限的近似,假设 \(f\) 在连接 \(a\) 和 \(x\) 的区间上属于 \(C^{n+1}\) 类,则泰勒定理给出:
\[ f(x)=P_{n,a}(x)+R_n(x),\qquad P_{n,a}(x)=\sum_{k=0}^{n}\frac{f^{(k)}(a)}{k!}(x-a)^k \]\[ R_n(x)=\frac{f^{(n+1)}(\xi)}{(n+1)!}(x-a)^{n+1} \]其中 \(\xi\) 位于 \(a\) 与 \(x\) 之间。若区间上 \(|f^{(n+1)}|\le M\),则 \(|R_n(x)|\le M|x-a|^{n+1}/(n+1)!\)。要证明函数等于其无穷泰勒级数,可以验证这个余项在 \(n\to\infty\) 时趋于0。
上述代码累加10项,即到 \(x^{19}\) 为止。正弦级数的20次项系数为0,因此泰勒定理给出 \(x=1\) 时截断误差不超过 \(1/21!\),约为 \(1.96\times10^{-20}\)。这指的是用实数精确计算有限和时的误差;Python 浮点运算的舍入误差需要另行考虑。math.sin 的输出也是供比较的浮点值,并非数学上的精确真值。
光滑函数的级数也可能不表示原函数
\[ g(x)=\begin{cases}e^{-1/x},&x>0,\\0,&x\le0.\end{cases} \]该函数无限次可微,且在0处的各阶导数都为0。因此,它在0处的泰勒级数恒为0,对所有 \(x\) 都收敛。但在 \(x>0\) 时,\(g(x)>0\),级数之和并不等于原函数。这个例子说明,必须区分“级数收敛”和“级数之和等于原函数”。
结论
泰勒多项式给出局部近似,余项则估计近似误差。将泰勒级数作为等式使用时,需要检查收敛范围及其和是否等于原函数。理解这些区别,有助于在物理和数值计算中判断近似的适用范围和所需精度。
