回上方

Lecture 4 彈性碰撞

建國高中特色選修課程 - 物理現象的程式設計與模擬
作者:賴奕帆
日期:2018/7/25


一、一維彈性碰撞

  • 考慮在光滑水平面上一維空間的正面彈性碰撞,如下圖所示,有質量分別為 mAmBAB兩物體,起始時AB兩物體一後一前,分別以vAvB的初速度向右方移動,由於vA>vB,因此A物體向B物體靠近。
  • 當兩物體開始接觸時,因物體變形而產生互相推擠的交互作用力,此交互作用力是一對作用力和反作用力,當碰撞結束後兩物體分離,此時兩物體的速度分別為vAvBvB>vA)。

如果碰撞過程中,若只有保守力作功,即沒有摩擦力或其他阻力作用下。
則碰撞前後遵守動量守恆(含碰撞過程中),即

mAvA+mBvB=mAvA+mBvB

與碰撞前後遵守動能守恆(不含碰撞過程中),即

12mAvA2+12mBvB2=12mAvA2+12mBvB2

將上述兩式聯立運算後可得碰撞後的分離速度:

vA=mAmBmA+mBvA+2mBmA+mBvB

vB=2mAmA+mBvA+mBmAmA+mBvB

範例:若兩木塊質量分別為mA=2mB=1,速度分別為vA=6vB=3,在一光滑平面作一維彈性碰撞,請問碰撞後的末速分別為何?

vA=212+1×6+2×12+1×3=∼∼∼∼∼∼

vB=2×22+1×6+121+2×3=∼∼∼∼∼∼

Example 1 : 1D_collision_constant _force_start

""" 建國中學 Vpython物理模擬 作者: 物理科 賴奕帆老師 日期: 107/07/25 特色課程 Lecture 04 碰撞 4_01_1D_collision_constant force.py """ from vpython import * #引用視覺畫套件Vpython """ 1. 參數設定 """ m1 = 2.0 #球1質量 x1 = -20.0 #球1X軸初位置 v1= 6.0 #球1初速度 size1 = 1.0 #球1大小 m2 = 1.0 #球2質量 x2 = 0.0 #球2X軸初位置 v2= 3.0 #球2初速度 size2 = 1.0 #球2大小 Force = 5.0 #彈力大小 spring_L = 5.0 #彈簧長度 """ 2. 畫面設定 """ scene = canvas(width=1000, height=300, background=vec(0.6,0.8,0.8), center=vec(5,0,10),forward=vec(0,0,-1),range=8)#設定畫面 ball1 = sphere(radius=size1, color = color.red) #設定球1 ball1.pos = vector(x1,0,0) #球1位置 ball1.v = vector (v1,0,0) #球1的速度 v1_arrow = arrow(pos=ball1.pos,axis=ball1.v,shaftwidth=0.2*size1 ,color = color.red) ball2 = sphere(radius=size2, color = color.blue) #設定球2 ball2.pos = vector(x2,0,0) #球2位置 ball2.v = vector (v2,0,0) #球2的速度 v2_arrow = arrow(pos=ball2.pos,axis=ball2.v,shaftwidth=0.2*size2 ,color = color.blue) spring = helix(pos=ball2.pos, radius=0.5, thickness =0.1) #畫彈簧 spring.coils = 10 spring.axis = vector(-spring_L,0,0) t = 0 #時間 dt = 0.001 #單位時間 x_t = graph(align='left',width=333,height=300, #畫x-t圖 title='x-t', xtitle='t', ytitle='x', foreground=color.black,background=color.white, xmax=8, xmin=0, ymax=20, ymin=-10) f1_1 = gcurve(color=color.red) f1_2 = gcurve(color=color.blue) v_t = graph(align='left',width=333,height=300, #畫v-t圖 title='vx-t', xtitle='t', ytitle='vx', foreground=color.black,background=color.white, xmax=8, xmin=0, ymax=10, ymin=0) f2_1 = gcurve(color=color.red) f2_2 = gcurve(color=color.blue) a_t = graph(align='left',width=333,height=300, #畫a-t圖 title='ax-t', xtitle='t', ytitle='ax', foreground=color.black,background=color.white, xmax=8, xmin=0, ymax=10, ymin=-10) f3_1 = gcurve(color=color.red) f3_2 = gcurve(color=color.blue) """ 3. 執行迴圈 """ while True : rate(1000) ball1.pos = ball1.pos ball2.pos = ball2.pos t=t+dt

  • 執行後,可看到紅色的球ball1、藍色的球ball2、彈簧與兩顆球的速度箭頭等物件,現在都還不會動。
  • 在程式中的畫面設定裡面,有準備描繪出這兩顆球運動中的x-t、v-t與a-t圖,但目前還沒呈現出來。

