Lecture 6 雙星運動與日地月三行星運動
建國高中特色選修課程 - 物理現象的程式設計與模擬
作者:賴奕帆
日期:2018/8/08
一、雙星運動
雙星是觀測天文學的名詞,當兩顆恆星由地球上觀察時,在視線的方向上非常接近,以致以肉眼看起來像是只有一顆恆星,但使用望遠鏡時就能分辨出來是一對的恆星。這種情形可以發生在一對聯星,也就是有著互動的軌道,並且被彼此的引力束縛在一起。
獨立系統的兩個星球,彼此以萬有引力為向心力,繞共同質心運動,而圓周運動所需的向心力即為兩者之間的萬有引力,如天狼星與其伴星。
若與相距,則:(假設)
- 軌道半徑:與共同質心靜止不動,,
的軌道半徑 、 的軌道半徑 且 。 - 向心力 : 兩個星球,以彼此間的萬有引力為向心力。
、且。 - 向心加速度 :
、且。 - 軌道速度大小:
、且。 - 當,其結果可視為繞作圓周運動。
這堂課我們要將上堂課所學的衛星運動進化為雙星運動與日地月三星運動,首先是基礎的參數設定。
請參考以下範例程式:
Example 1 : Double star sports_start
"""
建國中學 Vpython物理模擬
作者: 物理科 賴奕帆老師
特色課程 Lecture 06 雙星運動與日地月三行星運動
6_01_Double star sports.py
"""
from vpython import * #引用視覺畫套件Vpython
"""
1. 參數設定,設定變數及定義萬有引力公式
"""
G = 6.67 ; m1 = 10 ; m2 = 3 ; R = 10 ; v_m2 = (G*m1/R)**0.5 ; t = 0 ; dt = 0.001
def Fg(x): #定義萬有引力函數
return -G*m1*m2/(x**2)
"""
2. 畫面設定
"""
scene = canvas(width=1200, height=800, center=vec(0,0,0),
background=vec(0.6,0.8,0.8),range=2*R)
ball_m1 = sphere(pos=vector(0,0,0), radius=1, color = color.blue, make_trail=True)
ball_m2 = sphere(pos=vector(R,0,0), radius=0.3, color = color.red, make_trail=True)
ball_m1_v = vector(0,0,0)
ball_m2_v = vector(0,v_m2,0)
"""
3. 執行迴圈
"""
while True:
rate(2000)
# 將純量改為向量
dist = ((ball_m1.pos.x-ball_m2.pos.x)**2+(ball_m1.pos.y-ball_m2.pos.y)**2+(ball_m1.pos.z-ball_m2.pos.z)**2)**0.5
##dist = mag(ball_m1.pos-ball_m2.pos) #mag可得純量
radiavector = (ball_m2.pos-ball_m1.pos)/dist
##radiavector = norm(ball_m2.pos-ball_m1.pos) #norm可得單位向量
Fg_vector = Fg(dist)*radiavector #行星所受萬有引力
ball_m2_v += Fg_vector/m2*dt #力生加速度, 產生速度變化
ball_m2.pos = ball_m2.pos + ball_m2_v*dt #速度產生位置變化
t = t+dt
-
可見一個紅色衛星受藍色行星引力作用而作圓周運動,但藍色行星應該也會受紅色衛星引力作用而運動才是?
-
讓藍色行星也會受力運動吧。
讓藍色行星m1也受萬有引力
""" 3. 執行迴圈"""
ball_m2_v += Fg_vector/m2*dt #力生加速度, 產生速度變化
ball_m2.pos = ball_m2.pos + ball_m2_v*dt #速度產生位置變化
ball_m1_v += ____________*dt #讓藍色行星m1也受力
ball_m1.pos = ball_m1.pos + ball_m1_v*dt #讓藍色行星m1開始運動
- 執行後,會看到m1與m2一起以特殊的軌跡向上運動。
- 由於m1的起始速率為0,而m2的起始速度方向向上,導致系統的質心速度(動量)方向向上導致而成,同學們可以嘗試看看,若把m2的速度方向改下,或是改成右上,整體系統就會往那個方向跑。
- 改變m2的初速度
ball_m2_v = vector(0.5*v_m2,0.5*v_m2,0)
- 觀察完記得初速度要改回來,讓我們繼續。
讓系統的質心動量為0
由於我們一開始設定,m1=10、m2=3,若m2的起始速度為vector(0,10,0),你認為m1的起始速度應該為何,才會使系統保持在原地不動呢? v1 = vector(0, ,0)
讓我們將程式中的系統質心動量改為0吧。
""" 修改衛星初速,使系統質心動量為0(2. 畫面設定)"""
ball_m1_v = vector(0,________,0) #給m1一個向下的速率,並使系統的總動量為零
ball_m2_v = vector(0,v_m2,0)
- 看起來是一個不錯的雙星運動,但軌跡好像不是想像中那麼漂亮個正圓形,為何呢?
- 其實若要是漂亮個圓形軌跡雙星運動,是一個非常critical的物理解。這個物理解在高二下學期第六章會教。
- 下一節我們就直接將導證公式放入程式之中吧。
- 其實地球與月亮也是一個雙星運動,但由於地球的質量約為月球的100倍,所以好像只是單純地球繞月球運動,讓我們改一下m1質量,改為300,玩看看吧。
m1 = 300
- 看到什麼結果呢?m2看起來也像是單純繞m1做圓周運動對吧?
- 玩完之後記得要改回來,繼續。
m1 = 10
課堂作業 6-1
利用圖表,討論雙星運動是否有遵守力學能守恆。
註:在雙星運動中,動能有兩個,而位能依然只有一個,其公式依然為
課堂作業 6-1 參考解法步驟 :
- 在畫面設定處,準備畫出動能1、動能2、位能與總力學能四條曲線
- 在執行迴圈處,分別計算任意瞬間的動能1、動能2、位能與總力學能
- 在執行迴圈處,將算出的能量匯入圖表之中。
理論的雙星運動
軌道半徑 | |||
向心力 | |||
向心加速度 | |||
軌道速率 |
讓我們把上表的軌道半徑與軌道速率鍵入程式之中吧。
"""帶入理想雙星運動的位置與速率,並得到完美的雙星正圓形的軌跡 (2. 畫面設定)"""
ball_m1 = sphere(pos=vector(___________,0,0), radius=1, color = color.blue, make_trail=true)
ball_m2 = sphere(pos=vector(___________,0,0), radius=0.3, color = color.red, make_trail=true)
ball_m1_v = vector(0, ___________,0)
ball_m2_v = vector(0, ___________,0)
- 請同學嘗試自行填入空格的程式碼,看看能否如上圖得到m1與m2都是漂亮的正圓形運動。
- 不過這個狀況只會出現在高中物理課本之中,畢竟真實世界不可能有那麼漂亮的結果,
- 但將理論帶入模擬,跑出漂亮的結果依舊讓人感動。
進階作業 6-1
請同學嘗試寫出理想的三星運動模型。
範例【指考】
質量均為m,且兩兩相距L之三個星球成一獨立系統,而環繞共同質心運動,求:
(1)向心加速度量值 (2)軌道速率 各為何?
【參考解答】
(1) 星球所受到其他兩個星體的引力為
(2) 質心與星球之間的距離為
代入向心加速度公式
得
進階作業 6-1 參考解法步驟 :
-
設定參數,包含質量、大小等,以三角形質心為圓點,將三個星球放置在三角型各自距離L的位置上。
-
讓三星彼此受到互相的萬有引力作用,並使其產生加速度,會因引力影響而使三星均往質心運動。
-
若更進一步,可以畫出衛星受力與合力的箭頭,更能由動畫中,觀察物體受力的感覺。
- 同學可以嘗試寫出理想的四星運動模型。
二、日地月三行星運動
接下來我們來繪製,日地月三星運動。
首先是基礎的參數設定,請參考以下範例程式:
Example 2 : Three star sports_start
"""
建國中學 Vpython物理模擬
作者: 物理科 賴奕帆老師
特色課程 Lecture 06 雙星運動與日地月三行星運動
6_02_Three star sports.py
"""
from vpython import * #引用視覺畫套件Vpython
"""
1. 參數設定,設定變數及定義萬有引力公式
"""
G = 6.67 ; m1 = 100; m2 = 10; m3 = 1; R_12 = 10; R_23 = 1; t = 0 ; dt = 0.001
v2 = (G*m1/R_12)**0.5
def Fg(x,y1,y2):
return -G*y1*y2/(x**2)
"""
2. 畫面設定
"""
scene = canvas(width=1200, height=800, center=vec(0,0,0),background=vec(0.6,0.8,0.8),range=2*R_12)
ball_m1 = sphere(pos=vector(0,0,0), radius=1, color = color.yellow, make_trail=True)
ball_m2 = sphere(pos=vector(R_12,0,0), radius=0.3, color = color.blue, make_trail=True)
ball_m3 = sphere(pos=vector(R_12+R_23,0,0), radius=0.1, color = color.red, make_trail=True)
ball_m1_v = vector(0,0,0) ; ball_m2_v = vector(0,v2,0) ; ball_m3_v = vector(0,0,0)
"""
3. 執行迴圈
"""
while True:
rate(1000)
# 地球受太陽的力與產生的運動
dist_12 = mag(ball_m1.pos-ball_m2.pos)
radiavector_12 = (ball_m2.pos-ball_m1.pos)/dist_12
Fg_12_vector = Fg(dist_12,m1,m2)*radiavector_12
ball_m2_v += Fg_12_vector/m2*dt
ball_m2.pos = ball_m2.pos + ball_m2_v*dt
t = t+dt
- 一藍色行星m2以正圓形,繞行黃色行星m1;旁邊還有一個不會動的紅色行星m3。
給紅色行星m3速度,並讓它受m1與m2的萬有引力
定義v3,v3是理論上m3以圓周運動繞行m2時的速率
"""月球相對地球作圓周運動的速度(1. 參數設定)"""
v3 = (G*m2/R_23)**0.5 #月球以圓周運動繞地球的速率
給m3速度,由於假定太陽是靜止坐標系,因此月球相對太陽的速率是v2+v3
"""當太陽為靜止觀察者時,觀察m3的速度為(2. 畫面設定)"""
ball_m3_v = vector(0,__________,0) #給月球速度(注意是v2+v3)
月球主要受兩個萬有引力,分別包含了地球m2與太陽m1給的力,要注意的是Dist_23是純量,代表m2與m3之間的距離;radiavector_23是單位向量,代表m2與m3之間的方向。
Fg_23_vector是向量,裡面包含了萬有引力的量值Fg(dist_23,m2,m3)與萬有引力的方向radiavector_23
"""月球受地球與太陽的萬有引力(3. 執行迴圈)"""
# 月球受地球的力
dist_23 = mag(ball_m2.pos - ball_m3.pos)
radiavector_23 = (ball_m3.pos-ball_m2.pos)/dist_23
Fg_23_vector = Fg(dist_23,m2,m3)*radiavector_23
# 月球受太陽的力
dist_13 = mag(________ -________)
radiavector_13 = (________-________)/dist_13
Fg_13_vector = Fg(_______,_______,________)*radiavector_13
註:這邊的單位向量其實也可以用norm()來替代,可以嘗試把radiavector_23改為
radiavector_23 = norm(ball_m3.pos-ball_m2.pos) , 結果會一樣。
最後,讓月球所受的萬有引力除上m3變成加速度,使其加速度控制速度與位置,讓其運動。
"""使月球開始受力運動(3. 執行迴圈)"""
ball_m3_v += (__________+__________)/m3*dt
ball_m3.pos = ball_m3.pos + ball_m3_v*dt
- 執行後,會看到m3果真以漂亮的軌跡同時繞行著地球與太陽運動。
課堂作業 6-2
請在日地月三星運動中,幫月球加入受地球、太陽與合力的向量箭頭,讓我們能利用動畫更清楚的理解為何月球能依此軌跡運動。
課堂作業 6-2 參考解法步驟 :
-
月球繪製三個受力向量箭頭(黃色是受太陽引力、藍色是受地球引力、黑色是所受合力)
-
在執行迴圈中讓箭頭隨著月球與所受引力運動
給黃色行星速度,嘗試看看日地月的優美運動。
讓黃色行星m1開始運動,使其往出螢幕方向移動,讓藍色行星與紅色行星繞其轉動。
"""讓黃色行星太陽有出螢幕方向的初速度(2. 畫面設定)"""
ball_m1_v = vector(0,0,2) #太陽有出螢幕方向的初速度
執行後會發現因為黃色行星的太陽會運動,導致三個行星一下就都離開畫面中心。怎辦呢?讓我們把黃色行星當成畫面中心吧。
"""更改黃色行星為畫面中心(3. 執行迴圈)"""
scene.center = __________ #將太陽改為螢幕中心
- 看起來相當完美,但實際上這個動畫仍然有一些問題。
- 請先把黃色行星的速度改回vector(0,0,0),讓藍色行星也受到紅色行星的萬有引力。
使藍色行星m2也受m3的萬有引力,讓它們更貼近真實。
"""讓地球m2也受到月球m3的萬有引力(3. 執行迴圈)"""
# 地球受太陽與月球的力與產生的運動
dist_12 = mag(ball_m1.pos - ball_m2.pos)
radiavector_12 = (ball_m2.pos-ball_m1.pos)/dist_12
Fg_12_vector = Fg(dist_12,m1,m2)*radiavector_12
dist_32 = mag(ball_m3.pos - ball_m2.pos)
radiavector_32 = (ball_m2.pos-ball_m3.pos)/dist_32
Fg_32_vector = Fg(dist_32,m3,m2)*radiavector_32
ball_m2_v += (Fg_12_vector+Fg_32_vector)/m2*dt
ball_m2.pos = ball_m2.pos + ball_m2_v*dt
- 這次應該會更加正確吧,結果沒想到,繞沒幾圈,居然爆炸了,到底發生了什麼事情呢?
- 理論上太陽質量極大,應該不用考慮太陽的受力和運動,同學們可以隨意調整看看三個行星之間的質量參數m1、m2、m3,和距離參數r12、r23,看能否調出漂亮的運動軌跡吧。(其實可以調出,還算漂亮的結果)
- 不然,我們就來帶入真實世界的數據吧。
帶入真實數據,看看真實的結果
讓我們改一下基本參數吧,讓參數符合真正的太陽地球與月球的數據
"""帶入真實數據(1. 參數設定)"""
G = 6.67*10**(-11) ; m1 = 1.9891*10**30 ; r1 = 6.955*10**8 ;
m2 = 5.9742*10**24 ; r2 = 6.3728*10**6 ; m3 = 7.342*10**22 ; r3 = 1.7371*10**6
R_12 = 1.496*10**11 ; R_23 = 3.84399*10**8
t = 0 ; dt = 100
由於太陽系太遼闊了,而地球與月球半徑相對非常小,因此我們也更改了動畫上地球與月球顯示的半徑大小,這樣才不會什麼都看不到。(可設定20倍大)
"""改變動畫球體大小(2. 畫面設定)"""
scene = canvas(width=1200, height=800,center=vec(0,0,0),background=vec(0.6,0.8,0.8),range=2*R_12)
ball_m1 = sphere(pos=vector(0,0,0), radius=____*r1, color = color.yellow, make_trail=True)
ball_m2 = sphere(pos=vector(R_12,0,0), radius=____*r2, color = color.blue, make_trail=True)
ball_m3 = sphere(pos=vector(R_12+R_23,0,0), radius=____*r3, color = color.red, make_trail=True)
再把執行速度條快,把dt改為100,若在rate(2000)下,真實中的一秒代表程式中的200000秒
-
執行後,看起來還可以,但地球與月球依然太小,且執行太慢。
-
先改執行速度,請將rate(1000)改成rate(10000)。
-
再把rate(10000)下面補上一行
scene.center = ball_m2.pos,改變觀察者視角
"""改變觀察者視角(3. 執行迴圈)"""
rate(10000)
scene.center = ball_m2.pos
最後,改scene中的range改成7*R_23
"""改變可視範圍尺寸(2. 畫面設定)"""
scene = canvas(width=1200, height=800, center=vec(0,0,0),background=vec(0.6,0.8,0.8),range=7*R_23)
- 看起來有沒有很棒呢?
讓我們算一下地球與月球週期,檢視是否正確吧
再一次利用「三點記錄法」,來找出月球與地球的週期吧
先定義六個參數pre_m1m2_rv、pre_pre_m1m2_rv、radiavector_12、
pre_m2m3_rv、pre_pre_m2m3_rv、radiavector_23
"""定義計算週期參數(1. 參數設定)"""
t1 = 0 ; t2 = 0 #t1給地球算週期 ; t2給月球算週期
#設定前太陽地球相對位置向量
pre_m1m2_rv = vector(0,0,0)
radiavector_12 = vector(0,0,0)
#設定前地球月球相對位置向量
pre_m2m3_rv = vector(0,0,0)
radiavector_23 = vector(0,0,0)
"""紀錄位置前三點(3. 執行迴圈)"""
while True:
rate(10000)
scene.center = ball_m2.pos
#設定前與前前太陽地球相對位置向量
pre_pre_m1m2_rv = pre_m1m2_rv
pre_m1m2_rv = vector(radiavector_12.x , radiavector_12.y,radiavector_12.z)
#設定前與前前地球月球相對位置向量
pre_pre_m2m3_rv = pre_m2m3_rv
pre_m2m3_rv = vector(radiavector_23.x , radiavector_23.y,radiavector_23.z)
"""利用尋找運動相對右端點位置,換算週期(3. 執行迴圈)"""
t = t+dt ; t1=t1+dt ; t2=t2+dt #加入時間t1給地球算週期, 等等t2給月算週期
#找地球相對太陽右端點位置
if _______________________ and _______________________ :
earth_T = t1/86400.0 #設定earth_T為地球週期
print ('earth_t=' , '%1.2f'%earth_T)
t1=0 #時間重置
#找月球相對地球右端點位置
if _______________________ > _______________________ :
moon_T = t2/86400.0 #設定earth_T為地球週期
print ('moon_T=' , '%1.2f'%moon_T)
t2=0 #時間重置
地球繞太陽週期是365.73天,很好,可是月球繞地球的週期,怎麼只有26.52天左右呢?哪裡有什麼問題,要等待我們解決。
進階作業 6-2
請修正前述周期的方法,找出真正的月球繞地球一次滿月的週期,請發揮同學問題解決的能力吧。
範例【指考】
月球繞地球一周需時27.3天,1年中有365.25天,求連續兩次月圓之間相隔多久? (即求農曆一個月是幾天?)
【觀念】月球公轉及自轉的時間均為27.3天
【觀念】兩次月圓之間,地球繞日公轉經過角,而月球繞地球公轉經過角
【參考解答】
設兩次月圓需天,對地球而言,天繞太陽轉角
對月球而言,天繞地球角
則整理後可得
進階作業 6-2 參考解法步驟 :
- 前述找週期的方法是當地球與月球相對太陽右端點位置時,重置列印t1與t2的時間,以計算地球與月球繞行週期。
- 但實際上一次滿月的時間是兩次日地月連線時間的週期,所以需重新修改if寫法,以利找出真正滿月的週期。
- 利用日地月連線計算所得的週期約為28.6日。
- 此處未考慮星體間軌道的傾角關係,且真實軌道也並非我們預設的正圓形軌道,我們以目前的條件設定下得到了合理的結果。
Lecture 6 作業完整參考解法
-
同學們,在看參考解之前,請先想清楚自己是否真的有花時間想過如何寫課堂作業和進階作業了呢?
-
學習無他,但求自己覺得好玩而已。
-
若真的想把一件事情學好,務必花時間才能掌握。
-
希望這邊的作業參考解法,真的都只是讓同學們拿來參考,而不是為了繳交作業的複製貼上。
-
想過了嗎? 那請點下面的網址吧。
本單元課程自2018.7.1日起已被瀏覽 3001 次