常微分方程的數值方法
自適應步長控制
固定步長是個生硬的妥協。在解幾乎不變的地方,你浪費力氣走不必要的小步;在它突然急彎的地方,你的步又太大、誤差暴增。明智的做法是讓步長能呼吸——在困難、快速變化的路段小而謹慎,在平靜、平滑的路段大而省力。自適應步長控制正是自動做到這點,當場調整 h,把誤差維持在你設定的容差之內。
精確地說,每一步求解器都估計它剛犯的局部誤差(通常靠在同一步上比較兩個不同階的方法,如內嵌龍格-庫塔對所做的,或比較一個整步與兩個半步)。若估計誤差超過你的容差,這一步被拒絕、用更小的 h 重試。若誤差舒舒服服地低於容差,這一步被接受、且下次把 h 放大。新步長由一個依誤差如何隨 h 縮放的公式選定——對 p 階估計,h_new 約為 h * (容差 / 估計誤差)^(1/(p+1))——所以求解器逼近仍能達到你準確度目標的最大步長。
這正是每個現代常微分方程求解器所做的事,也是為何你能把一個難題與一個容差交給求解器、然後乾脆信任它。你直接控制準確度(你要求的是誤差水平,而非步長),而求解器只在問題要求的地方花力氣——這可能比一個細到足以應付最糟之處的固定步快上好幾個數量級。誠實的提醒:誤差「估計」本身是近似的、容差控制的是局部而非全域誤差,而極緊的容差終究會撞上捨入誤差下限,那裡更小的步不再有幫助。
RKF45 走一步,算出四階與五階兩個估計,用它們的差作為局部誤差。若這超過容差,這步以更小的尺寸重做;若它很小,下一步放大。對一個先平坦後突然暴增的問題,求解器在平坦處以大步滑行,在暴增處自動縮小 h。
每步估計誤差,再放大或縮小 h 以達到你的容差。
容差控制的是每步的「局部」誤差,而非最終答案的全域誤差——累積誤差仍可能超過你的容差。而誤差估計本身是近似的,所以自適應是個明智的啟發法,而非保證。
又稱
另見