作者:王一哲
日期:2020/7/9
質量分別為
若將
由於系統的質心位置固定,可以將彈簧從質心位置分割為左、右兩段,長度比為
兩個木塊做簡諧運動的週期分別為
兩個木塊做簡諧運動的週期相等,這樣系統質心位置才會固定,這是合理的計算結果。另一種方法是利用約化質量 (reduced mass)
簡諧運動的週期為
2022/5/15 補充說明約化質量的推導過程
假設木塊
兩者的加速度分別為
若定義約化質量
則上式可改寫為
運用約化質量,可以將兩個物體的運動,簡化成其中一個物體相對於另一個物體的運動。
由於系統水平方向不受外力作用,系統動量守恆,兩個木塊的動量
當彈簧回到原長時、木塊到達平衡點,此時兩個木塊的動能比為
由於系統力學能守恆,由彈簧被壓縮
若將
代入上式可得
兩個木塊的最大速率分別為
由於系統的質心位置固定,因此兩個木塊離開平衡點的距離與質量成反比,兩者的振幅比
但是彈簧的最大壓縮量為
由以上兩式可得
配合先前得到的簡諧運動週期可得兩者的最大速率分別為
以下是使用 VPython 模擬的程式碼以及 GlowScript 網站動畫連結,程式碼中的變數值與題目的物理量關係如下:
"""
VPython教學: 14-2.水平彈簧與木塊組成的雙重簡諧運動, 101指考題
日期: 2020/7/9
作者: 王一哲
"""
from vpython import *
"""
1. 參數設定, 設定變數及初始值
"""
d1, m1, c1 = 0.2, 0.2, color.red # 木塊1的質量、初速、顏色
d2, m2, c2 = 0.2, 0.1, color.green # 木塊2的質量、質量、初速、顏色
L0, k, dL = 1.0, 5.0, 0.5 # 彈簧的原長 L0=1 m, 彈性常數 k=5.0 N/m, 最大壓縮量 dL=0.5 m
t, dt = 0, 0.00005 # 時間, 時間間隔
"""
2. 畫面設定
"""
# 產生動畫視窗
scene = canvas(title="Double Simple Harmonic Motion", width=800, height=300,
background=vec(0, 0.6, 0.6), range=0.7*L0)
# 產生左側木塊 b1, 右側木塊 b2
b1 = box(pos=vec(-0.5*L0-0.5*d1, 0, 0), size=vec(d1, d1, d1), color=c1, v=vec(0, 0, 0))
b2 = box(pos=vec(0.5*L0+0.5*d2-dL, 0, 0), size=vec(d2, d2, d2), color=c2, v=vec(0, 0, 0))
# 產生彈簧, 起點為 b1.pos, 方向為 b2.pos - b1.pos
spring = helix(pos=b1.pos+vec(0.5*d1, 0, 0), axis=b2.pos-b1.pos-vec(0.5*(d1+d2), 0, 0),
radius=0.3*d1, thickness=0.1*d1)
# 產生地板
floor = box(pos=vec(0.5*(b1.pos.x+b2.pos.x), -0.75*d2, 0),
size=vec(2.2*L0, 0.5*d2, 0.8), color=color.blue)
scene.center = floor.pos+vec(0, 0.2, 0)
# 繪圖部分
gd = graph(title="<i>x</i> - <i>t</i> plot", x=0, y=300, width=600, height=450, xtitle="<i>t</i> (s)",
ytitle="red: <i>x</i><sub>1</sub>, green: <i>x</i><sub>2</sub> (m)")
xt1 = gcurve(graph=gd, color=c1)
xt2 = gcurve(graph=gd, color=c2)
gd2 = graph(title="<i>v</i> - <i>t</i> plot", x=0, y=750, width=600, height=450, xtitle="<i>t</i> (s)",
ytitle="red: <i>v</i><sub>1</sub>, green: <i>v</i><sub>2</sub> (m/s)")
vt1 = gcurve(graph=gd2, color=c1)
vt2 = gcurve(graph=gd2, color=c2)
"""
3. 物體運動部分
"""
T0 = 2*pi*sqrt(m1*m2/(k*(m1+m2))) # 簡諧運動週期理論值
R1, R2 = m2*dL/(m1+m2), m1*dL/(m1+m2)# 簡諧運動振幅理論值
vp1, vp2 = 0.0, 0.0
xp1, xp2 = b1.pos.x, b2.pos.x
count1, count2 = 0, 0
print("週期理論值 T0 = {:f} s".format(T0))
print("振幅理論值 R1 = {:f} m, R2 = {:f} m".format(R1, R2))
while t <= 3*T0:
rate(1000)
# 更新彈簧的起點位置、長度、方向
spring.pos = b1.pos+vec(0.5*d1, 0, 0)
spring.axis = b2.pos-b1.pos-vec(0.5*(d1+d2), 0, 0)
# 計算彈簧回復力,更新小球的加速度、速度、位置
force = -k*(spring.axis.mag - L0) * spring.axis.norm()
b1.a = -force/m1
b2.a = force/m2
b1.v += b1.a * dt
b2.v += b2.a * dt
b1.pos += b1.v * dt
b2.pos += b2.v * dt
# 檢驗木塊是否經過一個週期
vc1, vc2 = b1.v.x, b2.v.x
if vp1 > 0 and vc1 < 0:
print("木塊1經過一個週期, 此時 t = {:f} s".format(t))
if vp2 < 0 and vc2 > 0:
print("木塊2經過一個週期, 此時 t = {:f} s".format(t))
# 計算木塊的振幅
if vp1 < 0 and vc1 > 0 and count1 == 0:
xc1 = b1.pos.x
print("木塊1振幅 R1 = {:f} m".format(abs(xc1-xp1)/2))
xp1 = xc1
count1 += 1
if vp2 > 0 and vc2 < 0 and count2 == 0:
xc2 = b2.pos.x
print("木塊2振幅 R2 = {:f} m".format(abs(xc2-xp2)/2))
xp2 = xc2
count2 += 1
# 更新 vp1, vp2
vp1, vp2 = vc1, vc2
# 畫 x-t 圖, v-t 圖
xt1.plot(pos=(t, b1.pos.x))
xt2.plot(pos=(t, b2.pos.x))
vt1.plot(pos=(t, b1.v.x))
vt2.plot(pos=(t, b2.v.x))
# 更新時間
t += dt
模擬結果如下,週期模擬值與理論值的差異是由程式碼中採用的時間間隔 dt = 0.00005 造成的,振幅的模擬值與理論值完全相同。
週期理論值 T0 = 0.725520 s
振幅理論值 R1 = 0.166667 m, R2 = 0.333333 m
木塊1振幅 R1 = 0.166667 m
木塊2振幅 R2 = 0.333333 m
木塊1經過一個週期, 此時 t = 0.725500 s
木塊2經過一個週期, 此時 t = 0.725500 s
木塊1經過一個週期, 此時 t = 1.451000 s
木塊2經過一個週期, 此時 t = 1.451000 s
木塊1經過一個週期, 此時 t = 2.176550 s
木塊2經過一個週期, 此時 t = 2.176550 s
此題原為101年指考物理非選題二,原版的題目及參考解答請參考大考中心的網站(題目、參考解答)。原版的題目中第3小題是要求
Physics
、VPython