行星運動之數值模擬

在這個小單元中我們將帶著同學寫出可以做軌道運動模擬的程式,以及在做這些數值計算時所要用到的數值方法。

  1. 以Euler method計算行星運動
  2. 行星運動的動力就是牛頓的重力定律,而運動的法則就是牛頓第二運動定律。但是各位同學要特別留意到,這一個運動是一個平面的運動,也就是在二維的運動,與拋體運動相似,都是在平面上的運動。因此我們在做差分近似的時候,需要使用兩個座標變數(x,y)和兩個速度分量(vx,vy),當然也有兩個加速度分量(ax,ay)。而對應的牛頓運動方程式也是一個向量方程式:\[\vec{F}=m\vec{a}, \,\,\, \vec{a}=\frac{\vec{F}}{m}\] \[\vec{a}=\frac{d\vec{v}}{dt}=\frac{\vec{F}}{m}\] 而行星運動時所遭遇到的作用力就是行星與太陽之間的重力,根據牛頓的重力定律: \[\vec{F}=-\frac{GM_s m}{r^3}\vec{r}, \] 其中\(M_s\)是太陽的質量,\(m\)是行星的質量,\(r\)太陽與行星之間的距離,\(G=6.67 \times 10^{-11}\)是重力的宇宙常數。因此行星在太陽的重力場中運動的方程式如下: \[ \frac{d\vec{r}}{dt}=\vec{v} \] \[ \frac{d\vec{v}}{dt}=\vec{a}=\frac{\vec{F}}{m}=-\frac{GM_s}{r^3}\vec{r} \]
    運動的差分近似(Euler method) \[ \vec{r}(t+dt) \simeq \vec{r}(t)+\vec{v}(t)dt \] \[ \vec{v}(t+dt) \simeq \vec{v}(t)+\vec{a}(t)dt \] 為了簡化我們整個物理問題的公式形式,我們要選擇一個恰當的單位系統,如果將軌道運動視為一個圓週運動,那麼我們可以根據圓週運動的向心加速度的公式和週期的公式得到下面的結果: \[\frac{4\pi^2 m r}{T^2}=\frac{GM_s m}{r^2},\] \[\frac{r^3}{T^2}=\frac{GM_s}{4\pi^2} \,\,\,\, \text{(Kepler's 3rd law)}\] 這就是克卜勒的行星運動第三定律,行星運動的週期(T)的平方與行星運動的平均距離(r)的3次方成正比。將這個公式運用在我們的地球公轉上我們將會得到,\(T=1年,r=1AU\),AU=天文單位=地球與太陽之間的距離=\(1.5 \times 10^{11}\) 公尺。如果我們將時間的單位訂為年,距離的單位定為天文單位,那麼這個公式將簡化為 \[\frac{1^3}{1^2}=\frac{GM_s}{4\pi^2}, \,\,\, GM_s=4\pi^2\] 因此在這個單位系統中\(GM_s=4\pi^2\),地球在某一個時刻的坐標為\(\vec{r}=(1,0)\),而這個時刻的速度為\(\vec{v}=(0,2\pi) \,\, v=\frac{2\pi r}{T}=\frac{2\pi \cdot 1}{1}=2\pi\)。



    程式樣本1,1個行星運動(Euler method)




    程式樣本2,2個行星運動(Euler method)



  3. Euler-Cromer method
  4. 當我們在使用Euler method的時候我們用了兩次差分近似,一次是位置的差分近似,另外一個是速度的差分近似。當我們在使用他的時候,原則上應該都是用前一個時刻的位置與速度,因此在程式書寫的時候,到底哪一個差分近似先執行都沒有影響。但是如果我們先將速度更新,再用更新後的速度來做位置的更新,那麼這個方法就稱為Euler-Cromer method. 也就是說如果我們要使用Euler
    
        a1=np.array([-GM/r1n**3*r1[0],-GM/r1n**3*r1[1]])
        r1+=v1*dt
        v1+=a1*dt
    
    那麼這樣的順序是對的,因為r1的更新時所使用的速度v1,就是時間為t的時候的速度;v1更新時所使用的加速度,也是在時間為t的時候的加速度a1。Euler-Cromer method是將位置的更新與速度的更新的兩條指令對調
    
        a1=np.array([-GM/r1n**3*r1[0],-GM/r1n**3*r1[1]])
        v1+=a1*dt
        r1+=v1*dt
    
    如此一來雖然速度v1的更新,仍然是使用前一個時刻的加速度a1,但是位置r1的更新,所使用的速度並前一時刻的速度,而是已經更新過後的速度。所以如果我們的數值計算是用這種方式來進行的話,那麼將是兩種更新的混合。原則上我們並不知道哪一個方式會得到比較精確的結果,但是在實際應用中,似乎Euler-Cromer method都具有較高的精確度,例如下面的樣本程式就是比較Euler和Euler-Cromer計算一個行星運動的程式,我們從這個程式執行得到的數據作比較,可以明顯發現Euler-Cromer確實有相當大幅度的改進。



    程式樣本3,行星運動(Euler-Cromer method)



  5. Runge-Kutta 2nd order method
  6. 我們在前兩個單元已經可以看到RK2的方法在改進Euler method的精確度上面,確實有非常大的進展,現在我們也在軌道運動問題當中引入RK2的數值方法。 根據這些描述我們在下面提供的一個樣本程式,讓同學們可以參考如何使用RK2的方法來實現行星運動的數值模擬,並且你也可以透過數據間的比較理解到RK2確實在精確度上提供了很好的改善。


    程式樣本4,行星運動(RK2 method)