2019年12月14日 星期六

小球與圓環碰撞

作者:王一哲
日期:2019/12/14




題目


在水平光滑桌面上有一個質量為$m_1$的小球及一個質量為$m_2$的圓環,小球放置於圓環的圓心處。若兩者原為靜止,用手撥動小球,使小球以初速度$v_1$向右移動,小球與圓環之間為彈性碰撞,請問兩者會如何運動?


模擬動畫畫面截圖



理論推導


當小球開始運動之後,小球與圓環系統所受外力合為0,因此系統動量守恆,質心速度為定值、方向向右。小球向右移動,第1次撞擊圓環時使圓環開始向右移動,小球的速度變慢或反向移動;接下來小球撞擊圓環左側,使圓環減速、小球向右移動;不斷重複這個過程,整個系統向右移動。



模擬動畫程式


GlowScript 網站動畫連結

"""
 VPython教學: 小球與圓環彈性碰撞
 日期: 2019/12/3
 作者: 王一哲
"""

from vpython import *

"""
 1. 參數設定, 設定變數及初始值
"""
m1, r1, v1, c1 = 0.1, 0.1, 4.0, color.red     # 小球的質量, 半徑, 初速, 紅色
m2, r2, v2, c2 = 0.4, 0.5, 0.0, color.green   # 圓環的質量, 半徑, 初速, 綠色
xmax, xmin = 2.0, -2.0                        # x 軸範圍
i, t, dt = 0, 0, 0.001                        # 撞擊次數, 時間, 時間間隔

"""
 2. 畫面設定
"""
# 產生動畫視窗
scene = canvas(title="Collisions Between a Ball and a Ring", width=800, height=600, center=vec(0, 0, 0),
               background=color.black)
# 產生地板, 小球, 圓環, 質心
floor = box(pos=vec(0, 0, -2*r1), size=vec((xmax - xmin), 4*r2, r1), color=color.blue)
ball = sphere(pos=vec(xmin+1, 0, 0), radius=r1, color=c1, m=m1, v=vec(v1, 0, 0))
circle = ring(pos=vec(xmin+1, 0, 0), axis=vec(0, 0, 1), radius=r2, thickness=0.2*r2, color=c2, m=m2, v=vec(v2, 0, 0))
cm = sphere(pos=((ball.m*ball.pos + circle.m*circle.pos) / (ball.m + circle.m)), radius=0.2*r1, color=color.orange)

# 繪圖部分
gd1 = graph(title="<i>x</i>-<i>t</i> plot", x=0, y=300, width=600, height=450, fast=True, 
           xtitle="<i>t</i> (s)", ytitle="red: <i>x</i><sub>1</sub>, green: <i>x</i><sub>2</sub>, orange: <i>x</i><sub>c</sub> (m)")
xt1 = gcurve(graph=gd1, color=c1)
xt2 = gcurve(graph=gd1, color=c2)
xt3 = gcurve(graph=gd1, color=color.orange)

gd2 = graph(title="<i>v</i>-<i>t</i> plot", x=0, y=600, width=600, height=450, fast=True, 
           xtitle="<i>t</i> (s)", ytitle="red: <i>v</i><sub>1</sub>, green: <i>v</i><sub>2</sub>, orange: <i>v</i><sub>c</sub> (m/s)")
vt1 = gcurve(graph=gd2, color=c1)
vt2 = gcurve(graph=gd2, color=c2)
vt3 = gcurve(graph=gd2, color=color.orange)

# 自訂函式,一維彈性碰撞速度公式
def collision(m1, m2, v1, v2):
    v1_prime = (m1-m2)/(m1+m2)*v1 + (2*m2)/(m1+m2)*v2
    v2_prime = (2*m1)/(m1+m2)*v1 + (m2-m1)/(m1+m2)*v2
    return v1_prime, v2_prime

"""
 3. 物體運動部分, 重複執行直到圓環抵達邊緣
"""
while circle.pos.x < xmax-r2-circle.thickness:
    rate(500)
# 計算小球與圓環間的距離, 若發生碰撞則計算撞後速度
    dis = ball.pos.x - circle.pos.x
    if abs(dis) > r2-r1-0.5*circle.thickness and dis*(ball.v.x-circle.v.x) > 0:
        ball.v.x, circle.v.x = collision(ball.m, circle.m, ball.v.x, circle.v.x)
        i += 1
        print("第{:}次碰撞, 經過時間 t = {:.6f}".format(i, t))
