为什么我们需要一套描述「多大」的语言
欢迎来到渐近分析的第一级台阶。这里整个游戏的起点是一句坦白:大多数有趣的问题都没有闭形式的精确答案。大摆角下真实单摆的周期没有简洁公式,钟形曲线没有初等原函数,物理抛给你的许多和式与积分也写不出有限的表达式。渐近式的思维优雅地接受了这一点,转而问一个不同而更有用的问题——不是「精确值是多少?」,而是「当某个变量变得很大或很小时,它如何变化,我的近似有多好?」
你在第一卷里其实已经用过这种直觉,只是没给它起名。当你计算 (3x^2 + 5x) / (x^2 + 1) 的无穷远处极限、说「它趋于 3,因为 x^2 项占主导」时,你做的就是渐近分析:把所有变得可忽略的东西扔掉,留下控制增长的部分。阶的记号无非是把这个动作变得精确而通用的词汇——一种能确切说出被丢弃的项有多可忽略的方式,好让记账永远不骗你。
大 O、小 o,与波浪号
有三个主力符号,而它们之间的区别正是关键所在。大 O 是一道天花板。我们写 f = O(g),意思是一旦足够靠近极限点,|f| 就被某个常数乘 |g| 所界住——f 增长得不比 g 快,至多差一个固定因子。它绝不断言 f 真的有 g 那么大;它只是禁止 f 比 g 更大。所以当 x 趋于无穷时 x^2 = O(x^3) 完全成立,尽管 x^2 小得多,因为这句话只说「x^2 不大于某常数乘 x^3」。把大 O读作「至多是这个阶」。
小 o 要强得多——它是一句真正可忽略的断言。我们写 f = o(g),意思是在极限下比值 f/g 一路趋于零。此时 f 不只是被 g 界住,而是被它彻底淹没:f 变成 g 的任意小的一个零头。所以当 x 趋于无穷时 x^2 = o(x^3),因为 x^2/x^3 = 1/x 趋于 0。心里的图像是:小 o是你毫不犹豫扫掉的灰尘,而大 O 是一件家具,它也许和 g 一样大、也许更小,但绝不会更大。
第三个符号是渐近等价的波浪号,f ~ g,意思是比值 f/g 趋于恰好 1。这是最强、信息量最大的一种:f 与 g 变得本质上一样大,首项相等。这正是当我们写 n! ~ sqrt(2 pi n) (n/e)^n 时斯特林真正断言的——并不是说两者相等(对中等的 n,它们相差一两个百分点),而是说它们的比值随 n 增大而走向 1。要小心:渐近等价控制的是比值,不是差值。n! 与它的斯特林估计的绝对差可以大得惊人,而比值却几乎是 1,因为两者本身都大得天文。
从泰勒级数到渐近级数
回想第一卷的泰勒级数。对像 e^x 这样的函数它是收敛的:在固定的 x 处不断添项,部分和便逼近真值,误差缩小到零。收敛说的是当项数趋于无穷、而 x 保持不动时会发生什么。渐近级数则把这件事颠倒过来。它通常是一个关于 1/x 幂次的级数,对任何固定的 x 也许根本不收敛——可是对每个固定的项数,随着 x 变大,近似却越来越好。这里取极限的是 x,而不是项数。
下面是精确定义,值得慢读。当对每个固定的 N,取 N 项后的余项是你保留的最后一项的小 o 时,级数 sum a_n x^{-n} 在 x 趋于无穷时渐近于 f(x),记作 f(x) ~ sum a_n x^{-n}:f(x) - (a_0 + a_1/x + ... + a_N/x^N) = o(x^{-N})。说白了:在任何地方把级数截断,你犯的误差相对于你保留的最小一项都是可忽略的——前提是 x 足够大。这个「前提是 x 足够大」担着极重的分量,它正是把渐近级数与收敛级数区分开来的地方。
把那个绝妙的悖论算出来
我们用本学科里最干净的例子把它落到实处。考虑函数 f(x) = 从 x 到无穷对 e^{x - t} / t dt 的积分——它与指数积分密切相关,每当你问某点之外还剩多少指数尾巴时,就会冒出这类对象。它没有初等的闭形式,但我们可以靠反复分部积分挤出一个展开,每一步多拽出一个 1/x 的幂次。
f(x) = int_x^inf e^{x-t}/t dt
Integrate by parts repeatedly (each step differentiates 1/t):
f(x) = 1/x - 1/x^2 + 2!/x^3 - 3!/x^4 + ... + (-1)^N N!/x^{N+1} + R_N
Term n is (-1)^n n! / x^{n+1}.
Ratio of term (n+1) to term n = (n+1)/x.
-> terms SHRINK while n < x, then GROW once n > x.
-> for ANY fixed x the series DIVERGES (n! beats x^n eventually).
But the remainder obeys |R_N| <= N! / x^{N+1} = size of first DROPPED term.
Smallest term is near n = x; stop there for best accuracy.
x = 10: best truncation error ~ 10!/10^11 ~ 4e-5 (excellent!)
keep summing past n=10 and the "approximation" blows up.盯住那一项 (-1)^n n! / x^{n+1}。阶乘 n! 终究会跑赢任何固定幂次 x^n,所以加到无穷,这级数无可救药地发散——对每个 x 都如此。然而魔法在余项里。因为取 N 项后的误差被你丢掉的第一项大小所界住,又因为在 n 低于 x 之前各项一直在缩小、之后才掉头,所以你能做到的最好就是停在最小项附近,大约 N 接近 x 处。在 x = 10 时那个最小项约为 4 乘 10^{-5}:从一个发散级数里得到几位正确的小数,而再多的项也无法改进它。多加反而更糟,不会更好。
这是整个学科核心而诚实的教训,所以我们直说,不加粉饰。在这里,发散与精度并非冤家。收敛级数向你保证:只要你有耐心一直添项,就能达到任意精度;渐近级数不作这种保证——它有一道地板,一个由最小项决定的、不可再降的最佳误差,想靠添项越过这道地板只会让事情变糟。你换来的好处是:这道地板往往低得出奇,而且只需两三项就触到。对大的 x,它是更划算的买卖,这正是物理学家时时伸手去取它的原因。
实际上怎么用它
你已经半懂的、最有用的一个渐近级数,就是阶乘的斯特林级数。它的首项给出 n! ~ sqrt(2 pi n) (n/e)^n,而修正因子 (1 + 1/(12n) + ...) 本身就是一个发散的渐近级数。使用任何这类展开的配方都简短得令人欣慰,而且无论你是在估计阶乘、指数积分,还是概率分布的尾部,配方都一样。
- 找出那个大(或小)参数——记作 x——并确认你真的处在它很大的区间里;渐近级数只在那里才是承诺。
- 逐项生成(常用反复分部积分,或代入一个试探级数),盯着各项的大小不断缩小。
- 找到最小项——下一项将不再缩小、转而开始增大的那处——就在那里截断,不要更早也不要更晚。
- 把误差估计为大约第一个被丢弃项的大小;那就是你诚实的误差棒,也是这个级数所能做到的极限。
最后一项诚实的提醒,因为它常绊倒新手。渐近级数捕捉的是函数中能被 1/x 的幂次看到的部分,但函数可能携带它看不见的成分——像 e^{-x} 这样比任何幂次都快地趋于零的项,于是在展开里不留痕迹。两个确实不同的函数可以共享同一个渐近级数。所以这级数告诉你大 x 时函数如何高精度地变化,但它本身并不能唯一地把函数钉死。清楚你的工具看得见什么、对什么视而不见,正是真正懂渐近分析、而非只会背诵它的人的标志。
这一级台阶通向何方
你现在握住了整一级台阶的语法。大 O、小 o 和波浪号让你精确地说出事物有多大、多小;渐近级数的观念让你敢于信任一个发散展开,只要你停在恰当的地方。前方每一种方法都建在这块地基上。接下来的几篇会向你展示一些能从积分里自动制造这些级数的机器——处理被尖峰主导的积分的拉普拉斯方法与沃森引理、走进复平面的最速下降法——再然后是摄动理论,你把一个难题当作一个被小参数轻推了一下的易题来对待。
走下去时,口袋里揣一个画面:渐近级数像一位神枪手,能把两三发正中靶心,可一旦让他打第四发,就开始往墙上乱喷。本事不在于多打几发——而在于确切地知道何时收手。把这一点练成,一大片本无精确答案的问题地带,会忽然交出你敢拿工程去押注的答案。