如何寫出三體的MATLAB程序-理論分析篇
寫在前面
之所以寫這個程序,是因爲某天晚上無聊,室友正在學習MATLAB,於是提議寫一個三體運動的物理模擬程序來練練手。就此,我也寫一份該程序來爲室友做一個參考標準,希望可以幫助室友進步的更快。
做出來的效果圖大概這樣子
本系列所有代碼均在我的Github中存有備份,可下載後直接運行,點擊Github: HanpuLiang/Three-Body-by-MATLAB即可進入。
三體簡介
三體一般指的就是三個物體受到相互之間的引力作用的影響而運動。一般來說,因爲其運動方程太過於複雜,所以並沒有解析解,並且因爲對初值的敏感性,略微變化一點初始條件就會對未來長遠的結果產生巨大的影響。
在沒有解析解的情況下,只能通過數值解的方法對微分方程組求解。所以數值解的誤差也受計算步長的影響,計算步長越小越精確,但是因爲數據一定會有精度,並不能真正的無窮小,所以實際上在時間足夠長以後依舊會產生很大的誤差。
綜合很多原因,纔會有了大劉《三體》的劇情,不然憑藉三體人那麼厲害的科技水平還怎麼還是選擇來搞地球。
不過說到底,解不開這樣的問題還是目前人類的數學水平不行,或許以後就有辦法了呢?
但是我們這裏並不用分析力學的方法求解,因爲手頭沒有演草紙,推方程有點麻煩,所以直接用經典力學的方法去模擬整個運動,這樣子相信有點物理基礎的大家也是可以看懂的。
運動過程分析
我們首先需要思考:
- 三個小球到底是怎麼運動的?引力作用。
- 小球運動,哪些量在變化?位置改變導致引力大小改變,引力導致加速度改變,加速度導致速度改變,速度導致位置改變。
也就是說,我們只需要集中在三個物理量上面就好:座標,速度(大小與方向),加速度(大小與方向)。這就是我們所需要,隨着時間變化的,計算的所有數據。
接下來就要開始引進物理公式了。
兩個物體之間的加速度
首先,兩個物體之間的萬有引力可以通過公式
來計算,其中是物體1的質量,是物體2的質量,是引力系數(模擬中爲方便可以設爲1),爲物體1與物體2之間的直線距離。
根據力與加速度的公式就可以得到,在時刻,物體之間相對距離爲時(用上一次時間的距離算),加速度爲
兩個物體之間的速度
在單位時間內,兩個小球之間的速度變化量爲,所以可以得到時刻的速度爲
兩個小球的位置
令兩個小球的座標分別爲,則相對距離爲
同理,在時刻,受到速度由變化到的影響,可以簡單的得到此時刻的距離爲
其中
矢量的正交分解
衆所周知,位置、速度、加速度均爲矢量,即存在方向和大小這兩種屬性,也就是說我們需要考慮矢量方向不一致時的情況。
將矢量正交分解爲軸與軸是最簡單方便的做法。
首先是座標,這個已經是分解到了軸與軸這個座標系上了,畢竟我們寫出來的就是兩個點的座標,如果誰還不會用座標點繪圖就可以點右上角退出界面了。
其次是速度與加速度。我們以物體自身爲原點建立座標系,速度大小爲,方向相對軸正方向爲度,可以得到一個矢量如圖所示。根據高中知識,就可以得到其在軸與軸上的分解爲
同樣的,加速度也可以這樣子分解,得到
而且,軸上的加速度只會影響軸上的速度,所以我們分解後,在計算時,只需要分別計算軸的座標變化即可,不需要再考慮方向,即
這樣子,我們就將方向成功分解爲軸分解進行計算,大大化簡了繁瑣的方向變化問題。
矢量的疊加
但是這只是兩個物體之間的相互作用,如果是三個物體的話,其中一個物體就要受到兩個力的作用。
實際上兩個力是沒有受到干擾的,所以當其分解到軸後,直接將其對應軸上的加速度直接相加即可得到總的加速度,也就是
其中就是物體1在軸上的總的加速度,它由兩個分加速度組成:來自物體2對物體1的力的、在軸的加速度和來自物體3對物體1的。
其他同理,這樣子就可以完美解決所有問題了。
代碼思路
根據上面的公式分析,加速度、速度、距離之間如何變化已經很清楚了,三個物體之間的各個物理量的正交分解也很明確了,已經可以轉化爲了代碼可以實現的情況,下面我們就需要將公式化成代碼。
不過因爲這一篇博客已經比較長了,所以將本篇作爲理論分析篇,下一篇博客中我們再進行詳細解釋代碼。
如果這一篇我講的比較不錯的話,還希望可以點個贊、加個收藏、來個關注噢。