news 2026/9/18 19:49:24

泰勒展开与麦克劳林公式:极限、近似计算与误差控制实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
泰勒展开与麦克劳林公式:极限、近似计算与误差控制实战

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/21/√(1+x) = 1 - x/2 + 3x²/8 - 5x³/16 + ...
α = -11/(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 xx 项抵消
x - sin xx 项抵消
ln(1+x) - xx 项抵消
sin x - x + x³/6x 和 x³ 都抵消x⁵
e^x - 1 - xx 项抵消

注意:抵消判断最好在动笔前做完,写在草稿边上。我自己的习惯是先在纸上写"分母 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 加上小量"的形式,然后所有展开式的适用条件就都满足了。这个转换多做几次,就会变成条件反射。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 19:48:14

盯DeepSeek Harness 知识扫描:TaoToken 提供模型入口

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 19:46:37

达梦数据库报错6001网络通信异常?从原理到排查步骤全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 19:45:13

Codex 跑 AGENTS.md 里的企业级长任务,Base URL 指向 TaoToken 的 API

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 19:43:42

VMware虚拟机共享文件夹权限与持久化配置指南

简介&#xff1a;本资源是一份面向VMware虚拟化初学者与IT运维人员的实操型配置指南&#xff0c;聚焦解决虚拟机与主机间文件共享这一高频痛点问题。内容以图文结合方式&#xff0c;系统讲解共享文件夹所需的三大核心步骤&#xff1a;虚拟机设置中添加主机共享目录、正确载入wi…

作者头像 李华
网站建设 2026/9/18 19:41:57

Linux系统编程实验通关:GCC、系统调用、进程通信与Shell脚本

终端里第一次蹦出Segmentation fault (core dumped)的时候&#xff0c;绝大多数人的第一反应是把代码从头到尾再读一遍&#xff0c;然后什么都没看出来——这条路我走过&#xff0c;浪费时间且不解决问题。实验做到第十二个&#xff0c;性质已经变了&#xff1a;前十一个实验里…

作者头像 李华