JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

讓方程式前進:運動的數值積分

牛頓給你 \ddot{x}=F/m,卻很少給你 x(t) 的公式。學習電腦如何把微分方程一步步往前推進——尤拉法、龍格-庫塔法,以及物理學家鍾愛的韋爾萊法——並理解方法的選擇為何決定了你的太陽系是穩定運行,還是螺旋墜入胡言亂語。

從導數到差分

一條運動方程就是一個常微分方程(ODE):給定此刻的狀態,它告訴你此刻的變化率。牛頓第二運動定律是二階的,m\ddot{x}=F(x,\dot{x},t);把它改寫成位置與速度的兩條一階方程,你就得到每個求解器都吃得下的標準形式。

\frac{d\mathbf{y}}{dt} = \mathbf{f}(\mathbf{y},\, t)

任何 ODE 系統都可化約為這個一階形式,其中 \mathbf{y} 疊放所有位置與速度。求解器的全部工作,就是把 \mathbf{y} 從初始狀態 \mathbf{y}(t_0) 一步步往前推進。

要往前推進,我們需要把導數寫成差分。由泰勒級數導出有限差分公式——粗糙的前向差分,以及更精確的中央差分。

f'(x) \approx \frac{f(x+h)-f(x)}{h} + O(h) \qquad f'(x) \approx \frac{f(x+h)-f(x-h)}{2h} + O(h^2)

中央差分消去了泰勒展開中的 h^2 項,因此它的誤差以 h^2 而非 h 的速度下降——用同樣的工作量,多換得一個精度階數。

格點模板以相鄰取樣點來近似導數;間距 h 越小,越貼近真實斜率——直到捨入誤差最終接手為止。

最簡單的步進器:尤拉法

尤拉法就是把有限差分的想法套用到時間上:假裝斜率在一小步 h 之內都是常數,然後照著走一步。

\mathbf{y}_{n+1} = \mathbf{y}_n + h\,\mathbf{f}(\mathbf{y}_n,\, t_n)

前向(顯式)尤拉法——「就朝當前方向邁一步」的規則。一目瞭然,但粗糙。

它每一步的局部誤差是 O(h^2),但在一段固定時間裡累積約 $1/h$ 步之後,整體誤差只有 O(h)——一階。更糟的是,對振盪或軌道問題,顯式尤拉法會系統性地灌入能量:用它跑一顆行星,軌道會向外螺旋擴張,這是一場純粹的數值災難,在物理上毫無根據。

主力工具:龍格-庫塔法

龍格-庫塔家族用在一步之內對斜率多次取樣、再巧妙加權平均的方式,來換取精度。經典的 RK4 每一步計算四次 \mathbf{f}

\begin{aligned} k_1 &= \mathbf{f}(\mathbf{y}_n,\, t_n) \\ k_2 &= \mathbf{f}\!\left(\mathbf{y}_n + \tfrac{h}{2}k_1,\ t_n + \tfrac{h}{2}\right) \\ k_3 &= \mathbf{f}\!\left(\mathbf{y}_n + \tfrac{h}{2}k_2,\ t_n + \tfrac{h}{2}\right) \\ k_4 &= \mathbf{f}\!\left(\mathbf{y}_n + h\,k_3,\ t_n + h\right) \\ \mathbf{y}_{n+1} &= \mathbf{y}_n + \tfrac{h}{6}\left(k_1 + 2k_2 + 2k_3 + k_4\right) \end{aligned}

RK4:四個斜率取樣——起點一個、中點兩個、終點一個——以 1:2:2:1 加權平均。它的整體誤差為 O(h^4),因而成為通用型積分子的預設選擇。

對一般的 ODE,RK4 是明智的預設。但它對物理並沒有特別的認識:它不知道一個哈密頓系統應當守恆能量與相空間體積。跑上一百萬圈軌道,連 RK4 的能量也會緩慢漂移。對於長時間的力學,我們想要一個天生就尊重問題幾何結構的方法。

物理學家的最愛:韋爾萊與辛積分子

對於力只依賴位置的牛頓系統,韋爾萊積分十分優美。把 x(t+h)x(t-h) 的泰勒展開相加,奇次項互相抵消,剩下一個只需要力就能推進的格式。

x_{n+1} = 2x_n - x_{n-1} + a_n h^2 + O(h^4), \qquad a_n = \frac{F(x_n)}{m}

位置型韋爾萊:時間可逆、每步達三階精度,只用一次力的計算,且不需要顯式的速度。

韋爾萊是辛的:它精確地保持相空間體積,並讓能量保持有界——在真值附近振盪,而非漂移遠離——即使跑上天文尺度那麼久也一樣。這正是分子動力學與太陽系程式碼採用韋爾萊家族積分子、而非 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。看看在同樣一次力的計算下,兩種方法各自表現如何。

\ddot{x} = -\omega^2 x, \qquad \omega = 1,\ \ x_0 = 1,\ v_0 = 0,\ h = 0.1

設定:一個純振子,其真實運動在任何時刻都守恆「能量」E \propto x^2 + v^2 = 1

尤拉法。 此刻加速度 a_0=-\omega^2 x_0=-1。於是 x_1 = x_0 + h v_0 = 1v_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 五位數字完全吻合——而所用的,正是尤拉法用的同一次力的計算。