從導數到差分
一條運動方程就是一個常微分方程(ODE):給定此刻的狀態,它告訴你此刻的變化率。牛頓第二運動定律是二階的,m\ddot{x}=F(x,\dot{x},t);把它改寫成位置與速度的兩條一階方程,你就得到每個求解器都吃得下的標準形式。
任何 ODE 系統都可化約為這個一階形式,其中 \mathbf{y} 疊放所有位置與速度。求解器的全部工作,就是把 \mathbf{y} 從初始狀態 \mathbf{y}(t_0) 一步步往前推進。
要往前推進,我們需要把導數寫成差分。由泰勒級數導出有限差分公式——粗糙的前向差分,以及更精確的中央差分。
中央差分消去了泰勒展開中的 h^2 項,因此它的誤差以 h^2 而非 h 的速度下降——用同樣的工作量,多換得一個精度階數。
最簡單的步進器:尤拉法
尤拉法就是把有限差分的想法套用到時間上:假裝斜率在一小步 h 之內都是常數,然後照著走一步。
前向(顯式)尤拉法——「就朝當前方向邁一步」的規則。一目瞭然,但粗糙。
它每一步的局部誤差是 O(h^2),但在一段固定時間裡累積約 $1/h$ 步之後,整體誤差只有 O(h)——一階。更糟的是,對振盪或軌道問題,顯式尤拉法會系統性地灌入能量:用它跑一顆行星,軌道會向外螺旋擴張,這是一場純粹的數值災難,在物理上毫無根據。
主力工具:龍格-庫塔法
龍格-庫塔家族用在一步之內對斜率多次取樣、再巧妙加權平均的方式,來換取精度。經典的 RK4 每一步計算四次 \mathbf{f}。
RK4:四個斜率取樣——起點一個、中點兩個、終點一個——以 1:2:2:1 加權平均。它的整體誤差為 O(h^4),因而成為通用型積分子的預設選擇。
對一般的 ODE,RK4 是明智的預設。但它對物理並沒有特別的認識:它不知道一個哈密頓系統應當守恆能量與相空間體積。跑上一百萬圈軌道,連 RK4 的能量也會緩慢漂移。對於長時間的力學,我們想要一個天生就尊重問題幾何結構的方法。
物理學家的最愛:韋爾萊與辛積分子
對於力只依賴位置的牛頓系統,韋爾萊積分十分優美。把 x(t+h) 與 x(t-h) 的泰勒展開相加,奇次項互相抵消,剩下一個只需要力就能推進的格式。
位置型韋爾萊:時間可逆、每步達三階精度,只用一次力的計算,且不需要顯式的速度。
韋爾萊是辛的:它精確地保持相空間體積,並讓能量保持有界——在真值附近振盪,而非漂移遠離——即使跑上天文尺度那麼久也一樣。這正是分子動力學與太陽系程式碼採用韋爾萊家族積分子、而非 RK4 的原因,儘管 RK4 在局部上更精確。對的方法尊重的是物理,而不只是算術。
實作範例:一步,兩種積分子
取質量-彈簧振子 \ddot{x}=-\omega^2 x,\omega=1,從靜止的 x_0=1 出發(故 v_0=0),走一步大小 h=0.1。精確答案是 x(0.1)=\cos(0.1)=0.99500。看看在同樣一次力的計算下,兩種方法各自表現如何。
設定:一個純振子,其真實運動在任何時刻都守恆「能量」E \propto x^2 + v^2 = 1。
尤拉法。 此刻加速度 a_0=-\omega^2 x_0=-1。於是 x_1 = x_0 + h v_0 = 1,v_1 = v_0 + h a_0 = -0.1。位置仍是 $1$(誤差 $+0.005$),而能量 \propto x^2+v^2 已經從 $1$ 漲到 $1.01$——尤拉法正在灌入能量,正是那個向外螺旋的病態。
韋爾萊。 它需要一個先前的點;用 x_{-1}=x_0 - h v_0 + \tfrac{1}{2} a_0 h^2 = 1 - 0 - 0.005 = 0.995 起手。接著 x_1 = 2x_0 - x_{-1} + a_0 h^2 = 2 - 0.995 - 0.01 = 0.995。這與 \cos(0.1)=0.99500 五位數字完全吻合——而所用的,正是尤拉法用的同一次力的計算。