核心直觉: 泰勒公式用函数在展开点处的函数值、斜率、曲率以及更高阶变化,构造一个局部行为尽可能相同的多项式。
复杂函数可能难以直接计算或分析,但多项式只包含加法、乘法和乘方,求值、求导、积分都很方便。泰勒公式因此建立了一座桥:把函数在某一点附近的问题,转化为多项式问题。
从局部多项式逼近开始
设函数 $f(x)$ 在 $x=a$ 附近足够光滑。我们希望用一个 $n$ 次多项式
$$ P_n(x)=c_0+c_1(x-a)+c_2(x-a)^2+\cdots+c_n(x-a)^n $$
近似 $f(x)$。
为什么使用 $(x-a)$ 的幂,而不是直接使用 $x$ 的幂?因为我们关心的是函数在 $a$ 附近的局部行为。当 $x$ 接近 $a$ 时,$x-a$ 是一个小量;次数越高的项通常越小,也越适合描述更精细的修正。
为了让 $P_n(x)$ 与 $f(x)$ 在 $a$ 附近尽可能相似,我们要求它们在展开点处的各阶导数一致:
$$ P_n(a)=f(a),\quad P_n’(a)=f’(a),\quad \ldots,\quad P_n^{(n)}(a)=f^{(n)}(a). $$
这些条件依次匹配了函数值、斜率、曲率以及更高阶的局部变化。
为什么系数中会出现阶乘
泰勒公式中的 $n!$ 不是人为规定的,而是连续求导自然产生的。
常数项
令 $x=a$,所有包含 $(x-a)$ 的项都变为 0:
$$ P_n(a)=c_0. $$
由 $P_n(a)=f(a)$ 得到:
$$ c_0=f(a). $$
一次项
对 $P_n(x)$ 求一次导数:
$$ P_n’(x)=c_1+2c_2(x-a)+3c_3(x-a)^2+\cdots. $$
令 $x=a$,除 $c_1$ 外的项全部消失,因此:
$$ c_1=P_n’(a)=f’(a). $$
二次项
再求一次导数并令 $x=a$:
$$ P_n’’(a)=2c_2, $$
所以:
$$ c_2=\frac{f’’(a)}{2}=\frac{f’’(a)}{2!}. $$
一般的 $n$ 次项
对 $c_n(x-a)^n$ 连续求 $n$ 次导数,指数会依次乘下来:
$$ n(n-1)(n-2)\cdots 2\cdot 1=n!. $$
而次数低于 $n$ 的项在求 $n$ 次导数后已经变为 0,次数高于 $n$ 的项在 $x=a$ 时仍含有 $(x-a)$。于是:
$$ P_n^{(n)}(a)=n!c_n=f^{(n)}(a), $$
最终得到:
$$ c_n=\frac{f^{(n)}(a)}{n!}. $$
泰勒多项式、泰勒公式与泰勒级数
代入刚才得到的系数,$f(x)$ 的 $n$ 阶泰勒多项式为:
$$ P_n(x)=\sum_{k=0}^{n}\frac{f^{(k)}(a)}{k!}(x-a)^k. $$
只写多项式近似还不完整。泰勒公式应包含余项:
$$ f(x)=\sum_{k=0}^{n}\frac{f^{(k)}(a)}{k!}(x-a)^k+R_n(x). $$
$R_n(x)$ 表示截断到 $n$ 次后没有写出的误差。把次数无限增加,形式上得到泰勒级数:
$$ \sum_{k=0}^{\infty}\frac{f^{(k)}(a)}{k!}(x-a)^k. $$
这里必须区分三个概念:
- 泰勒多项式是有限项多项式 $P_n(x)$;
- 泰勒公式是 $f(x)=P_n(x)+R_n(x)$,明确保留误差;
- 泰勒级数是无限级数,只有在级数收敛且余项趋于 0 时才等于原函数。
当展开点是 $a=0$ 时,泰勒展开称为麦克劳林展开:
$$ f(x)=f(0)+f’(0)x+\frac{f’’(0)}{2!}x^2+\cdots. $$
余项如何控制近似误差
常用的拉格朗日余项写作:
$$ R_n(x)=\frac{f^{(n+1)}(\xi)}{(n+1)!}(x-a)^{n+1}, $$
其中 $\xi$ 位于 $a$ 与 $x$ 之间。
如果在这段区间上满足
$$ \left|f^{(n+1)}(t)\right|\le M, $$
那么可以得到误差上界:
$$ |R_n(x)|\le \frac{M}{(n+1)!}|x-a|^{n+1}. $$
这个式子给出两个直接结论:
- $x$ 越接近展开点 $a$,局部近似通常越准确;
- 在导数可控时,提高展开阶数通常会继续减小误差。
在只关心 $x\to a$ 时的阶数关系时,也常使用佩亚诺余项:
$$ f(x)=\sum_{k=0}^{n}\frac{f^{(k)}(a)}{k!}(x-a)^k+o!\left((x-a)^n\right). $$
它适合处理极限和无穷小比较,但不像拉格朗日余项那样直接给出一个数值误差上界。
常见的麦克劳林展开
下面几组展开式经常作为计算的基础模块。
指数函数
$$ e^x=1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\cdots, \qquad x\in\mathbb{R}. $$
正弦与余弦
$$ \sin x=x-\frac{x^3}{3!}+\frac{x^5}{5!}-\cdots, $$
$$ \cos x=1-\frac{x^2}{2!}+\frac{x^4}{4!}-\cdots. $$
这两个级数对所有实数 $x$ 都收敛到原函数。
几何级数
$$ \frac{1}{1-x}=1+x+x^2+x^3+\cdots, \qquad |x|<1. $$
对数函数
$$ \ln(1+x)=x-\frac{x^2}{2}+\frac{x^3}{3}-\frac{x^4}{4}+\cdots, \qquad |x|<1. $$
收敛区间是公式的一部分,不能只记右侧的多项式形式。
应用一:近似计算
用 $e^x$ 在 $0$ 点的三阶泰勒多项式估算 $e^{0.1}$:
$$ e^{0.1}\approx 1+0.1+\frac{0.1^2}{2}+\frac{0.1^3}{6} =1.105166\overline{6}. $$
真实值约为 $1.105170918$。对三阶截断,拉格朗日余项满足:
$$ |R_3(0.1)| \le \frac{e^{0.1}}{4!}(0.1)^4 <4.61\times 10^{-6}. $$
这说明泰勒公式不仅给出近似值,还能说明近似究竟有多可靠。
应用二:计算极限
考虑极限:
$$ \lim_{x\to 0}\frac{\sin x-x}{x^3}. $$
利用
$$ \sin x=x-\frac{x^3}{6}+o(x^3), $$
代入后得到:
$$ \frac{\sin x-x}{x^3} =\frac{-x^3/6+o(x^3)}{x^3} \to -\frac{1}{6}. $$
关键是展开到分子中第一个不会相互抵消的非零项。展开阶数不足得不到结果,展开过多则增加无用计算。
应用三:判断无穷小的阶
当 $x\to 0$ 时:
$$ e^x-1-x=\frac{x^2}{2}+o(x^2). $$
因此 $e^x-1-x$ 是二阶无穷小,并且:
$$ e^x-1-x\sim \frac{x^2}{2}. $$
泰勒展开把“谁趋近于 0 更快”转化成比较首个非零项的次数和系数。
应用四:研究函数的局部性质
在 $x=a$ 附近,二阶近似为:
$$ f(x)\approx f(a)+f’(a)(x-a)+\frac{f’’(a)}{2}(x-a)^2. $$
各项具有清晰的几何意义:
- $f(a)$ 决定展开点的高度;
- $f’(a)$ 决定切线斜率和一阶变化;
- $f’’(a)$ 决定局部弯曲方向和曲率趋势;
- 更高阶项补充更细致的局部变化。
如果 $f’(a)=0$ 且 $f’’(a)>0$,二次项在 $a$ 附近为正,通常说明 $a$ 是局部极小点;若 $f’’(a)<0$,则通常是局部极大点。遇到 $f’’(a)=0$ 时,需要继续检查更高阶的首个非零导数。
如何选择展开点和阶数
实际使用泰勒公式时,可以按下面的顺序思考:
- 确定目标位置:要近似哪个 $x$,或研究哪个极限;
- 选择展开点:选离目标位置近、函数值和各阶导数又容易计算的 $a$;
- 判断所需阶数:数值近似由误差要求决定,极限计算则展开到首个不抵消项;
- 写出余项或阶数符号:数值问题使用误差上界,极限问题可使用 $O$ 或 $o$ 记号;
- 检查适用条件:确认导数存在,并检查级数的收敛范围。
围绕目标点展开通常比固定在 0 点更高效。例如近似 $\ln(1.02)$ 时在 0 点展开很自然;近似 $\ln(10.02)$ 时,则可以先写成 $\ln 10+\ln(1.002)$,再对较小的增量展开。
Python 验证近似与误差
下面用三阶泰勒多项式近似 $e^{0.1}$,并验证实际误差没有超过拉格朗日余项给出的上界。
from math import exp, factorial
def exp_taylor(x: float, degree: int) -> float:
return sum(x**k / factorial(k) for k in range(degree + 1))
x = 0.1
degree = 3
approximation = exp_taylor(x, degree)
actual = exp(x)
actual_error = abs(actual - approximation)
# 当 x > 0 时,区间 [0, x] 上 e^t 的最大值是 e^x。
remainder_bound = exp(x) * x ** (degree + 1) / factorial(degree + 1)
print(f"approximation = {approximation:.10f}")
print(f"actual = {actual:.10f}")
print(f"actual error = {actual_error:.10e}")
print(f"error bound = {remainder_bound:.10e}")
assert actual_error <= remainder_bound
常见误区
泰勒展开是在一个点上近似
展开点决定系数,但近似描述的是该点附近的一段区域。离展开点越远,高阶项和余项越不能忽略。
函数无限可导就一定等于泰勒级数
无限可导不等于解析。经典反例是:
$$ f(x)= \begin{cases} e^{-1/x^2}, & x\ne 0,\ 0, & x=0. \end{cases} $$
它在 $0$ 点的各阶导数都为 0,因此泰勒级数恒为 0;但当 $x\ne 0$ 时,原函数为正。要让泰勒级数等于函数,还需要余项趋于 0。
阶数越高就无条件越准确
在固定收敛区域内,提高阶数通常能改善近似,但这依赖函数、展开点和目标位置。离展开点过远或超出收敛区间时,增加项数未必有帮助。
只写无限级数,不写收敛条件
几何级数和对数级数都有明确的收敛范围。忽略范围,会把局部等式错误地当成全局等式。
总结
泰勒公式可以概括为:
$$ \text{函数的局部行为} \approx \text{函数值}+\text{斜率}+\text{曲率}+\text{更高阶变化}. $$
它的构造原则是让多项式与原函数在展开点处的函数值和各阶导数相同;系数中的 $n!$ 来自 $(x-a)^n$ 连续求导 $n$ 次。真正使用时,还要同时关注余项、展开点、截断阶数和收敛范围。
因此,泰勒公式不只是一个需要背诵的展开式,而是一套把复杂函数局部转化为简单多项式,并用余项控制误差的方法。