如何寫出三體的MATLAB程序-理論分析篇 如何寫出三體的MATLAB程序-理論分析篇

如何寫出三體的MATLAB程序-理論分析篇

寫在前面

之所以寫這個程序,是因爲某天晚上無聊,室友正在學習MATLAB,於是提議寫一個三體運動的物理模擬程序來練練手。就此,我也寫一份該程序來爲室友做一個參考標準,希望可以幫助室友進步的更快。

做出來的效果圖大概這樣子

本系列所有代碼均在我的Github中存有備份,可下載後直接運行,點擊Github: HanpuLiang/Three-Body-by-MATLAB即可進入。

三體簡介

三體一般指的就是三個物體受到相互之間的引力作用的影響而運動。一般來說,因爲其運動方程太過於複雜,所以並沒有解析解,並且因爲對初值的敏感性,略微變化一點初始條件就會對未來長遠的結果產生巨大的影響。

在沒有解析解的情況下,只能通過數值解的方法對微分方程組求解。所以數值解的誤差也受計算步長的影響,計算步長越小越精確,但是因爲數據一定會有精度,並不能真正的無窮小,所以實際上在時間足夠長以後依舊會產生很大的誤差。

綜合很多原因,纔會有了大劉《三體》的劇情,不然憑藉三體人那麼厲害的科技水平還怎麼還是選擇來搞地球。

不過說到底,解不開這樣的問題還是目前人類的數學水平不行,或許以後就有辦法了呢?

但是我們這裏並不用分析力學的方法求解,因爲手頭沒有演草紙,推方程有點麻煩,所以直接用經典力學的方法去模擬整個運動,這樣子相信有點物理基礎的大家也是可以看懂的。

運動過程分析

我們首先需要思考:

  • 三個小球到底是怎麼運動的?引力作用。
  • 小球運動,哪些量在變化?位置改變導致引力大小改變,引力導致加速度改變,加速度導致速度改變,速度導致位置改變。

也就是說,我們只需要集中在三個物理量上面就好:座標,速度(大小與方向),加速度(大小與方向)。這就是我們所需要,隨着時間變化的,計算的所有數據。

接下來就要開始引進物理公式了。

兩個物體之間的加速度

首先,兩個物體之間的萬有引力可以通過公式

F=G\dfrac{m_1m_2}{r^2}

來計算,其中m_1是物體1的質量,m_2是物體2的質量,G是引力系數(模擬中爲方便可以設爲1),r爲物體1與物體2之間的直線距離。

根據力與加速度的公式F=ma就可以得到,在t時刻,物體之間相對距離爲r(t-1)時(用上一次時間的距離算),加速度爲

\text{物體1的加速度: }\quad a_1(t)=G\dfrac{m_2}{r(t-1)^2}

\text{物體2的加速度: }\quad a_2(t)=G\dfrac{m_1}{r(t-1)^2}

兩個物體之間的速度

在單位時間\Delta t內,兩個小球之間的速度變化量\Delta v\Delta v=a\Delta t,所以可以得到t時刻的速度爲

\text{物體1的速度: }\quad v_1(t)=v_1(t-1) + a_1(t)\Delta t

\text{物體2的速度: }\quad v_2(t)=v_2(t-1) + a_2(t)\Delta t

兩個小球的位置

令兩個小球的座標分別爲(x_1, y_1), (x_2, y_2),則相對距離爲

r = \sqrt{(x_1-x_2)^2+(y_1-y_2)^2}

同理,在t時刻,受到速度由v(t-1)變化到v(t)的影響,可以簡單的得到此時刻的距離爲

r(t) = r(t-1) + \Delta r

其中

\Delta r = \dfrac12(v(t-1) + v(t))\Delta t.

矢量的正交分解

衆所周知,位置、速度、加速度均爲矢量,即存在方向和大小這兩種屬性,也就是說我們需要考慮矢量方向不一致時的情況。

將矢量正交分解爲x軸與y軸是最簡單方便的做法。

首先是座標,這個已經是分解到了x軸與y軸這個座標系上了,畢竟我們寫出來的就是兩個點的座標,如果誰還不會用座標點繪圖就可以點右上角退出界面了。

其次是速度與加速度。我們以物體自身爲原點建立座標系,速度大小爲v,方向相對x軸正方向爲\theta度,可以得到一個矢量如圖所示。根據高中知識,就可以得到其在x軸與y軸上的分解爲

v_x(t) = v(t)\cos\theta

v_y(t) = v(t)\sin\theta,

同樣的,加速度也可以這樣子分解,得到

a_x(t) = a(t)\cos\theta

a_y(t) = a(t)\sin\theta.

而且,x軸上的加速度只會影響x軸上的速度,所以我們分解後,在計算時,只需要分別計算xy軸的座標變化即可,不需要再考慮方向,即

v_x(t) = v_x(t-1) + a_x(t)\Delta t.

這樣子,我們就將方向成功分解爲xy軸分解進行計算,大大化簡了繁瑣的方向變化問題。

矢量的疊加

但是這只是兩個物體之間的相互作用,如果是三個物體的話,其中一個物體就要受到兩個力的作用。

實際上兩個力是沒有受到干擾的,所以當其分解到xy軸後,直接將其對應軸上的加速度直接相加即可得到總的加速度,也就是

a_{1x}(t) = a_{12x}(t) + a_{13x}(t),

其中a_{1x}就是物體1在x軸上的總的加速度,它由兩個分加速度組成:來自物體2對物體1的力的、在x軸的加速度a_{12x}和來自物體3對物體1的x_{13x}

其他同理,這樣子就可以完美解決所有問題了。

代碼思路

根據上面的公式分析,加速度、速度、距離之間如何變化已經很清楚了,三個物體之間的各個物理量的正交分解也很明確了,已經可以轉化爲了代碼可以實現的情況,下面我們就需要將公式化成代碼。

不過因爲這一篇博客已經比較長了,所以將本篇作爲理論分析篇,下一篇博客中我們再進行詳細解釋代碼。

如果這一篇我講的比較不錯的話,還希望可以點個贊、加個收藏、來個關注噢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章