Featured image of post 泰勒展开与麦克劳林展开:用多项式近似复杂函数的魔法

泰勒展开与麦克劳林展开:用多项式近似复杂函数的魔法

详细讲解微积分的秘诀——泰勒展开和麦克劳林展开,从直观含义到数学推导,再到编程和物理学中的应用。

引言

泰勒多项式通过使某一点的函数值及有限阶导数相匹配,来近似该点附近的函数。把这些导数所确定的系数写成无穷和,就得到泰勒级数;展开中心为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\) 的情况。

  1. 函数值条件:\(P_n(0)=f(0)\),因此 \(c_0=f(0)\)。常数项使0处的函数值相匹配。
  2. 一阶导数条件:\(P_n'(0)=f'(0)\),因此 \(c_1=f'(0)\)。\(P_1(x)=f(0)+f'(0)x\) 是0处的切线近似。
  3. 二阶导数条件:要求 \(P_n''(0)=f''(0)\)。由于 \(P_n''(0)=2c_2\),故 \(c_2=f''(0)/2!\)。对于含有高次项的一般 \(P_n\),整个 \(P_n''(x)\) 并不恒等于常数 \(2c_2\)。
  4. 一般条件:对 \(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\))累加少量项的教学示例,并不是对标准库内部实现的复现。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import math

def approx_sin(x, terms=10):
    """
    在0附近计算 sin(x) 的有限麦克劳林和的教学函数
    x: 以弧度为单位的角度
    terms: 累加的项数(正整数,本例为10项)
    """
    result = 0.0
    for n in range(terms):
        # 计算每一项: (-1)^n * x^(2n+1) / (2n+1)!
        sign = (-1) ** n
        numerator = x ** (2 * n + 1)
        denominator = math.factorial(2 * n + 1)
        result += sign * (numerator / denominator)
    return result

# 测试: x = 1.0 弧度 (约 57.3 度)
x_val = 1.0
print(f"近似值: {approx_sin(x_val)}")
print(f"math.sin 的值(供比较): {math.sin(x_val)}")

收敛半径与泰勒定理

收敛半径 \(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\),级数之和并不等于原函数。这个例子说明,必须区分“级数收敛”和“级数之和等于原函数”。

结论

泰勒多项式给出局部近似,余项则估计近似误差。将泰勒级数作为等式使用时,需要检查收敛范围及其和是否等于原函数。理解这些区别,有助于在物理和数值计算中判断近似的适用范围和所需精度。

参考资料

comments powered by Disqus