1. 泰勒展开到底在解决什么问题
先说结论:泰勒展开公式这件事,本质上就一句话——用一堆最简单的幂函数,去冒充一个复杂函数在某个点附近的行为。这个"冒充"能成立,是因为多项式是我们唯一可以熟练求导、求积分、做四则运算的函数族。你只要能把它换成多项式,极限、近似值、误差估计、方程求解这些问题就全部降维成"合并同类项"级别的操作。
我第一次真正对它有感觉,是在做一道极限题的时候。题目是求 x 趋近于 0 时,某个式子的极限值,用洛必达法则上下求导五六次还是 0/0,式子越写越长。后来换成把分子分母各自展成幂级数,两项一减,一次项、三次项该消的消掉,答案不到半分钟就出来了。那种感觉就像你手里突然多了一把万能钥匙:泰勒展开真正的价值不在于背下来多少条公式,而在于它给了你一套"不用聪明也能做对"的机械流程。
所以这篇文章我会分几块讲:常见的展开式该背哪些、怎么背不混;复杂函数怎么一步步拆成能处理的形态;阶数到底展开到多少才够;以及我在做题和写代码时踩过的那些坑。适合刚学微积分的学生、准备考试的人,也适合做数值计算、需要写近似公式的工程师。基础要求不高,会求导就够了,剩下的我尽量用生活化的语言说清楚。
1.1 从一个"骗"字说起:用多项式冒充复杂函数
我们把一个函数 f(x) 在点 x₀ 附近展开成:
f(x) = a₀ + a₁(x-x₀) + a₂(x-x₀)² + a₃(x-x₀)³ + ... + aₙ(x-x₀)ⁿ + 余项问题是,这些系数 a₀、a₁、a₂ 到底该取多少?思路非常朴素:既然要"像",那就让两边的各阶导数在 x₀ 这个点上全都相等。
在 x₀ 处代入,左边是 f(x₀),右边只剩 a₀,所以 a₀ = f(x₀)。求一阶导再代入,右边只剩 a₁,所以 a₁ = f'(x₀)。求二阶导,右边是 2a₂,所以 a₂ = f''(x₀)/2。求三阶导,右边是 3·2·a₃,所以 a₃ = f'''(x₀)/6。
规律就出来了:第 n 项系数是 f⁽ⁿ⁾(x₀) 除以 n 的阶乘。这就是泰勒公式的系数来源,不是什么天上掉下来的东西。那个阶乘也不是装饰品,它就是"求了 n 次导后,幂函数前面累积出来的常数"被除回去的结果。
提示:记忆的时候不要死记"n 阶导除以 n 阶乘",而要记住"让导数相等"这个出发点。这样一来,任何变形的公式——比如展开点是 x₀ 而不是 0——你都能自己推出来,而不用去翻书。
工程上最常见的用法是取 x₀ = 0,这时候叫麦克劳林公式。比如电路里算小信号近似,常常把 e^u 近似成 1+u,把 cos θ 近似成 1-θ²/2,这些其实都是泰勒展开截断到前几项的结果。
1.2 余项:决定你敢用几阶的那道门槛
很多人学到这里会有一个错觉:既然是"约等于",那我多写几项不就完了?关键问题是,你凭什么认为后面那些项可以扔掉?答案在余项里。
带拉格朗日余项的泰勒公式长这样:
f(x) = Σ(k=0..n) f⁽ᵏ⁾(x₀)/k! · (x-x₀)ᵏ + f⁽ⁿ⁺¹⁾(ξ)/(n+1)! · (x-x₀)ⁿ⁺¹最后那一坨就是余项 Rₙ(x),其中 ξ 是介于 x 和 x₀ 之间的某个点。注意它是个"存在某个点",不是具体某个点——这看着很难用,但实际估计误差足够了,因为我们只需要知道 f⁽ⁿ⁺¹⁾ 在区间上的最大值 M,就能给出:
|Rₙ(x)| ≤ M/(n+1)! · |x-x₀|ⁿ⁺¹这里有个非常重要的直觉:阶乘增长得极快,而 |x-x₀| 只要小于 1,它的幂次也是越乘越小。所以两个因素一叠加,误差会以惊人的速度衰减。这也是为什么近似计算里用泰勒展开特别划算。
举个具体的:算 sin(0.1),用 sin x ≈ x - x³/6 + x⁵/120,得到 0.1 - 0.0001666667 + 0.00000008333 ≈ 0.0998334167。真值是多少?0.0998334166468......误差在 1e-11 量级。也就是说,你用三项就拿到了小数点后十位的精度。而如果 x 取 3,同样的三项误差就是灾难级的了——这直接引出后面要讲的收敛半径问题。
实践中还有个更好的工具:如果是交错级数(正负交替、绝对值单调递减趋于 0),余项的绝对值不超过被截断的第一项。比如算 e⁻¹:
e⁻¹ = 1 - 1 + 1/2! - 1/3! + 1/4! - ...取到 1/6! 这一项,误差就小于 1/7! ≈ 0.000198。这个判据不需要求导、不需要找最大值,比拉格朗日余项好用得多。我在做题时如果看到交错结构,第一反应就是用这个估计。
1.3 什么场景下我会优先想用泰勒展开
不是所有题都适合展开,用错工具反而更慢。我总结几类情况,看到就优先考虑泰勒:
第一类是0/0 型的极限,尤其是分母是 x 的幂次、分子是各种函数的差。这种题洛必达能做,但求导次数多了容易算错,泰勒是稳的。
第二类是近似值与误差控制。比如你要估算 √1.02、sin(0.05)、ln(1.01),或者写代码时想避免调用昂贵的函数,就直接用展开式算。
第三类是无法求原函数的积分。像 ∫e^(-x²)dx 这种,原函数不是初等函数,但展开后逐项积分就能得到一个级数解,工程上高斯误差函数就是这么处理的。
第四类是微分方程的近似解。有些非线性方程没有解析解,但可以设 y = a₀ + a₁x + a₂x² + ... 代入方程比较系数,逐阶求出系数的递推关系,这就是级数解法。
反过来,如果函数在某点导数不存在、或者 x 离展开点很远,泰勒就不好用了。还有就是周期性强的函数做全局近似时,傅里叶级数往往比泰勒更合适——泰勒是"局部最准",傅里叶是"全局最匀",这是两套不同的思路。
2. 八个必须刻在脑子里的基础展开式
基础展开式必须熟到"看到 1-cos x 脑子里自动蹦出 x²/2"的程度。因为所有复杂展开,都是把这些基础式子做加减乘除、复合、求导、积分拼出来的。基础不牢,后面每一步都在翻书,速度就没了。
我这里列的不是"越多越好",而是真正高频的核心组。剩下的可以推,但这一组我建议直接背下来。
2.1 指数、正弦、余弦:奇偶性与阶乘的配合
这三个是最重要的,因为它们的收敛半径是无穷大,随便用。
e^x = 1 + x + x²/2! + x³/3! + x⁴/4! + ... + xⁿ/n! + o(xⁿ) sin x = x - x³/3! + x⁵/5! - x⁷/7! + ... + (-1)ⁿx^(2n+1)/(2n+1)! + o(x^(2n+1)) cos x = 1 - x²/2! + x⁴/4! - x⁶/6! + ... + (-1)ⁿx^(2n)/(2n)! + o(x^(2n))这三个式子的结构非常优美:e^x 全项都有,sin x 只有奇次项,cos x 只有偶次项,系数都是阶乘的倒数,正负号交替。
这里有个特别好用的记忆抓手:e^(ix) = cos x + i·sin x(欧拉公式)。把 e^(ix) 展开,实部正好凑出 cos,虚部正好凑出 sin。你要是忘了 sin 的符号是正的还是负的,用这个推一下,三十秒就能确认。
另一个抓手是奇偶性:sin 是奇函数,所以只有奇数次的项,且首项系数必须是 1;cos 是偶函数,只有偶数次项,首项是 1。这个约束能帮你排除掉大部分记忆错误。
注意:sin x 的第三项是 x⁵/5!,不是 x⁵/5。这个错误我见过太多次,尤其在紧张考试的时候。指数函数和三角函数的分母都是阶乘,而 ln 系列的分母是自然数,这两组千万别串。
还有个高频变形:e^(-x²) = 1 - x² + x⁴/2! - x⁶/3! + ...,这个在概率和热传导问题里出现频率极高。它的来源就是把 x 换成 -x²,代入即可,不需要重新求导。
2.2 对数与幂函数:定义域和符号最容易翻车
这一组的坑最多,因为涉及定义域。
ln(1+x) = x - x²/2 + x³/3 - x⁴/4 + ... + (-1)^(n-1)·xⁿ/n + o(xⁿ) (-1 < x ≤ 1) (1+x)^α = 1 + αx + α(α-1)x²/2! + α(α-1)(α-2)x³/3! + ... (|x| < 1) 1/(1-x) = 1 + x + x² + x³ + ... + xⁿ + o(xⁿ) (|x| < 1) 1/(1+x) = 1 - x + x² - x³ + ... + (-1)ⁿxⁿ + o(xⁿ) (|x| < 1)先说 ln(1+x)。它的分母是自然数 1、2、3、4,不是阶乘,这一点必须和三角函数区分开。符号是交替的,从正号开始。还有一点很关键:它的收敛半径是 1,而且 x = 1 时收敛(得到 ln2 的级数),x = -1 时发散。所以用这个式子的时候,x 的取值范围一定要看清楚。
再说 (1+x)^α。这个式子叫广义二项式展开,α 可以是任何实数,不限于正整数。当 α 是正整数 n 时,展开会在第 n+1 项之后自动终止,退化成高中就学过的二项式定理——因为从某一项开始会乘到 (α-α) = 0。这是判断自己有没有记错的一个很实用的检查点。
最常见的几个特例必须背熟:
| α 的取值 | 展开式 |
|---|---|
| α = 1/2 | √(1+x) = 1 + x/2 - x²/8 + x³/16 - 5x⁴/128 + ... |
| α = -1/2 | 1/√(1+x) = 1 - x/2 + 3x²/8 - 5x³/16 + ... |
| α = -1 | 1/(1+x) = 1 - x + x² - x³ + ... |
| α = 1/3 | (1+x)^(1/3) = 1 + x/3 - x²/9 + 5x³/81 - ... |
顺便说一句,1/(1-x) 这个式子虽然简单,但它是"反向使用"的关键工具。当你要展开一个分式函数,比如 1/(2-x),先把它写成 (1/2)·1/(1-x/2),就能套这个公式。这个技巧后面还会反复用到。
2.3 反三角、正切、双曲:系数不在阶乘里
这几个的系数规律不明显,但出现频率也不低,建议记住前两到三项。
arctan x = x - x³/3 + x⁵/5 - x⁷/7 + ... (|x| ≤ 1) arcsin x = x + x³/6 + 3x⁵/40 + 5x⁷/112 + ... (|x| < 1) tan x = x + x³/3 + 2x⁵/15 + 17x⁷/315 + ... (|x| < π/2) sinh x = x + x³/3! + x⁵/5! + ... (全域) cosh x = 1 + x²/2! + x⁴/4! + ... (全域)arctan x 的规律和 ln(1+x) 很像:分母是奇数 1、3、5、7,符号交替。你可以这么记:arctan x 的导数是 1/(1+x²),把 1/(1+x²) 展开再逐项积分,就得到上面这个式子。忘了的话现推,一分钟的事。
arcsin x 的系数不太规整,6、40、112,只能硬记。但它有个推导捷径:arcsin 的导数是 (1-x²)^(-1/2),用广义二项式展开(α = -1/2,把 x 换成 -x²),再逐项积分。我在 3.4 节会完整演示一遍这个过程。
tan x 的系数 1/3、2/15、17/315 更不好记,我一般只记前两项 x + x³/3。真需要更高阶的时候,用 sin x / cos x 做长除法现算,比硬背靠谱。后面 3.3 节会讲这个算法。
双曲函数是最省心的,sinh 和 sin 长得一模一样,只是没有负号;cosh 和 cos 一模一样,也是没有负号。原因也很简单,它们的定义里没有 i 这个虚数单位。
2.4 展开点不在原点时怎么平移
所有上面的式子都是 x₀ = 0 的情况。遇到展开点不是 0 的题,不需要重新背新公式,做一个换元就行。
比如要在 x = 1 处展开 ln x,就令 t = x - 1,那么 x = 1 + t,ln x = ln(1+t),直接套 ln(1+x) 的公式:
ln x = (x-1) - (x-1)²/2 + (x-1)³/3 - (x-1)⁴/4 + ...同理,e^x 在 x = 2 处展开:令 t = x-2,e^x = e²·e^t = e²(1 + t + t²/2! + ...) = e²(1 + (x-2) + (x-2)²/2! + ...)。注意前面那个 e² 是系数,不能漏。
提示:展开点选得好不好,直接决定收敛快慢。算 ln(1.1),在 x=1 处展开,t = 0.1,级数收敛飞快,前两项就够了。但如果你非要在 x=0 展开 ln x,那根本展不开,因为 ln x 在 0 处没有定义。工程上选展开点的原则是:离计算点越近越好。
这个"平移"思路还能处理更复杂的情况。比如要展开 1/(x²-3x+2),先因式分解成 1/[(x-1)(x-2)],再拆成部分分式,各自用 1/(1-x) 的形式处理。这类题的核心就是努力把式子往已知的标准形上凑。
3. 复杂展开的六个套路
基础式子会背了,接下来是真正的技术活:怎么把一个陌生的复杂函数,一步步化简成基础式子的组合。我把它总结成六种套路,覆盖了我见过的绝大多数情况。
3.1 换元:把陌生函数塞进已知式子
这是使用频率最高的方法。核心思想是:不要对整体求导,而是找到一个"内核",让整体变成已知函数的形态。
最典型的例子是 e^(x²)、e^(sin x)、ln(1+x²)、1/√(1-x²) 这类复合函数。
以 e^(x²)(展开到 x⁶ 项)为例:
e^u = 1 + u + u²/2! + u³/3! + ..., 令 u = x² e^(x²) = 1 + x² + x⁴/2 + x⁶/6 + ...完全不需要对 e^(x²) 求六次导数,直接代换、化简就行。
再看一个稍微复杂的:e^(sin x),展开到 x⁵ 项。
第一步,把 sin x 展到需要的阶:
sin x = x - x³/6 + x⁵/120 + o(x⁵)第二步,记 u = sin x,那么 e^u = 1 + u + u²/2 + u³/6 + u⁴/24 + u⁵/120 + o(u⁵)。
第三步,逐项把 u 的幂算出来,只保留到 x⁵:
u = x - x³/6 + x⁵/120 u² = x² - x⁴/3 + 2x⁶/45 + ... (保留到 x⁴ 就够,因为要乘 1/2) u³ = x³ - x⁵/2 + ... u⁴ = x⁴ + ... u⁵ = x⁵ + ...第四步,代入并按 x 的幂次归并:
- x¹ 项:1
- x² 项:1/2
- x³ 项:-1/6 + 1/6 = 0
- x⁴ 项:-1/6(来自 u² 的 -x⁴/3 乘 1/2)+ 1/24(来自 u⁴ 乘 1/24)= -4/24 + 1/24 = -1/8
- x⁵ 项:1/120(u 的 x⁵)+ (-1/12)(u² 无 x⁵ 项,此项来自 u³ 的 -x⁵/2 乘 1/6)+ 1/120 = 2/120 - 10/120 = -1/15
最后得到:
e^(sin x) = 1 + x + x²/2 - x⁴/8 - x⁵/15 + o(x⁵)注意 x³ 项消失了,这不是巧合。因为 e^(sin x) = e^x · e^(sin x - x),而 sin x - x 的最低次项是 -x³/6,乘 e^x 后对 x³ 的贡献是 -1/6,和 e^x 自身展开的 x³ 系数 1/6 正好抵消。
心得:换元之后每一层的 o() 都要小心。一开始写 sin x 时就该想清楚要展到几阶——因为后面还要平方、立方,最高阶会被抬高。一般来说,如果最终要 x⁵,sin x 展到 x⁵ 是够的,因为 u³ 只用到 x³ 项,u² 只用到 x² 项。这个"够不够"的判断,就是下一节的内容。
3.2 乘法与待定系数:阶数先估再算
当函数是"两个函数相乘"的形式,比如 e^x·sin x、x·arctan x、cos x·ln(1+x),处理方法很直接:各自展开,然后做多项式乘法,只保留需要的阶数。
以 f(x) = e^x · sin x 展开到 x⁴ 为例:
e^x = 1 + x + x²/2 + x³/6 + x⁴/24 + ... sin x = x - x³/6 + ...逐项相乘,只保留到 x⁴:
1 · sin x → x - x³/6 x · sin x → x² - x⁴/6 (x²/2) · sin x → x³/2 (x³/6) · sin x → x⁴/6 (x⁴/24) · sin x → x⁵/24 (超出 x⁴,舍去)归并:
- x¹:1
- x²:1
- x³:-1/6 + 1/2 = 1/3
- x⁴:-1/6 + 1/6 = 0
所以 e^x·sin x = x + x² + x³/3 + o(x⁴)。(x⁴ 项确实是 0,因为 e^x sin x = (e^(2x) - 1)/(2e^x)... 用复数形式 e^x sin x = Im[e^((1+i)x)] 可以验证。)
待定系数法是另一个好帮手,特别适合用于方程两边都含未知展开式的情况。做法是:设结果形如 a₀ + a₁x + a₂x² + ...,代回原式,比较两边同次幂的系数,列出方程组解出 a₁、a₂。
比如已知 y = e^(x·y),求 y 在 0 附近的展开。
设 y = a₀ + a₁x + a₂x² + a₃x³ + ...,由 x=0 得 y(0)=1,所以 a₀ = 1。
那么 e^(xy) = 1 + xy + (xy)²/2 + ... 而 xy = x(a₀ + a₁x + a₂x²) = a₀x + a₁x² + a₂x³。
代入:
左边 = 1 + a₁x + a₂x² + a₃x³ 右边 = 1 + (a₀x + a₁x² + a₂x³) + (a₀²x² + 2a₀a₁x³)/2 + (a₀³x³)/6 = 1 + a₀x + (a₁ + a₀²/2)x² + (a₂ + a₀a₁ + a₀³/6)x³比较系数:
- a₁ = a₀ = 1
- a₂ = a₁ + a₀²/2 = 1 + 1/2 = 3/2
- a₃ = a₂ + a₀a₁ + a₀³/6 = 3/2 + 1 + 1/6 = 8/3
所以 y = 1 + x + (3/2)x² + (8/3)x³ + ...。这就是级数解法的典型流程,在微分方程近似求解里非常好用。
3.3 除法与长除:tan x 和 sec x 是怎么来的
除法情况不能像乘法那样简单相乘,得用多项式长除法或者待定系数法。以 tan x = sin x / cos x 展开到 x⁵ 为例。
先写:
sin x = x - x³/6 + x⁵/120 + ... cos x = 1 - x²/2 + x⁴/24 + ...tan x 是奇函数,所以设 tan x = a₁x + a₃x³ + a₅x⁵ + o(x⁵)。
两边乘 cos x:
(a₁x + a₃x³ + a₅x⁵)(1 - x²/2 + x⁴/24) = x - x³/6 + x⁵/120左边展开:
x 项:a₁ x³ 项:a₃ - a₁/2 x⁵ 项:a₅ - a₃/2 + a₁/24比较:
- a₁ = 1
- a₃ - 1/2 = -1/6 → a₃ = 1/3
- a₅ - (1/3)/2 + 1/24 = 1/120 → a₅ = 1/120 + 1/6 - 1/24 = 1/120 + 20/120 - 5/120 = 16/120 = 2/15
所以 tan x = x + x³/3 + 2x⁵/15 + ...,和前面给的结果一致。
这个方法的关键在于:利用奇偶性减少未知量。tan 是奇函数,所以只有奇次项,未知系数直接减半。同理,sec x 是偶函数,设 sec x = b₀ + b₂x² + b₄x⁴,用 sec x · cos x = 1 去比较系数,能算出 sec x = 1 + x²/2 + 5x⁴/24 + ...
注意:长除法写的时候一定要对齐幂次,中间缺项要补 0。我见过不少人在手算 x⁵ 项时漏掉 a₃ 和 -x²/2 相乘的贡献,结果整个算错。建议用表格列出来,每一项来自哪里写清楚。
3.4 先求导再积分:arcsin x 的捷径
当函数是某个人畜无害的表达式的积分时,先求导、展开、再积分是最快的路。
arcsin x 本身不好展开,但它的导数简单:
(arcsin x)' = (1-x²)^(-1/2)用广义二项式展开,α = -1/2,把 x 换成 -x²:
(1+u)^(-1/2) = 1 - u/2 + 3u²/8 - 5u³/16 + ... 令 u = -x²: (arcsin x)' = 1 + x²/2 + 3x⁴/8 + 5x⁶/16 + ...逐项积分(arcsin 0 = 0,所以积分为 0 处起算):
arcsin x = x + x³/6 + 3x⁵/40 + 5x⁷/112 + ...和前面给的表格完全对上了。同样的方法可以推 arctan x:导数是 1/(1+x²) = 1 - x² + x⁴ - ...,积分得 x - x³/3 + x⁵/5 - ...
这个方法我说它"捷径",是因为求导把问题降到了熟悉的分式形态,而分式的展开是标准套路。如果硬去求 arcsin 的高阶导数,那会是一场噩梦。
反过来的方向也常用:当函数本身是某个函数的导数时,先展开、再求导。比如求 (ln(1+x))' 的展开,就没必要先求导再展开,直接展开 ln(1+x) 然后逐项求导更快。这类题的核心判断是:哪一个方向能让你更快落到"基础展开式"上,就往哪个方向走。
3.5 隐函数确定的函数展开
有一类题不给显式表达式,只说 y 由某个方程确定,让你求 y 的展开。这种没有捷径,就是待定系数硬算,但要注意每步只保留需要的阶数。
例题:设 y = y(x) 满足 y = x + y²/2,且 y(0) = 0,求 y 展开到 x³ 项。
设 y = a₁x + a₂x² + a₃x³ + o(x³),由 y(0)=0 得常数项为 0。
右边 y² = (a₁x + a₂x² + a₃x³)² = a₁²x² + 2a₁a₂x³ + o(x³),所以 y²/2 = (a₁²/2)x² + a₁a₂x³。
代入原方程:
a₁x + a₂x² + a₃x³ = x + (a₁²/2)x² + a₁a₂x³比较系数:
- a₁ = 1
- a₂ = a₁²/2 = 1/2
- a₃ = a₁a₂ = 1/2
所以 y = x + x²/2 + x³/2 + o(x³)。
注意一个细节:算 y² 的时候,a₃x³ 这一项和 a₁x 相乘产生的是 x⁴ 项,超出了我们要的范围,所以可以直接扔掉不写。这种"只保留到目标阶数"的意识,是手算不出错的关键。很多人写着写着手滑,把高阶项带进去,结果越算越长最后自己也搞混了。
另外要提醒的是,隐函数展开只告诉你"存在一条解曲线在 0 附近",至于这个解是不是唯一、展开式能用到多远,需要看隐函数存在定理的条件。做题时通常题目会默认条件成立,但如果是工程应用,这一步不能省。
3.6 含参数、复合嵌套与二元展开
含参数的情况很常见,典型题型是求 lim(x→0) (cos x - e^(-ax²/2))/x⁴,问 a 取什么值时极限存在。
做法是把两个函数都展到 x⁴:
cos x = 1 - x²/2 + x⁴/24 + o(x⁴) e^(-ax²/2) = 1 - ax²/2 + a²x⁴/8 + o(x⁴)相减:
(1 - a)x²/2 的系数来自 x² 项,要让它消失就必须 a = 1当 a = 1 时,x⁴ 项系数是 1/24 - 1/8 = 1/24 - 3/24 = -1/12,所以极限是 -1/12。
这类题的解题逻辑很清晰:**参数的存在让低阶项无法自动抵消,必须人为设定参数让它们消失,这样高阶项才有机会主导极限。**这个思路在物理里叫"消除发散",本质是同一个数学机制。
二元函数的泰勒展开思路一样,只是项数变多了:
f(x,y) = f(0,0) + (f_x·x + f_y·y) + (1/2!)(f_xx·x² + 2f_xy·xy + f_yy·y²) + ...其中所有偏导数都在 (0,0) 处取值。可以用算子形式记:f(x,y) = Σ (1/n!)(x·∂/∂x + y·∂/∂y)ⁿ f |_(0,0)。这个形式在推导误差传播公式时特别顺手,比如测量中两个量各自有误差,合成误差的公式就是从这里的一阶项来的。
多层嵌套的复合函数,处理原则是由内向外逐层展开。比如 ln(1 + sin(x²)),先算 sin(x²) = x² - x⁶/6 + ...,再算 ln(1 + u),u = x² - x⁶/6,得到 u - u²/2 + ... = x² - x⁶/6 - x⁴/2 + ...。每一层都只保留到目标阶数。
4. 阶数怎么定:从极限题到工程近似
我见过太多人卡在这一步:函数能展开,但不知道该展到第几项才停。展少了答案不对,展多了浪费时间还容易算错。这一节专门解决这个问题。
4.1 分母定阶法:极限题的通用起手式
对于 0/0 型极限,一条非常实用的经验规则是:看分母的最低次幂,分子各项就展开到那一阶。
道理很简单。如果分母是 x²,那么分子里所有 o(x²) 的项除以 x² 之后是 o(1),在 x→0 时趋于 0,不影响结果。而 x² 及以下的项会影响结果,必须全部保留。
比如求 lim(x→0) (e^x - 1 - x)/x²。分母是 x²,分子展到 x²:
e^x - 1 - x = (1 + x + x²/2 + o(x²)) - 1 - x = x²/2 + o(x²)除以 x² 得 1/2 + o(1),极限是 1/2。
再看一个经典题:lim(x→0) (tan x - sin x)/x³。
如果分子只展到 x²,会发现 tan x 和 sin x 都是 x + ...,x 项抵消后你得不出 x³ 的信息。这就是抵消现象。正确做法是先看两个函数的一次项是否相同——tan x ≈ x,sin x ≈ x,确实相同,所以要往下多展一阶。
tan x = x + x³/3 + o(x³) sin x = x - x³/6 + o(x³) tan x - sin x = (1/3 + 1/6)x³ + o(x³) = x³/2 + o(x³)除以 x³ 得 1/2。
通用起手式:先看分母的阶数 n,再判断分子最低次项是多少。如果分子在 n 阶之前有抵消,就要展到能出现非零系数的最高阶为止。这个"最多多展一阶"的保险策略,几乎能应付所有考试题。
4.2 抵消现象与"多展一阶"的保险策略
抵消是泰勒展开题里最容易出事的地方。它的本质是:两个函数在同一阶上有相同的系数,相减之后这一阶及以上被削掉,真正决定极限的项被推到了更高阶。
判断会不会抵消,有个快速的试算法:把两个函数都展到一阶,看一次项系数是否相同;如果相同,再看三次项;以此类推。一般抵消不会超过两阶,否则题目就没什么可考的点了。
举几个常见的抵消对:
| 表达式 | 抵消到哪一阶 | 需要展到 |
|---|---|---|
| tan x - sin x | x 项抵消 | x³ |
| x - sin x | x 项抵消 | x³ |
| ln(1+x) - x | x 项抵消 | x² |
| sin x - x + x³/6 | x 和 x³ 都抵消 | x⁵ |
| e^x - 1 - x | x 项抵消 | x² |
注意:抵消判断最好在动笔前做完,写在草稿边上。我自己的习惯是先在纸上写"分母 x³,分子首项抵消一阶,展到 x³"。这一句话能省掉中途的犹豫,也能防止算到一半忘了自己想要什么。
还有一个更隐蔽的坑:分母是多个项相加的时候。比如 (x - sin x)/(x²·sin x),分母里 sin x 也是变量,这时候要把分母整体的最低阶找出来。x²·sin x 的最低阶是 x³(因为 sin x ~ x),所以等价于分母是 x³。这类题先做分母的阶数分析,再处理分子,顺序不能反。
4.3 近似计算的误差控制与验算
工程上用泰勒展开做近似,关注点从"极限存不存在"变成"误差有多大、够不够用"。这时候判断依据换成前面讲的余项估计。
举个实际例子:用展开式计算 √1.02,要求误差小于 1e-6。
用 (1+x)^(1/2) = 1 + x/2 - x²/8 + x³/16 - ...,取 x = 0.02:
1 + 0.01 - 0.00005 + 0.0000005 = 1.0099505真值是 1.0099504938...,误差在 1e-8 量级,三项就远远够用了。
如果要求的精度更高,或者 x 更接近 1(比如算 √1.9),级数收敛会变慢,需要更多项。一个改善技巧是提取因子:√1.9 = √(4×0.475) = 2√0.475,但这样也不理想。更好的做法是围绕 1.96 = 1.4² 这个点展开:√1.9 = 1.4·√(1 - 0.06/1.96) = 1.4·√(1 - 0.0306...),此时 x = -0.0306 很小,收敛很快。这就是"选好展开点"的实际价值。
验算有几个便宜又有效的办法:
第一,数值验算。取几个小的具体数值代入近似公式,和计算器或编程环境的结果对比。
第二,数量级检查。算出的误差如果比理论估计大了好几个数量级,一定是哪里错了。
第三,对称性检查。如果函数是奇函数,结果里不该出现偶次项;偶函数反之。这一条能拦住很多低级错误。
第四,量纲检查(针对物理应用)。展开式中每一项的量纲必须一致,否则说明项写错了。
5. 常见错误清单与排查表
我把这些年见过的、以及自己犯过的错误整理一下。这一节可以当成自查表用。
5.1 o(xⁿ) 的运算规则用错
小 o 的运算规则看着简单,但用错的人特别多。核心几条:
o(x^m) + o(x^n) = o(x^min(m,n)) (保留较低阶) o(x^m) · o(x^n) = o(x^(m+n)) x^k · o(x^m) = o(x^(m+k)) o(o(x^m)) = o(x^m) (嵌套不改变阶数) C · o(x^m) = o(x^m) (常数不影响) o(x^m) / x^k = o(x^(m-k)) (当 m > k 时趋于 0)最常见的错误是把 o(x^m) 当成一个可以随便加减小量。比如有人写 o(x²) + o(x³) = o(x⁵),这是错的,应该等于 o(x²)。因为 o(x³) 里面每一项至少是 x³ 以上,而 o(x²) 允许 x² 项存在,两者之和的最低阶由较弱的那一个决定。
另一个高频错误是忘记在换元后调整阶数。比如写 e^(x²) = 1 + x² + o(x²),这是错的。因为 e^u = 1 + u + o(u),令 u = x² 得 e^(x²) = 1 + x² + o(x²)。这个其实是对的。但如果写 e^x = 1 + x + o(x²),然后换元 x → x² 得到 e^(x²) = 1 + x² + o(x⁴),就错了——输入和输出的阶数要一致地变换,o(x) 换成 o(x²) 才对,不是 o(x⁴)。这个坑我踩过,写完之后自己检查了一遍才发现。
提示:每次换元之后,把 o() 里的变量也同步换掉,并且重新确认阶数。这一步花十秒钟,能省掉整道题重算的半小时。
5.2 定义域、收敛半径、展开点搞混
这三件事经常被混为一谈,但它们是三个不同的概念。
定义域是函数本身有意义的范围。ln(1+x) 要求 1+x > 0,即 x > -1。
收敛半径是展开式有效的范围。ln(1+x) 在 0 处展开的收敛半径是 1,所以只在 -1 < x ≤ 1 内有效。定义域更大,但展开式管不到那么远。
展开点是你选择在哪里做展开。同一个函数在不同展开点有完全不同的展开式,收敛范围也不同。
这三者的关系,用一个例子说清楚:f(x) = 1/(1-x)。定义域是 x ≠ 1。在 0 处展开,收敛半径是 1,只在 |x| < 1 有效。但如果改在 x = 2 处展开(注意 2 在定义域内),得到的展开式收敛范围是 |x-2| < 1,也就是 1 < x < 3。同一个函数,换个展开点,能用的区域完全不同。
实际做题时怎么避坑?三步:先确认函数在展开点有定义且足够光滑;再把展开式的收敛半径标出来;最后检查你要计算的 x 是否落在收敛范围内。任何一步不满足,展开式就不能直接用。
5.3 一份可以直接照着查的排错表
| 症状 | 可能原因 | 排查动作 |
|---|---|---|
| 算出的极限是 0 或无穷 | 展开阶数不够,主项被抵消了 | 检查分子低阶项是否相消,多展一阶 |
| 结果里出现不该有的偶次项 | 奇偶性判断错误 | 确认函数的奇偶性,奇函数只保留奇次项 |
| 近似值和真值差很多 | 计算点超出收敛半径 | 换展开点,或改用其他方法 |
| 分母是阶乘却写成了自然数 | ln 系列和三角系列混淆 | 三角与指数用阶乘,ln 用自然数 |
| 长除法算出的系数和标准答案不符 | 漏掉了交叉项 | 列出所有相乘组合,逐项对齐幂次 |
| 换元后 o() 的阶数不对 | 换元时没有同步变换阶数 | 输入输出阶数一致变换 |
| 隐函数展开解不唯一 | 只比较了系数没验证存在性 | 补验隐函数存在定理条件 |
| 数值验算误差远超估计 | 符号或系数抄错 | 逐项对照基础展开式 |
这张表我自己用的时候,一般是从"症状"往下看,找到最像的那一行,然后去做"排查动作"。大部分错误在前三步就能定位。
6. 我踩过的坑与几条实用心得
前面讲的都是"应该怎么做",这一节说说容易忽略但很实用的细节。
6.1 手算时的书写习惯
写展开式的时候,我强烈建议一项一行、按幂次排序、每行右边标注来源。看起来啰嗦,但能显著降低出错率。比如算 e^(sin x) 的时候,我会写成:
来自 u: +x -x³/6 +x⁵/120 来自 u²/2: +x²/2 -x⁴/6 来自 u³/6: +x³/6 -x⁵/12 来自 u⁴/24: +x⁴/24 来自 u⁵/120: +x⁵/120然后把同一列加起来。这样做的最大好处是:任何一项漏了都能一眼看出来,因为列是空的。我用这个方法之后,复杂展开的错误率下降了一大半。
另一个习惯是先写目标阶数再动笔。在纸的右上角写一行 x⁵,算的时候心里始终有个锚点。看到超出这个阶数的项,直接划掉,不用纠结。
还有一点:系数尽量用分数写,不要提前化成小数。分数在通分时精确,小数容易在中间步骤引入舍入误差,而且在比较系数时容易看错。
6.2 用代码验算:我最推荐的复核手段
如果条件允许,用一段几行的代码做符号验算是最省事的复核手段。Python 的 sympy 库可以直接给出展开式:
import sympy as sp x = sp.symbols('x') expr = sp.exp(sp.sin(x)) print(sp.series(expr, x, 0, 8))输出会直接给出 1 + x + x²/2 - x⁴/8 - x⁵/15 - x⁶/240 + ...,和你手算的结果一对就放心了。
如果是纯数值验算,更方便,不需要任何符号库:
import math def approx_sin(x): return x - x**3/6 + x**5/120 for v in [0.01, 0.1, 0.5]: err = abs(approx_sin(v) - math.sin(v)) print(v, approx_sin(v), math.sin(v), err)跑一遍就能看到误差随 x 的衰减速度,也能直观感受到"三项够不够用"。
注意:验算的目的是发现错误,不是替代推导。如果只是抄一个结果,考试的时候还是得自己算。我的建议是平时练习时用手算,做完再用代码验一遍,把每次的差异点记下来,慢慢就会形成直觉。
6.3 一个容易被忽略的加速技巧
最后分享一个小技巧,处理高阶展开时特别管用:先做因式分解或提取主项,把表达式化简,再展开。
举个具体例子。要求 (e^x - 1 - x)/(x²) 在 x = 0 附近的高阶展开。直接硬算分子当然可以,但如果先注意到 e^x - 1 - x = x²/2 + x³/6 + ...,马上就能看出展开式是 1/2 + x/6 + x²/24 + ...
再复杂一点:求 ln(sin x / x) 的展开。直接求导会很痛苦,但可以拆成 ln(sin x) - ln x = ln(1 + (sin x - x)/x)。因为 (sin x - x)/x = -x²/6 + x⁴/120 + ... 是小量,可以直接套 ln(1+u) 的公式:
u = -x²/6 + x⁴/120 ln(1+u) = u - u²/2 + u³/3 - ... = (-x²/6 + x⁴/120) - (x⁴/72)/2 + ... 注意 u² 的最低次是 x⁴/36 = -x²/6 + x⁴/120 - x⁴/72 = -x²/6 + (3/360 - 5/360)x⁴ = -x²/6 - x⁴/180 + ...所以 ln(sin x / x) = -x²/6 - x⁴/180 + ...。这个结果在数值计算里用来做 sinc 相关函数的校正,我第一次看到的时候还挺惊讶——两个看起来毫不相干的常数 6 和 180,居然是这么凑出来的。
核心思路就是一句话:把"大函数减小函数"的形式改写成"1 加上小量"的形式,然后所有展开式的适用条件就都满足了。这个转换多做几次,就会变成条件反射。