為什麼我們需要一套描述「多大」的語言
歡迎來到漸近分析的第一級臺階。這裡整個遊戲的起點是一句坦白:大多數有趣的問題都沒有閉形式的精確答案。大擺角下真實單擺的週期沒有簡潔公式,鐘形曲線沒有初等原函數,物理拋給你的許多和式與積分也寫不出有限的表達式。漸近式的思維優雅地接受了這一點,轉而問一個不同而更有用的問題——不是「精確值是多少?」,而是「當某個變量變得很大或很小時,它如何變化,我的近似有多好?」
你在第一卷裡其實已經用過這種直覺,只是沒給它起名。當你計算 (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 和波浪號讓你精確地說出事物有多大、多小;漸近級數的觀念讓你敢於信任一個發散展開,只要你停在恰當的地方。前方每一種方法都建在這塊地基上。接下來的幾篇會向你展示一些能從積分裡自動製造這些級數的機器——處理被尖峰主導的積分的拉普拉斯方法與沃森引理、走進複平面的最速下降法——再然後是攝動理論,你把一個難題當作一個被小參數輕推了一下的易題來對待。
走下去時,口袋裡揣一個畫面:漸近級數像一位神槍手,能把兩三發正中靶心,可一旦讓他打第四發,就開始往牆上亂噴。本事不在於多打幾發——而在於確切地知道何時收手。把這一點練成,一大片本無精確答案的問題地帶,會忽然交出你敢拿工程去押注的答案。