行星運動軌跡的程式實現

2021-09-06 18:13:17 字數 3445 閱讀 9884

這裡將以萬有引力和勢能動能守恆定律為基礎,實現行星運動軌跡.然後再假設有兩個固定的恆星,讓行星在這兩個恆星的力場中運動(這是三體問題的一種噢).前面我寫過關於混沌曲線的文章:混沌數學及其軟體模擬.這類混沌曲線的本質是乙個導數方程,即我不知道這條曲線是什麼樣子,也不知道這條曲線最終通往何處去,我只知道,曲線上的任意一點的切線方向,從而得到它下一點的位置.從而得到整條曲線上的頂點位置.學過物理的人都知道,太陽系中行星的運動軌跡大致是乙個橢圓,我們可以知道每個行星的橢圓方程.記得我剛學圖形學時,就看過乙個程式是太陽行星運動.但它不是以萬有引力為基礎的,只是讓球體繞著固定的橢圓軌跡旋轉.

本來我只打算使用萬有引力定律,沒有考慮勢能動能守恆定律.但程式執行後發現,由於沒有使用微積分,即使取樣間隔時間再小,誤差也很大.其實目前的演算法誤差也不小,呵呵,模擬一下吧,不要太計較.

先帖下基類**,這**與混沌數學及其軟體模擬中的很相似,即是乙個導數方程,用於由當前點計算下一點.

class

differentiationfunction

virtual

float getstarty() const

virtual

float getstartz() const

};

行星方程:

//

行星的導數曲線

class planet : public

differentiationfunction

void differentiate(float x, float y, float z, float

t,

float& outx, float& outy, float&outz)

float v = sqrt(2*m_ek/m_planet_weight);

float w = sqrt(m_planet_speed_x*m_planet_speed_x + m_planet_speed_y*m_planet_speed_y + m_planet_speed_z*m_planet_speed_z);

m_planet_speed_x *= v/w;

m_planet_speed_y *= v/w;

m_planet_speed_z *= v/w;

}float getextendt() const

float getstartx() const

float getstarty() const

float getstartz() const

public

:

float

m_star_weight;

float

m_planet_x;

float

m_planet_y;

float

m_planet_z;

float

m_planet_weight;

float

m_planet_speed_x;

float

m_planet_speed_y;

float

m_planet_speed_z;

float m_g; //

萬有引力係數

float

m_e;

float m_ek; //

動能float m_ep; //

引力勢能

行星在這兩個恆星的力場中運動(三體問題)

//

三體問題的導數曲線

class threebody : public

differentiationfunction

void differentiate(float x, float y, float z, float

t,

float& outx, float& outy, float&outz)

float v = sqrt(2*m_ek/m_planet_weight);

float w = sqrt(m_planet_speed_x*m_planet_speed_x + m_planet_speed_y*m_planet_speed_y + m_planet_speed_z*m_planet_speed_z);

m_planet_speed_x *= v/w;

m_planet_speed_y *= v/w;

m_planet_speed_z *= v/w;}}

float getextendt() const

float getstartx() const

float getstarty() const

float getstartz() const

public

:

float

m_star1_x;

float

m_star1_y;

float

m_star1_z;

float

m_star1_weight;

float

m_star2_x;

float

m_star2_y;

float

m_star2_z;

float

m_star2_weight;

float

m_planet_x;

float

m_planet_y;

float

m_planet_z;

float

m_planet_weight;

float

m_planet_speed_x;

float

m_planet_speed_y;

float

m_planet_speed_z;

float m_g; //

萬有引力係數

float

m_e;

float m_ek; //

動能float m_ep1; //

引力勢能

float m_ep2; //

引力勢能

這是我寫的測試程式,寫它是為下一步的三體模擬軟體做準備.下篇文章更精彩:三體運動的程式模擬

行星運動理論由來

人們自古就注意到了金星 木星 水星 火星 土星五大行星在天上的運動。古代巴比倫人已經相當準確地知道行星的公轉週期,並把觀測到的運動用經驗公式表示出來。中國也很早就測定了行星的公轉週期和會合週期,在馬王堆出土的帛書中就有這方面的記載。稍後,希臘人用幾何方法來解釋行星的運動,公元二世紀時出現的托勒密地心...

CSS 繪製太陽系行星執行軌跡

doctype html en utf 8 css3 動畫 title div.ex1 keyframes myfirst to webkit keyframes myfirst to div.ex2 keyframes myfirst2 25 50 100 webkit keyframes myf...

克卜勒行星運動第二定律在電子與原子核運動中的應用

克卜勒行星運動第二定律,也稱等面積定律,指的是太陽系中太陽和運動中的行星的連線 矢徑 在相等的時間內掃過相等的面積。其實你們會發現,電子繞著原子核轉,也是二次反比關係.也就是說,指的是電子核周圍,電子核和運動中的電子的連線 矢徑 在相等的時間內掃過相等的面積。同樣的,電子相對於電子核也具有 近地點 ...