球一與球二開始等速度運動

先讓兩顆球等速度前進,但兩顆球之間還沒有相互的作用力。
別忘了,球動的同時,也要讓彈簧與速度向量的箭頭移動

""" 讓球1與球2開始運動,並且標示速度向量(3. 執行迴圈)""" ball1.pos = ball1.pos+ball1.v*dt #控制球1的運動 ball2.pos = ball2.pos+__________ #控制球2的運動 v1_arrow.pos = ball1.pos #球1速度向量箭頭的起始點在球1上 v1_arrow.axis = ball1.v #球1速度向量箭頭的長度與方向等於球1速度 v2_arrow.pos = ___________ #球2速度向量箭頭的起始點在球2上 v2_arrow.axis = ___________ #球1速度向量箭頭的長度與方向等於球2速度 spring.pos=__________ #彈簧的起始點位置在球2上

  • 執行後,紅色球m1直接穿過藍色球m2,兩顆球目前並沒有任何直接聯繫,接下來讓它們兩球之間有作用力吧

讓球一與球二在碰撞中產生作用力,力產生加速度,加速度改變速度

我們先讓兩顆球之間的作用力為定力,這樣概念略為簡單,已經有先定義定力的大小為[Force = 5 #彈力大小],當兩顆球的距離比彈簧長度[spring_L = 5 #彈簧長度]還近的時候,彼此之間就會產生一個反方向的彈力。
當然,這個判斷是否要受力的if程式碼,要寫在控制兩球運動之前

""" 讓兩球碰撞過程中受力,並改變運動狀態(3. 執行迴圈)""" if abs(ball2.pos - ball1.pos) < _________ : #如果兩球的距離比彈簧長度短,則產生受力(加速度) ball1_a = -1 * Force / m1 #若稱球1的力是受力 ball2_a = _____________ #則球二的受力是反作用力 spring.axis = ball1.pos-ball2.pos else : #如果沒有,兩球的加速度均為0 ball1_a = 0 ball2_a = 0 spring.axis = vector(-spring_L,0,0) ball1.v = ball1.v + vector(ball1_a,0,0) *dt #加速度是向量,所以要用vector(ball1_a,0,0) ball2.v = ball2.v + ___________________

  • 執行後,這次明顯能看出,紅球m1在碰撞過程中,受到向左的力,而藍球m2受到向右的力,但我們怎知道執行結果確實是正確的呢?

  • 讓我們將兩球的x-t圖、v-t圖與a-t圖都補上去看看吧。

""" 繪製x-t;v-t;a-t函數圖(3. 執行迴圈)""" f1_1.plot( pos=(t,ball1.pos.x)) f2_1.plot( pos=(t,ball1.v.x)) f3_1.plot( pos=(t,ball1_a)) f1_2.plot( pos=(t,_________)) f2_2.plot( pos=(t,_________)) f3_2.plot( pos=(t,_________))

  • 畫出來了,看起來相當不錯,x-t圖是持續的向前,v-t圖在碰撞過程中,斜率是一個定值,這代表受力是定力,也能清楚觀察到,碰撞後的速度數值。

  • 我們原先設定的參數為m1 = 2kg、m2=1kg、v1=6m/s、v2=3m/s,若代入前述的分離速度公式可得

v1=212+1×6+2×12+1×3=4

vB=2×22+1×6+121+2×3=7

  • v1’=4m/s、v2’=7m/s,與模擬結果相同。
  • 同學們可以嘗試改幾個有趣的數值,
    Ex1 : m1=4 ; m2 =4 ; v1 = 6 ; v2 = 0
    Ex2 : m1=4 ; m2 =800 ; v1 = 6 ; v2 = 0
    Ex3 : m1 = 800 ; m2 = 2 ; v1 = 6 ; v2 = 0
  • 好玩嗎,玩完了,記得改回原本的參數喔。
    (m1 = 2 ; m2 = 1 ; v1 = 6 ; v2 = 3)

讓碰撞中產生的作用力,代換成真正的彈力

讓我們把程式改的更真實一點吧,代入彈力公式,F=kx
首先在定義的地方,把原本的定力大小[Force = 5 #彈力大小],改成彈力常數[spring_k = 2.0 #彈力常數]

""" 設定彈力常數(1. 參數設定)""" spring_k = 2.0 #彈力常數 (原本是Force = 5.0 #彈力大小)

再將原本判斷if是否受力的程式碼部分,改成虎克定律F=kx的寫法,注意x是彈簧形變量。

""" 改變彈簧受力改為虎克定律(3. 執行迴圈)""" if abs(ball2.pos - ball1.pos) <= spring_L : ball1_a = -1 * spring_k * (spring_L - ( ball2.pos.x - ball1.pos.x )) / m1 ball2_a = _____________________________________ #同樣的別忘了作用力與反作用力

  • 雖然動畫看起來好像沒什麼差別,但實際上的v-t圖與a-t圖,卻有很明顯的變化,結果是相當讓人滿意的。

  • 最特別的是,雖然我們把兩球作用力改為真正的彈力,但卻不會改變受力後的末速度,依然是v1’ = 4 ; v2’= 7。

  • 依然遵守由動量守恆與動能守恆兩式推導出的分離速度公式。

  • 最後,同學們,可以嘗試改[spring_k = 2.0 #彈力常數],改成更大或更小,玩看看吧。


二、三維彈性碰撞

上述我們成功的完成了一維彈性碰撞,但若仔細看一下程式碼,其中位置與速度本來就是向量,但彈簧的受力與加速度是僅有x軸的純量寫法,因此目前兩球間的受力只有x軸有作用。
讓我們把彈簧彈力與加速度改成向量,將純量的一維升級為向量的三維彈性碰撞吧。

""" 將彈簧受力與加速度改為向量(3. 執行迴圈)""" ball1_a = -1 * norm(ball2.pos-ball1.pos) * spring_k * (spring_L - abs( ball2.pos - ball1.pos )) / m1 ball2_a = ________________________________________ ball1.v = ball1.v + ball1_a *dt ball2.v = ball2.v + _________
  • 其中的norm是把向量改為單位向量,簡單來說,norm(ball2.pos-ball1.pos) 是ball1指向ball2的方向,而其量值是1,加入這個norm的指令,就能把ball_a改為向量。

  • 還有發生錯誤嗎? 由於現在ball1_a已經改為向量,所以在畫a-t圖時,也要修改為f3_1.plot( pos=(t,ball1_a.x)),不然會當掉。

  • 執行後好像沒什麼變化,但實際上,現在彈力已經是可以在三維度中使用了,讓我們改一下m1的y軸位置,或是速度方向,嘗試一下三維碰撞吧。

將球1的位置稍微調高一些,ball1.pos = vector(-20,2,0)

  • 三維彈性碰撞中
  • 碰撞結束
  • 這邊我們觀察到彈簧的存在讓動畫顯示有一點奇怪。可以將彈簧拔除,並將兩球的半徑略增加,現在設定是當兩球球心距離小於5時產生彈力,可以將兩球半徑改為2.5,並且讓兩球略為透明(opacity = 0.6),這樣動畫看起來會更舒服些。
  • 下面三個x-t, v-t , a-t 圖已經沒用,可以暫時刪去。


  • 彈簧修去之後感覺更加舒服了。
  • 可將彈力常數K值調大,這樣兩球碰撞時間會變短,也不會凹陷。

三、一維碰撞(公式解)

在上節,我們讓兩球受到真正的彈力作用,但若在程式碼內能直接代入高中物理所教的公式,能有效簡化碰撞的程式運算。

Example 2 : collision with formula_X_start

""" 建國中學 Vpython物理模擬 作者: 物理科 賴奕帆老師 日期: 107/07/25 特色課程 Lecture 04 碰撞 4_02_collision with formula_X.py """ from vpython import * #引用視覺畫套件Vpython """ 1. 參數設定 """ g=9.8 #重力加速度 9.8 m/s^2 size = 1 #球半徑 m1 = 2 #球1質量 m2 = 2 #球2質量 x_1 = 0.0 #球1初始位置 v_1 = 6 #球1初速度 x_2 = 10.0 #球2初始位置 v_2 = 0 #球2初速度 dt = 0.001 #時間間隔 0.001 秒 """ 2. 畫面設定 """ scene = canvas(width=1000, height=400, center = vec(10,0,0), background=vec(0.6,0.8,0.8),range=10) #設定畫面 wall_1 = box (pos=vec(-5,0,0), length=0.5, height=4, width=4, color=color.blue) wall_2 = box (pos=vec(25,0,0), length=0.5, height=4, width=4, color=color.blue) ball_1 = sphere(radius = size, color=color.yellow ) #畫球1 ball_2 = sphere(radius = size, color=color.green ) #畫球2 ball_1.pos = vector( x_1, 0, 0) #球1初始位置 ball_1.v = vector( v_1, 0, 0) #球1初速 ball_2.pos = vector( x_2, 0, 0) #球2初始位置 ball_2.v = vector( v_2, 0, 0) #球2初速 v1_lab = label(pos=vec(2.0,5.0,0), box = True , color = color.black) v2_lab = label(pos=vec(2.0,3.0,0), box = True , color = color.black) """ 3. 執行迴圈 """ while True: rate(1000) #每一秒跑 1000 次 ball_1.pos = ball_1.pos + ball_1.v*dt ball_2.pos = ball_2.pos + ball_2.v*dt if ball_1.pos.x > 25 or ball_1.pos.x < -5: ball_1.v = - ball_1.v if ball_2.pos.x > 25 or ball_2.pos.x < -5: ball_2.v = - ball_2.v v1_lab.text = str('v1 = %1.1f m/s'%ball_1.v.x) v2_lab.text = str('v2 = %1.1f m/s'%ball_2.v.x)

  • 執行後,可看到兩球直線前進,彼此之間不會相互影響。
  • 左上角顯示兩球的X軸方向速度。
  • 左右有牆壁,球會在牆壁間往復運動。

將一維碰撞公式代入程式之中

高二物理第八章,兩球若在一維運動中,碰撞過程沒有損耗能量,則會遵守一維彈性碰撞公式。

vA=mAmBmA+mBvA+2mBmA+mBvB

vB=2mAmA+mBvA+mBmAmA+mBvB

讓我們把此公式直接寫入程式之中。

""" 讓兩球碰撞後,瞬間改為碰撞速度(3. 執行迴圈)""" if mag(ball_1.pos-ball_2.pos) <= 2*size : v1x = (m1-m2)*ball_1.v.x/(m1+m2) + 2*m2*ball_2.v.x/(m1+m2) v2x = ________________________+ _______________________ ball_1.v = vector (v1x , 0 , 0) ball_2.v = vector (v2x , 0 , 0)
  • 兩球碰到瞬間即完成碰撞。
  • 此時碰撞速度變化的內涵是由公式寫入,雖然不及上節方式富含物理意義,但對電腦來說,執行節省資源,且結果相同。
  • 目前設定兩球的質量相同,因此每次碰撞都是單純的速度交換,同學可以嘗試改變質量初速度,玩玩看吧。
  • 譬如再測試m1=2m2=1,速度分別為v1=6v2=3

Example 3 : collision with formula_Y_start

換成Y軸來嘗試看看,這次還加入重力加速度。

""" 建國中學 Vpython物理模擬 作者: 物理科 賴奕帆老師 日期: 107/07/25 特色課程 Lecture 04 碰撞 4_02_collision with formula_Y.py """ from vpython import * #引用視覺畫套件Vpython """ 1. 參數設定 """ m1 = 1 m2 = 10 g=9.8 #重力加速度 9.8 m/s^2 size = 1 #球半徑 1 m height_1 = 20.0 #球1初始高度 height_2 = 18.0 #球2初始高度 dt = 0.001 #時間間隔 0.001 秒 """ 2. 畫面設定 """ scene = canvas(width=400, height=600, center = vec(0,height_1,0), background=vec(0.6,0.8,0.8)) #設定畫面 floor = box(length=15, height=0.01, width=10, color=color.blue) #畫地板 ball_1 = sphere(radius = size, color=color.yellow ) #畫球 ball_2 = sphere(radius = size, color=color.green ) #畫球 ball_1.pos = vector( 0, size+height_1, 0) #球初始位置 ball_1.v = vector( 0, 0, 0) #球初速 ball_2.pos = vector( 0, size+height_2, 0) #球初始位置 ball_2.v = vector( 0, 0, 0) #球初速 y1_lab = label(pos=vec(8.0,20.0,0), box = True , color = color.black) y2_lab = label(pos=vec(8.0,12.0,0), box = True , color = color.black) v1_lab = label(pos=vec(8.0,16.0,0), box = True , color = color.black) v2_lab = label(pos=vec(8.0,8.0,0), box = True , color = color.black) """ 3. 執行迴圈 """ while True: rate(1000) #每一秒跑 1000 次 ball_1.pos += ball_1.v*dt ball_1.v.y += - g*dt if ball_1.pos.y <= size and ball_1.v.y < 0: ball_1.v.y = - 1* ball_1.v.y ball_2.pos += ball_2.v*dt ball_2.v.y += - g*dt if ball_2.pos.y <= size and ball_2.v.y < 0: ball_2.v.y = - 1* ball_2.v.y y1_lab.text = str('y1 = %1.1f m'%ball_1.pos.y) y2_lab.text = str('y2 = %1.1f m'%ball_2.pos.y) v1_lab.text = str('v1 = %1.1f m/s'%ball_1.v.y) v2_lab.text = str('v2 = %1.1f m/s'%ball_2.v.y)

  • 執行後,可看到兩球在Y軸上原地彈跳,彼此之間不會相互影響。
  • 右邊可看到兩球即時的Y軸位置與速度變化。

再一次將一維碰撞公式代入程式之中

vA=mAmBmA+mBvA+2mBmA+mBvB

vB=2mAmA+mBvA+mBmAmA+mBvB

""" 讓兩球碰撞後,瞬間改為碰撞速度(3. 執行迴圈)""" if mag(ball_1.pos-ball_2.pos) <= 2*size : v1y = ________________________+ _______________________ v2y = ________________________+ _______________________ ball_1.v = vector (0 , v1y , 0) ball_2.v = vector (0 , v2y , 0)

  • 碰撞瞬間,因為m2>>m1,v1獲得極大的速率(48m/s)。

  • 且最大彈跳高度可達128m

  • 讓我們玩一玩吧,原本的m1 = 1 ; m2 = 10 ,若把質量顛倒,m1 = 10 ; m2 =1,其結果會如何呢?

  • 有辦法將一維碰撞公式改為三維的嗎?

四、三維碰撞(公式解)

上節我們將高中的一維碰撞公式解寫入程式碼中並正確執行。若我們要寫三維的公式碰撞,可以將一維碰撞的方程式直接寫三次嗎?
答案是不行的,因為還要考慮碰撞角度的問題。

在維基百科中,有此三維碰撞的公式解,有興趣的同學前往wiki看看。
Wiki Elastic collision
image alt

這章節的最後,老師給同學看看三維碰撞公式解的範例。
希望有興趣的同學能自己嘗試修改研究看看,加油。

""" 建國中學 Vpython物理模擬 作者: 物理科 賴奕帆老師 日期: 107/07/25 特色課程 Lecture 04 碰撞 4_03_3D_collision with formula.py """ from vpython import * #引用視覺畫套件Vpython """ 1. 參數和公式設定 """ size = 2 #球半徑 m1 = 6 #球1質量 m2 = 2 #球2質量 r1 = vec(-5,0.5,0) #球1初始位置 v_1 = vec(6,0,0) #球1初速度 r2 = vec(5,0,0) #球2初始位置 v_2 = vec(0,0,0) #球2初速度 dt = 0.001 #時間間隔 0.001 秒 # 定義3D碰撞公式 def three_D_col_for(v1, v2, r1, r2): v1_col = v1 + (2*m2/(m1+m2))*dot((v2 - v1), (r1 - r2)) * (r1-r2) / mag2(r1 - r2) v2_col = _________________________________________________________ return (v1_col, v2_col) """ 2. 畫面設定 """ scene = canvas(width=800, height=800, center = vec(0,0,0), background=vec(0.6,0.8,0.8),range=15) #設定畫面 #畫牆壁 wall_1 = box (pos=vec(-10,0,0), length=0.5, height=20, width=0.5, color=color.blue) wall_2 = box (pos=vec(10,0,0), length=0.5, height=20, width=0.5, color=color.blue) wall_3 = box (pos=vec(0,10,0), length=20, height=0.5, width=0.5, color=color.blue) wall_4 = box (pos=vec(0,-10,0), length=20, height=0.5, width=0.5, color=color.blue) ball_1 = sphere(radius = size, color=color.yellow , pos = r1 ,v = v_1) #畫球1 ball_2 = sphere(radius = size, color=color.green , pos = r2 , v = v_2) #畫球2 #畫速度箭頭 v1_arrow = arrow(pos=ball_1.pos,axis=ball_1.v,shaftwidth=0.2*size ,color = color.yellow) v2_arrow = arrow(pos=ball_2.pos,axis=ball_2.v,shaftwidth=0.2*size ,color = color.green) """ 3. 執行迴圈 """ while True: rate(1000) #每一秒跑 1000 次 ball_1.pos = ball_1.pos + ball_1.v*dt ball_2.pos = ball_2.pos + ball_2.v*dt #若兩球球心距離小於兩倍球半徑,則代入碰撞公式改變速度 if mag(ball_1.pos - ball_2.pos) <= 2*size : ball_1.v, ball_2.v = three_D_col_for(ball_1.v, ball_2.v, ball_1.pos, ball_2.pos) v1_arrow.pos = ball_1.pos v2_arrow.pos = ball_2.pos v1_arrow.axis = ball_1.v v2_arrow.axis = ball_2.v #球受牆面碰撞,使球受反方向極大的加速度(設定a = 200m/s*s) if ball_1.pos.x + size > 10 : ball_1.v.x = ball_1.v.x - 200*dt if ball_2.pos.x + size > 10 : ball_2.v.x = ball_2.v.x - 200*dt if ball_1.pos.x - size < -10 : ball_1.v.x = ball_1.v.x + 200*dt if ball_2.pos.x - size < -10 : ball_2.v.x = ball_2.v.x + 200*dt if ball_1.pos.y + size > 10 : ball_1.v.y = ball_1.v.y - 200*dt if ball_2.pos.y + size > 10 : ball_2.v.y = ball_2.v.y - 200*dt if ball_1.pos.y - size < -10 : ball_1.v.y = ball_1.v.y + 200*dt if ball_2.pos.y - size < -10 : ball_2.v.y = ball_2.v.y + 200*dt

  • 25行v2的碰撞公式請參考v1填入。
  • 牆壁不是直接改變速度方向,而是使球受到反方向加速度。
  • 雖然看起來是平面上的二維碰撞,但可以改成三維,只是三維動畫呈現的比較不美觀。
  • 若要兩顆球以上可以嗎? 當然可以,但用之後學的List and array可以更簡潔且執行流暢。
  • 同學可以自行改變兩球的質量與初速度,玩看看吧。

五、Lecture 4 課堂作業

課堂作業 4-1

一維碰撞中最基本的物理概念是

  • 碰撞前後遵守動量守恆(含碰撞過程中),即

P=mAvA+mBvB=mAvA+mBvB=const.

  • 碰撞前後遵守動能守恆(不含碰撞過程中),即
    12mAvA2+12mBvB2=12mAvA2+12mBvB2

前述圖表只表現出碰撞過程中的位置、速度與加速度而已,請嘗試用圖表討論碰撞過程中的總動量與總力學能(含動能與彈力位能)如何變化。

課堂作業 4-1 參考解法步驟 :

  1. 在畫面設定處,更改圖表設定,能量部分準備畫出總動能K=12m1v12+12m2v22、彈力位能U=12kΔx2與總力學能E=K+U三條曲線;動量部分準備畫出紅球動量P1、藍球動量P2與總動量P=P1+P2

  2. 在執行迴圈處,計算兩球任意瞬間的動能、彈力位能、總力學能和動量等。

  3. 在執行迴圈處,將算出的能量與動量匯入圖表之中

  • 碰撞過程中有動能與動量守恆嗎? 碰撞前後有動能與動量守恆嗎?

課堂作業 4-2

撞球,由於母球與子球的質量相同,且當子球(藍色球)靜止時,碰撞後兩球的夾角ϕ=90

請利用三角函數把兩球碰撞後的夾角,利用程式計算出來,看看是否為90度吧。

課堂作業 4-2 參考解法步驟 :

  • 將下面程式碼貼在"三維碰撞"程式中的最後面。
  • 注意,此處設定4.0<t<4.1是計算碰撞後的角度,若你自己設定的位置不同,可能要適當調整計算時間。
  • 這裡有用到內積與反三角函數找角度的技巧,希望有能力的同學能自己查書理解。
  • 科學使用的角度均為弧度(rad),若要轉為我們習慣的角度,必須要進行轉換,請嘗試自行修正83行的程式碼,角度單位將正確轉換。
"""計算兩球碰撞後的夾角是否為90度(3. 執行迴圈)""" if t>4.0 and t< 4.1: #注意此必須在碰撞結束後才計算角度 cos_theta = dot(ball1.v,ball2.v)/(ball1.v.mag*ball2.v.mag) theta = acos(cos_theta)*__________ #將弧度改為角度 print (theta)

  • 注意,若希望兩球碰撞後的夾角為九十度,必須兩球的質量相同,且彈力常數不能太小。

  • 若紅球質量大於藍球,你猜猜角度會大於還是小於90度呢? 請自己嘗試看看吧。

進階作業 4-1

Youtube : Stacked Ball Drop

Stacked Ball Drp 是一個有名的科學網紅youtuber Physical girl拍攝的影片,她擺放了好幾顆球,使其垂直落下後彈跳極高的高度。

在一維碰撞(公式解)中,我們成功寫出了Y軸方向用公式的一維彈性碰撞,請嘗試改成三顆球依序擺放,且三球的質量、半徑與高度如下表所述,最後利用pre迴圈找出最上面的球會彈多高吧。

1
2
3
質量 m
m1=1
m2=5
m3=30
球半徑 r
r1=1
r2=2
r3=3
高度 y
y1=20
y2=17
y3=12

進階作業 4-1 參考解法步驟 :

  1. 在參數設定部分,設定好三球的基本參數。

  2. 三球均會受到重力作用自由落下,且球三碰到地板會反彈。

  3. 利用三點紀錄法,找出球1彈跳至最高點的高度。

  • 球1最高可至211公尺高,相當驚人的高度。
  • 同學可以隨意改動三球的質量,說不定球1可以飛到月球去喔。 XD

Lecture 4 作業完整參考解法

  • 同學們,在看參考解之前,請先想清楚自己是否真的有花時間想過如何寫課堂作業和進階作業了呢?

  • 學習無他,但求自己覺得好玩而已。

  • 若真的想把一件事情學好,務必花時間才能掌握。

  • 希望這邊的作業參考解法,真的都只是讓同學們拿來參考,而不是為了繳交作業的複製貼上。

  • 想過了嗎? 那請點下面的網址吧。

# Lecture 4 作業完整參考解法


本單元課程自2018.7.1日起已被瀏覽 506