# 小球與圓環碰撞 > 作者:王一哲 > 日期:2019/12/14 <br /> ## 題目 在水平光滑桌面上有一個質量為$m_1$的小球及一個質量為$m_2$的圓環,小球放置於圓環的圓心處。若兩者原為靜止,用手撥動小球,使小球以初速度$v_1$向右移動,小球與圓環之間為彈性碰撞,請問兩者會如何運動? <img style="display: block; margin-left: auto; margin-right: auto" height="80%" width="80%" src="https://imgur.com/sJSrJXA.png"> <div style="text-align:center">模擬動畫畫面截圖</div> <br /> ## 理論推導 當小球開始運動之後,小球與圓環系統所受外力合為0,因此系統動量守恆,質心速度為定值、方向向右。小球向右移動,第1次撞擊圓環時使圓環開始向右移動,小球的速度變慢或反向移動;接下來小球撞擊圓環左側,使圓環減速、小球向右移動;不斷重複這個過程,整個系統向右移動。 <br /> ## 模擬動畫程式 [GlowScript 網站動畫連結](https://www.glowscript.org/#/user/yizhe/folder/Public/program/BallRingCollision) ```python= """ 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 ``` <br /> 我使用以上的程式,測試了3種不同的數據組合,以下是模擬的結果。 ### 組合1 $m_1 = 0.1$、$v_1 = 4.0$、$m_2 = 0.4$、$v_2 0.0$ 輸出結果 ```python 第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 ``` <br /> <img style="display: block; margin-left: auto; margin-right: auto" height="80%" width="80%" src="https://imgur.com/fCritoI.png"> <div style="text-align:center">組合1 x-t 圖</div> <br /> <img style="display: block; margin-left: auto; margin-right: auto" height="80%" width="80%" src="https://imgur.com/SgmZ8d5.png"> <div style="text-align:center">組合1 v-t 圖</div> <br /> 由於圓環質量較大,小球撞到圓環右側時會反彈;當小球與圓環左側碰撞時,小球向右移動、圓環停止;不斷重覆以上的過程。動畫橘色的點代表小球與圓環系統的質心,雖然在動畫中質心看起來會左右移動,但是從 v-t 圖上看起來是等速度運動,這個現象也很有趣。 <br /> ### 組合2 $m_1 = 0.4$、$v_1 = 4.0$、$m_2 = 0.1$、$v_2 0.0$ 輸出結果 ```python 第1次碰撞, 經過時間 t = 0.088000 第2次碰撞, 經過時間 t = 0.264000 第3次碰撞, 經過時間 t = 0.440000 第4次碰撞, 經過時間 t = 0.616000 第5次碰撞, 經過時間 t = 0.792000 ``` <br /> <img style="display: block; margin-left: auto; margin-right: auto" height="80%" width="80%" src="https://imgur.com/do84yzV.png"> <div style="text-align:center">組合2 x-t 圖</div> <br /> <img style="display: block; margin-left: auto; margin-right: auto" height="80%" width="80%" src="https://imgur.com/OksJFWV.png"> <div style="text-align:center">組合2 v-t 圖</div> <br /> 由於小球質量較大,小球撞到圓環右側時只會減速、不會反彈;圓環快速向右移動,用圓環左側追撞小球,撞後小球向右移動、圓環停止;不斷重覆以上的過程。動畫中小球與圓環系統的質心看起來也會左右移動。 <br /> ### 組合3 $m_1 = 0.1$、$v_1 = 4.0$、$m_2 = 0.1$、$v_2 0.0$ 輸出結果 ```python 第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 ``` <br /> <img style="display: block; margin-left: auto; margin-right: auto" height="80%" width="80%" src="https://imgur.com/VMZSLOJ.png"> <div style="text-align:center">組合3 x-t 圖</div> <br /> <img style="display: block; margin-left: auto; margin-right: auto" height="80%" width="80%" src="https://imgur.com/43MtQSF.png"> <div style="text-align:center">組合3 v-t 圖</div> <br /> 由於小球、圓環質量相等,第一次碰撞時小球停止、圓環向右移動;接下來圓環左側追撞小球,撞後小球向右移動、圓環停止;不斷重覆以上的過程。動畫中小球與圓環系統的質心看起來也會左右移動。 <br /> ## 結語 這是好幾年前一個同事問我的題目,當時還沒有適合的工具能用,只能用理論推導憑空想像。最近用 VPython 畫出運動過程,發現小球與圓環的運動模式相當接近理論推導,但是系統質心應該是等速度運動,在動畫中看起來卻會左右移動,這反而是意外的收獲。 <br /> --- ###### tags:`VPython`