嵌入式龍格-庫塔對(embedded Runge-Kutta pair)
/ ROONG-uh KOO-tah /
要控制誤差,求解器得知道每一步的誤差有多大——但真誤差恰恰是它看不見的東西。嵌入式龍格-庫塔對的巧妙把戲,是一次把這一步算「兩遍」,用兩個階數不同、卻「共用」同一組斜率計算的方法,再用兩個答案之間的差距,作為即時且幾乎免費的誤差估計。
這個構造重用一組階段斜率 k_1, ..., k_s,配上「兩」列不同的權重:一列權重 b_i 給出較高階的估計 y_{n+1},第二列 b*_i 給出較低階的估計 y*_{n+1}。由於階段共用,多算的那個估計幾乎不花成本。差 y_{n+1} - y*_{n+1} 近似較低階結果的局部誤差,步長控制器用它決定是否接受這一步、以及下一步該如何調整 h。用布徹表的形式來說,這只是一張表配兩列 b。龍格-庫塔-費爾貝格法(RKF45)在 6 個階段內配對 4 階與 5 階公式;Dormand-Prince(許多程式庫中的 ode45)是 5 階/4 階對,帶有巧妙的 FSAL 性質(最後一階重用為下一步的第一階,省下一次計算)。
嵌入對是每個現代通用 ODE 求解器的引擎:它幾乎免費地提供誤差控制,使自適應步長成為可能——在平靜的區段大步跨過,在劇變的區段小步謹慎前進。誠實的提醒是:誤差「估計」本身也只是估計(在不平滑的問題上可能過於樂觀),控制器需要合理的容差與安全係數以免反覆震盪,而且和所有顯式 RK 方法一樣,這些對是給「非剛性」問題的——剛性方程仍需要帶有自己嵌入式誤差機制的隱式方法。
Dormand-Prince(ode45)由七個共用階段算出 5 階與 4 階估計。若兩者之差超過容差,它就拒絕這一步並用更小的 h 重試;若舒適地低於容差,就接受並把下一步的 h 放大,大致按 (tol/err)^(1/5)。這就是為什麼一次 ode45 呼叫能平順地航過行星近圓的軌道,卻在掠過近日點時自動放慢。
兩個階共用階段:它們的差是一個免費的誤差估計,用來驅動步長。
這個對估計的是一步的「局部」誤差,而非整段計算的全域誤差——把每步誤差壓小,並不保證整體答案準確,尤其在長時間或混沌的積分上。而嵌入式顯式對對剛性問題毫無用處,無論容差設多嚴。