# 更新小球, 圓環, 質心位置
    ball.pos += ball.v*dt
    circle.pos += circle.v*dt
    cm.pos = (ball.m*ball.pos + circle.m*circle.pos) / (ball.m + circle.m)
# 畫 x-t 圖
    xt1.plot(pos=(t, ball.pos.x))
    xt2.plot(pos=(t, circle.pos.x))
    xt3.plot(pos=(t, cm.pos.x))
# 畫 v-t 圖
    vt1.plot(pos=(t, ball.v.x))
    vt2.plot(pos=(t, circle.v.x))
    vt3.plot(pos=(t, (ball.m*ball.v.x + circle.m*circle.v.x) / (ball.m + circle.m)))
# 更新時間
    t += dt



我使用以上的程式,測試了3種不同的數據組合,以下是模擬的結果。

組合1


$m_1 = 0.1$、$v_1 = 4.0$、$m_2 = 0.4$、$v_2 0.0$

輸出結果
第1次碰撞, 經過時間 t = 0.088000
第2次碰撞, 經過時間 t = 0.264000
第3次碰撞, 經過時間 t = 0.440000
第4次碰撞, 經過時間 t = 0.616000
第5次碰撞, 經過時間 t = 0.792000
第6次碰撞, 經過時間 t = 0.968000
第7次碰撞, 經過時間 t = 1.144000
第8次碰撞, 經過時間 t = 1.320000
第9次碰撞, 經過時間 t = 1.496000
第10次碰撞, 經過時間 t = 1.672000
第11次碰撞, 經過時間 t = 1.848000
第12次碰撞, 經過時間 t = 2.024000
第13次碰撞, 經過時間 t = 2.200000
第14次碰撞, 經過時間 t = 2.376000
第15次碰撞, 經過時間 t = 2.552000
第16次碰撞, 經過時間 t = 2.728000
第17次碰撞, 經過時間 t = 2.904000




組合1 x-t 圖




組合1 v-t 圖



由於圓環質量較大,小球撞到圓環右側時會反彈;當小球與圓環左側碰撞時,小球向右移動、圓環停止;不斷重覆以上的過程。動畫橘色的點代表小球與圓環系統的質心,雖然在動畫中質心看起來會左右移動,但是從 v-t 圖上看起來是等速度運動,這個現象也很有趣。



組合2


$m_1 = 0.4$、$v_1 = 4.0$、$m_2 = 0.1$、$v_2 0.0$

輸出結果
第1次碰撞, 經過時間 t = 0.088000
第2次碰撞, 經過時間 t = 0.264000
第3次碰撞, 經過時間 t = 0.440000
第4次碰撞, 經過時間 t = 0.616000
第5次碰撞, 經過時間 t = 0.792000




組合2 x-t 圖




組合2 v-t 圖



由於小球質量較大,小球撞到圓環右側時只會減速、不會反彈;圓環快速向右移動,用圓環左側追撞小球,撞後小球向右移動、圓環停止;不斷重覆以上的過程。動畫中小球與圓環系統的質心看起來也會左右移動。



組合3


$m_1 = 0.1$、$v_1 = 4.0$、$m_2 = 0.1$、$v_2 0.0$

輸出結果
第1次碰撞, 經過時間 t = 0.088000
第2次碰撞, 經過時間 t = 0.264000
第3次碰撞, 經過時間 t = 0.440000
第4次碰撞, 經過時間 t = 0.616000
第5次碰撞, 經過時間 t = 0.792000
第6次碰撞, 經過時間 t = 0.968000
第7次碰撞, 經過時間 t = 1.144000




組合3 x-t 圖




組合3 v-t 圖



由於小球、圓環質量相等,第一次碰撞時小球停止、圓環向右移動;接下來圓環左側追撞小球,撞後小球向右移動、圓環停止;不斷重覆以上的過程。動畫中小球與圓環系統的質心看起來也會左右移動。



結語


這是好幾年前一個同事問我的題目,當時還沒有適合的工具能用,只能用理論推導憑空想像。最近用 VPython 畫出運動過程,發現小球與圓環的運動模式相當接近理論推導,但是系統質心應該是等速度運動,在動畫中看起來卻會左右移動,這反而是意外的收獲。





HackMD 版本連結:https://hackmd.io/@yizhewang/BJMWrcl0B

沒有留言:

張貼留言