為何每一步一個斜率還不夠
前兩篇指南建立了 Euler 法,接著誠實地揭露它的弱點:它只有一階精度,所以把步長減半只換來多一位正確數字,而它的局部截斷誤差隨步長的平方成長。根本原因很容易想像。要跨過從 x 到 x + h 的一步,Euler 只在「一個」地方看斜率——左端點——然後就朝那個凍結的方向走完整步。若真實曲線在這一步當中彎曲了,Euler 便走離了切線,卻渾然不覺。
這就是本篇指南的核心想法,而它自然得幾乎令人不好意思:若一個斜率取樣太粗糙,那就在這一步內部取好幾個斜率取樣,再明智地把它們平均起來。一個只在彎道起點瞥一眼路面的駕駛會偏移;一個在彎道轉動時不斷重新確認路面的駕駛則能貼著它走。這正是 Runge-Kutta 法 的全部精神——在步長內幾個精心挑選的點上取樣右端函數 f,再把那些斜率合成為一個能捕捉曲線彎曲的有效斜率。
兩級方法:溫和地往上跳一階
在那個著名的四級公式之前,先認識你也許已在第 2 篇見過的兩級表親,因為它們把這套技巧縮小展示了出來。改良 Euler 法(又稱 Heun 法)先做一個粗略的 Euler 步來「預測」落點,在那裡量斜率,再把它與起點斜率平均。單用起點斜率會在彎曲的曲線上把你帶偏;預測終點的斜率則把你往另一邊帶偏;兩者的平均折衷其間,落得離真相近得多。
中點法玩同一個遊戲但手法不同:先用 Euler 走半步,去窺看區間「中間」的斜率,再回到起點、用那個中點斜率走完整步。中間的斜率比兩端任一端的斜率更能代表整步。這兩者都是二階方法——它們的階是 2,意思是每步誤差按 h^3 縮放,把 h 減半大約使全域誤差縮為四分之一,而非二分之一。兩個位置得當的斜率取樣,就已把階比 Euler 翻了一倍。
RK4:四個斜率,依 Simpson 法則加權
現在輪到主角。經典的 RK4 法每步求斜率「四次」——一次在左端、兩次在試探的中點、一次在試探的右端——再用精心挑選的權重把它們混合,達到四階。那個階就是回報:每步的局部誤差按 h^5 縮放,而全域誤差按 h^4 縮放,於是把步長減半便使誤差縮為約十六分之一。多換一位正確數字只需把 h 稍微縮小,這正是為何 RK4 命中了精度與工夫之間的甜蜜點,使它六十年來一直是預設的首選。
One RK4 step from (x, y), step size h, slope f(x, y): k1 = f(x, y) k2 = f(x + h/2, y + (h/2) k1) k3 = f(x + h/2, y + (h/2) k2) k4 = f(x + h, y + h k3) y_next = y + (h/6)(k1 + 2 k2 + 2 k3 + k4) x_next = x + h
把權重唸出聲,結構便歌唱起來:兩個中點斜率算雙倍,兩個端點斜率算單倍,全部除以六。這恰恰就是積分的 Simpson 法則——而這是有原因的。若 f 恰好只依賴 x(一個 y' = f(x) 的純時間方程),那麼一個 RK4 步就「會是」套用在該積分上的 Simpson 法則,而它本身就是四階精確的。RK4 是 Simpson 在斜率也依賴 y 之情形下的自然推廣,其內部的各級 k2、k3、k4 供應了 Simpson 所需、卻無法事先得到的那些 y 值。
走過單獨一個 RK4 步
具體勝過抽象。取測試問題 y' = y 配上 y(0) = 1,其真實答案為 y = e^x,並走一個步長 h = 0.5 的步。跟著這四級走,看看在最後加權混合之前,每一級如何精煉斜率。
- k1 = f(0, 1) = 1。左端斜率,正是普通 Euler 法會用的那個。
- k2 = f(0.25, 1 + 0.25 k1) = f(0.25, 1.25) = 1.25。一個中點斜率,是用 k1 走半步後取的。
- k3 = f(0.25, 1 + 0.25 k2) = f(0.25, 1.3125) = 1.3125。第二個、更好的中點斜率,這次建立在 k2 之上。
- k4 = f(0.5, 1 + 0.5 k3) = f(0.5, 1.65625) = 1.65625。一個試探的右端斜率,用 k3 跨過整步。
- 混合:y_next = 1 + (0.5/6)(k1 + 2 k2 + 2 k3 + k4) = 1 + (0.5/6)(7.875) = 1.6484375。真值為 e^0.5 = 1.6487213,所以走一步後的誤差約為 0.0003——單獨一個粗步就有三位好數字。
對照一下:普通 Euler 法在同一步給出 y_next = 1 + 0.5(1) = 1.5,誤差約 0.15——糟了五百倍。你該誠實記住的代價是:RK4 為此付出了求四次 f、而非一次的工夫。所以公平的比較是在「等工夫」下、而非等步數下進行。即便如此,對光滑問題 RK4 仍決定性地獲勝,因為它的誤差隨 h 下降縮減得快太多,使你能走大得多的步,卻仍率先抵達終點。
RK4 仍做不到的事——保持誠實
RK4 很美妙,但它不是魔法,而且有四個限制是要緊的。第一,它的四階精度假定了真實解是「光滑」的;若 f 或解在某一步內有折角或近乎不連續,那個高階便會悄悄塌縮為低得多的東西。第二,階是關於小 h 的漸近陳述——一個著名結果是:沒有任何五階的顯式 Runge-Kutta 法能僅用 5 級造出,所以階隨級數輕鬆翻倍的好事就此停住;要買到四階以上的階,所費的 f 求值次數會不成比例地暴增。
第三,RK4 在這裡用的是「固定」步長,這在解平坦處浪費、在解突然轉急處則冒險;接下來的指南會用預測—校正對、以及如內嵌式 RKF45 這類能即時估計自身誤差的自適應步長控制來治好它。第四,也是最重要的,RK4 是「顯式」方法,而每個顯式方法的絕對穩定區域都是有限的。在剛性方程上——某個隱藏的模態以猛烈的速度衰減——RK4 被迫走荒謬地細小的步,不是為了精度,而僅僅是為了避免爆掉。那種失效模式,剛性,正是本層最後一篇指南的主題。