每條法則背後唯一的想法:先替換,再精確積分
你想要 f 從 a 到 b 的定積分——曲線底下帶正負號的面積。誠實的障礙在於:電腦幾乎從來沒有 f 的公式;它只有取樣值,也就是 f 在一格格網格點上的值,就像溫度計給你一串讀數、卻沒給你一個溫度函數。所以我們無法對 f 本身做積分。數值積分(簡稱數值求積)這整場遊戲,就是把那條未知曲線換成一個我們能親手積分的替身,然後回傳替身的面積。
什麼才算好替身?一個既夠靈活、能貼著真實曲線,又夠簡單、能用封閉形式積分的形狀。多項式是顯而易見的答案:它會彎曲,而多項式底下的面積又是微不足道的微積分。於是配方變成——用一個低次的內插多項式穿過你的取樣點,精確地積分那個多項式,再把結果當作你的近似積分。本篇裡每一條經典法則,都只是這個配方換上不同的多項式次數而已。
這和你在本級稍早看過的有限差分是同一招,只是反方向讀。在那裡你把 f 在局部換成一個低次多項式,然後微分它來得到導數公式;在這裡你把 f 換成一個多項式,然後積分它來得到面積公式。微分與積分,是從同一個內插多項式榨取資訊的兩種方式。正是這個共同的根源,使得兩族都帶著同一種誤差項——步長 h 的某次方——也使得你即將學到的訣竅(把 h 減半再組合)對兩者都管用。
梯形法則:直線是最簡單的替身
從最謙卑的多項式開始:一次,一條直線。只在兩個端點 a 與 b 取樣 f,在 f(a) 與 f(b) 之間畫出那條直弦,弦底下的面積就是一個梯形。它的面積等於寬度乘以兩個高度的平均。這就是整條梯形法則:積分 ≈ (b - a) * (f(a) + f(b)) / 2。請照字面想像——你正用一塊傾斜的木板替這片區域蓋頂,再讀出底下的面積。
當然,在一條劇烈彎曲的曲線上蓋一個巨大的梯形毫無希望。修正的辦法顯而易見,也是所有數值積分的主力:把 [a, b] 切成 n 條寬度為 h = (b - a)/n 的細長條,在每一條上鋪一個小梯形,再把它們全部加起來。這就是複合梯形法則。由於相鄰的長條共用一個端點,記帳就坍縮成一個整潔的總和:每個內部取樣點以全權重計一次,兩個端點各以半權重計,全部再乘以 h。
Composite trapezoidal rule on [a, b] with n strips, h = (b - a)/n:
integral ~= h * [ f(a)/2 + f(x_1) + f(x_2) + ... + f(x_{n-1}) + f(b)/2 ]
where x_k = a + k*h.
Error shrinks like O(h^2): halve h -> error drops by about 4x.它有多錯?仔細展開誤差(背後是與有限差分公式相同的泰勒級數機制)會顯示,複合梯形誤差表現如 O(h^2),並與 f''(x) 成正比:你付出的代價正是曲線的曲率,因為一條直弦跟不上彎曲的曲線。要記住的重點結論是——把步長 h 減半,誤差就掉到約四分之一,因為 (1/2)^2 = 1/4。老實說,這很慢:每多得一位小數,你大約需要三倍的點數。一個平坦或緩斜的函數會被積得幾近完美;一個劇烈彎曲的函數則要求許多細長條。
辛普森法則:讓替身彎曲起來
直弦無法彎曲,所以它總是一條接一條地、在同一側偏離一個彎曲的函數。自然的升級是讓替身也彎曲起來:擬合一條拋物線——二次多項式——而不是直線。拋物線需要三個點,所以取兩個端點加上長條的中點,擬合穿過它們的那條唯一拋物線,再精確積分它。把代數算完,會得到一個出奇整潔的加權,也就是著名的辛普森法則:一個區段上的積分 ≈ (h/3) * (f_左 + 4*f_中 + f_右)。中點得到端點四倍的權重——這個不對稱的 1-4-1 樣式就是整條法則。
這裡有個令人愉快的驚喜,正是它讓辛普森成為日常預設的法則。你把它建造成對拋物線(二次)精確,而它確實如此——但結果它對三次式(三次)竟也精確,完全免費。原因是對稱:一個三次式在區段左半邊造成的誤差,恰好抵消它在右半邊造成的誤差。所以你付了二次的錢,卻拿到三次的貨。這份紅利,正是一個更深主題最初的低語——點的擺放位置、而不只是點的數目,決定了你能命中多高的次數——下一篇講高斯求積的篇章,會把這一點變成一套完整的方法。
準確度上的回報很大。複合辛普森誤差表現如 O(h^4),並與四階導數 f''''(x) 成正比,相對於梯形法則的 O(h^2)。講白一點:把步長減半,誤差掉到約十六分之一,而不是四分之一。這份額外的速度基本上是免費的——辛普森重複使用完全相同的那些取樣點,只是用 1-4-1 的權重重新排列——這也是為什麼,面對一個光滑函數而拿不定主意時,辛普森是明智的第一選擇。
牛頓-柯特斯:這一族,以及為什麼你會早早收手
梯形與辛普森是同一族的頭兩位成員。在區間上取 n+1 個等距的點,擬合穿過它們的那條唯一的 n 次內插多項式,精確積分它,你就得到第 n 條牛頓-柯特斯法則。一次是梯形,二次是辛普森,三次是「3/8 法則」,以此類推。每升一階,替身就彎得更多,而在光滑函數上,每一階通常替你換來更多準確度。那為什麼不乾脆把次數催到 20,一口氣積完?
因為高次的牛頓-柯特斯是個陷阱,原因你在內插那一級已經遇過。逼一個單一的高次多項式穿過許多等距點,會觸發龍格現象:多項式在區間兩端附近發展出劇烈的振盪,無論你加多少點,都遠遠盪到真實曲線的上方與下方。內插反而變得更糟,而非更好。更糟的是,從大約八次起,牛頓-柯特斯的權重本身會變負且變大,而帶混合正負號的大權重,意味著在有限精度下的災難性抵消——你正在相減大數來救回一小塊面積,這正是整道階梯一再警告的捨入災難。
所以實務上的智慧與「越高越好」恰好相反:把次數壓低——梯形或辛普森——再靠更多區段的低次法則來換取準確度,也就是複合法則。低次完全避開龍格現象,並讓權重保持為正、行為良好。提高次數是會失敗的路;縮小 h 才是行得通的路。(第三條出路,被克蘭蕭-柯蒂斯法以及下一篇的高斯求積採用,是保持高次、但把點移離等距網格——不過那是稍後的故事了。)
龍貝格:把誤差公式變成免費的準確度
前一篇的努力在這裡得到驚人的回報。複合梯形誤差不只是「O(h^2)」——它完整的展開是一個關於 h 的偶數次冪的乾淨級數:誤差 = c_2*h^2 + c_4*h^4 + c_6*h^6 + ...,其中各係數與 h 無關。一個由已知的 h 次冪、未知係數所構成的級數,正是理查森外插最愛吞下的局面。在步長 h 算一次梯形估計,再在步長 h/2 算一次,然後組出那個能消去領頭 h^2 項的特定組合——剩下來的東西就準確到 O(h^4) 了。
但這個剩下的 O(h^4) 估計,有它自己的、關於 h 次冪的誤差級數,所以你可以再做一次理查森外插,殺掉 h^4 項而抵達 O(h^6),再一次,再一次。把這些反覆的外插排成一張三角形的表格,就是龍貝格積分:第一欄是 h、h/2、h/4、... 上的純梯形估計;每往右一欄就多施一次理查森步驟,而右下角那一格,是純粹從梯形求值中擠出來的高階答案。引人注目的是,龍貝格表格的第二欄正好就是辛普森法則——辛普森其實只是對梯形法則施一次理查森步驟,這也是為什麼它的階數從 2 跳到 4。
誠實的界限:看不見的誤差,與抵達不了的維度
兩個誠實的警告,能避免把這些整潔的法則吹捧過頭。第一,你在導數那裡遇過的「捨入對截斷」的拉扯,在這裡也潛伏著,只是咬得溫和得多。截斷誤差(那個 O(h^2) 或 O(h^4) 的故事)隨著你增加區段而縮小,但每個新取樣點都貢獻它自己的捨入誤差,而把上百萬項加起來,會緩緩累積出浮點雜訊——加法不具結合律,所以連加總的順序都有影響。和數值微分不同,積分不除以一個微小的 h,所以它沒有陡峭的捨入懸崖;儘管如此,當你要加上極大量的長條時,一個穩定的加總(卡漢式)是值得的。
第二,而且要命得多:這裡的一切都活在一個維度裡。在一個正方形上積分時,鋪一張網格、在每個方向各用辛普森,這個直覺確實管用——但每軸 m 個點的網格,在 d 維裡要花 m^d 個總點數。這就是維度詛咒:要在一個十維區域上、每軸只用區區 10 個點積分,就已經是 10^10 次求值,而像樣一點的每軸 100 個點就是 100^10 = 10^20,全然無望。網格式的牛頓-柯特斯在一維裡很美妙,在二、三維裡還行,到大約第五、六維就死透了。
那道高牆,正是為什麼有一套全然不同的哲學——蒙地卡羅積分——存在,也是為什麼它不只是個較粗糙的退路。它的誤差只以 O(1/sqrt(N)) 下降,在辛普森輾壓它的一維裡慢得令人痛苦,但那個速率與維度無關。在一千維裡蒙地卡羅根本不在乎,而每一條網格法則早已死透。所以教訓不是「辛普森最好」,而是「讓工具配合維度」:光滑、低維的積分用低次複合法則與龍貝格;當你能挑選自己的點時用高斯求積(下一篇);而一旦維度高到搆不著,就用隨機取樣。