如何寫出三體的MATLAB程序-理論分析篇
寫在前面
之所以寫這個程序房揭,是因為某天晚上無聊棚瘟,室友正在學習MATLAB蝇棉,于是提議寫一個三體運動的物理模擬程序來練練手。就此澜倦,我也寫一份該程序來為室友做一個參考標準聚蝶,希望可以幫助室友進步的更快。
做出來的效果圖大概這樣子
本系列所有代碼均在我的Github中存有備份藻治,可下載后直接運行碘勉,點擊Github: HanpuLiang/Three-Body-by-MATLAB即可進入。
三體簡介
三體一般指的就是三個物體受到相互之間的引力作用的影響而運動桩卵。一般來說验靡,因為其運動方程太過于復(fù)雜倍宾,所以并沒有解析解,并且因為對初值的敏感性胜嗓,略微變化一點初始條件就會對未來長遠的結(jié)果產(chǎn)生巨大的影響高职。
在沒有解析解的情況下,只能通過數(shù)值解的方法對微分方程組求解辞州。所以數(shù)值解的誤差也受計算步長的影響怔锌,計算步長越小越精確,但是因為數(shù)據(jù)一定會有精度变过,并不能真正的無窮小埃元,所以實際上在時間足夠長以后依舊會產(chǎn)生很大的誤差。
綜合很多原因媚狰,才會有了大劉《三體》的劇情岛杀,不然憑借三體人那么厲害的科技水平還怎么還是選擇來搞地球。
不過說到底崭孤,解不開這樣的問題還是目前人類的數(shù)學水平不行类嗤,或許以后就有辦法了呢?
但是我們這里并不用分析力學的方法求解裳瘪,因為手頭沒有演草紙土浸,推方程有點麻煩,所以直接用經(jīng)典力學的方法去模擬整個運動彭羹,這樣子相信有點物理基礎(chǔ)的大家也是可以看懂的黄伊。
運動過程分析
我們首先需要思考:
- 三個小球到底是怎么運動的?引力作用派殷。
- 小球運動还最,哪些量在變化?位置改變導(dǎo)致引力大小改變毡惜,引力導(dǎo)致加速度改變拓轻,加速度導(dǎo)致速度改變,速度導(dǎo)致位置改變经伙。
也就是說扶叉,我們只需要集中在三個物理量上面就好:坐標,速度(大小與方向)帕膜,加速度(大小與方向)枣氧。這就是我們所需要,隨著時間變化的垮刹,計算的所有數(shù)據(jù)达吞。
接下來就要開始引進物理公式了。
兩個物體之間的加速度
首先荒典,兩個物體之間的萬有引力可以通過公式
來計算酪劫,其中是物體1的質(zhì)量吞鸭,
是物體2的質(zhì)量,
是引力系數(shù)(模擬中為方便可以設(shè)為1)覆糟,
為物體1與物體2之間的直線距離刻剥。
根據(jù)力與加速度的公式就可以得到,在
時刻滩字,物體之間相對距離為
時(用上一次時間的距離算)透敌,加速度為
兩個物體之間的速度
在單位時間內(nèi),兩個小球之間的速度變化量
為
踢械,所以可以得到
時刻的速度為
兩個小球的位置
令兩個小球的坐標分別為,則相對距離為
同理魄藕,在時刻内列,受到速度由
變化到
的影響,可以簡單的得到此時刻的距離為
其中
矢量的正交分解
眾所周知背率,位置话瞧、速度、加速度均為矢量寝姿,即存在方向和大小這兩種屬性交排,也就是說我們需要考慮矢量方向不一致時的情況。
將矢量正交分解為軸與
軸是最簡單方便的做法饵筑。
首先是坐標埃篓,這個已經(jīng)是分解到了軸與
軸這個坐標系上了,畢竟我們寫出來的就是兩個點的坐標根资,如果誰還不會用坐標點繪圖就可以點右上角退出界面了架专。
其次是速度與加速度。我們以物體自身為原點建立坐標系玄帕,速度大小為部脚,方向相對
軸正方向為
度,可以得到一個矢量如圖所示裤纹。根據(jù)高中知識委刘,就可以得到其在
軸與
軸上的分解為
同樣的,加速度也可以這樣子分解鹰椒,得到
而且挠他,軸上的加速度只會影響
軸上的速度,所以我們分解后余佛,在計算時滨嘱,只需要分別計算
軸的坐標變化即可,不需要再考慮方向灿椅,即
這樣子套蒂,我們就將方向成功分解為軸分解進行計算钞支,大大化簡了繁瑣的方向變化問題。
矢量的疊加
但是這只是兩個物體之間的相互作用操刀,如果是三個物體的話烁挟,其中一個物體就要受到兩個力的作用。
實際上兩個力是沒有受到干擾的骨坑,所以當其分解到軸后撼嗓,直接將其對應(yīng)軸上的加速度直接相加即可得到總的加速度,也就是
其中就是物體1在
軸上的總的加速度欢唾,它由兩個分加速度組成:來自物體2對物體1的力的且警、在
軸的加速度
和來自物體3對物體1的
。
其他同理礁遣,這樣子就可以完美解決所有問題了斑芜。
代碼思路
根據(jù)上面的公式分析,加速度祟霍、速度杏头、距離之間如何變化已經(jīng)很清楚了,三個物體之間的各個物理量的正交分解也很明確了沸呐,已經(jīng)可以轉(zhuǎn)化為了代碼可以實現(xiàn)的情況醇王,下面我們就需要將公式化成代碼。
不過因為這一篇博客已經(jīng)比較長了崭添,所以將本篇作為理論分析篇寓娩,下一篇博客中我們再進行詳細解釋代碼。
如果這一篇我講的比較不錯的話滥朱,還希望可以點個贊根暑、加個收藏、來個關(guān)注噢徙邻。