# 兩個木塊的簡諧運動
> 作者:王一哲
> 日期:2020/7/9
## 題目(改編自101指考非選題二)
質量分別為 $M$ 及 $m$ 的木塊放置於光滑水平面上,兩個木塊之間以彈性常數為 $k$ 的理想彈簧連接。若將兩個木塊向內壓縮 $\Delta L$ 再由靜止釋放木塊,試求以下的物理量。
1. 木塊做簡諧運動週期
2. 木塊做簡諧運動的最大速率
3. 木塊做簡諧運動的振幅
<img height="40%" width="40%" src="https://imgur.com/uvkAelp.png" style="display: block; margin-left: auto; margin-right: auto;"/>
<br />
## 理論分析
### 木塊做簡諧運動週期
若將 $x$ 軸的原點設定在 $M$ 的位置,則質心與 $M$ 之間的距離為
$$
x_C = \frac{mL}{M+m}
$$
由於系統的質心位置固定,可以將彈簧從質心位置分割為左、右兩段,長度比為 $m:M$ ,其彈性常數分別為
$$
k_M = \frac{M+m}{m} k
$$
$$
k_m = \frac{M+m}{M} k
$$
兩個木塊做簡諧運動的週期分別為
$$
T_M = 2 \pi \sqrt{\frac{M}{k_1}} = 2 \pi \sqrt{\frac{Mm}{(M+m)k}}
$$
$$
T_m = 2 \pi \sqrt{\frac{m}{k_2}} = 2 \pi \sqrt{\frac{Mm}{(M+m)k}}
$$
兩個木塊做簡諧運動的週期相等,這樣系統質心位置才會固定,這是合理的計算結果。另一種方法是利用約化質量 (reduced mass)
$$
\mu = \frac{Mm}{M+m}
$$
簡諧運動的週期為
$$
T = 2 \pi \sqrt{\frac{\mu}{k}} = 2 \pi \sqrt{\frac{Mm}{(M+m)k}}
$$
<br />
**2022/5/15 補充說明約化質量的推導過程**
假設木塊 $M$ 受的到作用力為 $\mathbf{F_M}$,木塊 $m$ 受的到作用力為 $\mathbf{F_m}$,由於兩者之間用彈簧連接,$M$、$m$、彈簧系統水平方向沒有外力,因此
$$
\mathbf{F_M} + \mathbf{F_m} = 0 ~\Rightarrow~ \mathbf{F_m} = -\mathbf{F_M}
$$
兩者的加速度分別為
$$
\mathbf{a_M} = \frac{\mathbf{F_M}}{M} ~~~~~ \mathbf{a_m} = \frac{\mathbf{F_m}}{m} = -\frac{\mathbf{F_M}}{m} = -\frac{M}{m} \mathbf{a_M}
$$
$M$ 相對於 $m$ 的加速度為
$$
\mathbf{a_{Mm}} = \mathbf{a_M} - \mathbf{a_m} = \left( 1 + \frac{M}{m} \right) \mathbf{a_M} = \frac{M+m}{m} \cdot \frac{\mathbf{F_M}}{M} ~\Rightarrow~ \mathbf{F_M} = \frac{Mm}{M+m} \mathbf{a_{Mm}}
$$
若定義約化質量
$$
\mu = \frac{Mm}{M+m}
$$
則上式可改寫為
$$
\mathbf{F_M} = \mu \mathbf{a_{Mm}}
$$
運用約化質量,可以將兩個物體的運動,簡化成其中一個物體相對於另一個物體的運動。
<br />
### 木塊做簡諧運動的最大速率
由於系統水平方向不受外力作用,系統動量守恆,兩個木塊的動量
$$
\mathbf{p_M} + \mathbf{p_m} = \mathbf{0} ~\Rightarrow~ \mathbf{p_M} = -\mathbf{p_m}
$$
當彈簧回到原長時、木塊到達平衡點,此時兩個木塊的動能比為
$$
K_M : K_m = \frac{p_M^2}{2M} : \frac{p_m^2}{2m} = m : M
$$
由於系統力學能守恆,由彈簧被壓縮 $\Delta L$ 時與彈簧回到原長時可得
$$
\frac{1}{2} k (\Delta L)^2 = K_M + K_m
$$
若將
$$
K_m = \frac{M}{m} K_M
$$
代入上式可得
$$
\frac{1}{2} k (\Delta L)^2 = K_M \left(1 + \frac{M}{m} \right) ~\Rightarrow~ K_M = \frac{mk (\Delta L)^2}{2(M+m)}
$$
$$
K_m = \frac{M}{m} \cdot \frac{mk (\Delta L)^2}{2(M+m)} = \frac{Mk (\Delta L)^2}{2(M+m)}
$$
兩個木塊的最大速率分別為
$$
v_M = \sqrt{\frac{2K_M}{M}} = \sqrt{\frac{2}{M} \cdot \frac{mk (\Delta L)^2}{2(M+m)}} = \sqrt{\frac{mk}{M(M+m)}} \Delta L
$$
$$
v_m = \sqrt{\frac{2K_m}{m}} = \sqrt{\frac{2}{m} \cdot \frac{Mk (\Delta L)^2}{2(M+m)}} = \sqrt{\frac{Mk}{m(M+m)}} \Delta L
$$
<br />
### 木塊做簡諧運動的振幅
由於系統的質心位置固定,因此兩個木塊離開平衡點的距離與質量成反比,兩者的振幅比
$$
R_M : R_m = m : M
$$
但是彈簧的最大壓縮量為 $\Delta L$,因此
$$
R_M + R_m = \Delta L
$$
由以上兩式可得
$$
R_M = \frac{m}{M+m} \Delta L
$$
$$
R_m = \frac{M}{M+m} \Delta L
$$
<br />
### 驗算木塊做簡諧運動的最大速率
配合先前得到的簡諧運動週期可得兩者的最大速率分別為
$$
v_M = \frac{2 \pi R_M}{T} = 2 \pi \cdot \frac{m}{M+m} \Delta L \cdot \frac{1}{2 \pi} \sqrt{\frac{(M+m)k}{Mm}} = \sqrt{\frac{mk}{M(M+m)}} \Delta L
$$
$$
v_m = \frac{2 \pi R_m}{T} = 2 \pi \cdot \frac{M}{M+m} \Delta L \cdot \frac{1}{2 \pi} \sqrt{\frac{(M+m)k}{Mm}} = \sqrt{\frac{Mk}{m(M+m)}} \Delta L
$$
<br />
## VPython 模擬
以下是使用 VPython 模擬的程式碼以及 [GlowScript 網站動畫連結](https://www.glowscript.org/#/user/yizhe/folder/Public/program/14-2doubleSHM),程式碼中的變數值與題目的物理量關係如下:
1. 木塊1的質量為 $M = m_1 = 0.2 ~\mathrm{kg}$
2. 木塊2的質量為 $m = m_2 = 0.1 ~\mathrm{kg}$
3. 彈簧的彈性常數 $k = 5.0 ~\mathrm{N/m}$
4. 彈簧初始壓縮量 $\Delta L = dL = 0.5 ~\mathrm{m}$
<img height="80%" width="80%" src="https://imgur.com/pWg1re1.png" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center">模擬畫面截圖</div>
<br />
```python=
"""
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
```
<br />
模擬結果如下,週期模擬值與理論值的差異是由程式碼中採用的時間間隔 dt = 0.00005 造成的,振幅的模擬值與理論值完全相同。
```python
週期理論值 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
```
<br />
<img height="60%" width="60%" src="https://imgur.com/fi5VN9Y.png" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center"><i>x</i> - <i>t</i> 圖</div>
<br />
<img height="60%" width="60%" src="https://imgur.com/VCry0Nj.png" style="display: block; margin-left: auto; margin-right: auto;"/>
<div style="text-align:center"><i>v</i> - <i>t</i> 圖</div>
<br />
## 結語
此題原為101年指考物理非選題二,原版的題目及參考解答請參考大考中心的網站([題目](https://www.ceec.edu.tw/files/file_pool/1/0j075620018395330440/01-101%e6%8c%87%e8%80%83%e7%89%a9%e7%90%86%e8%a9%a6%e5%8d%b7%e5%ae%9a%e7%a8%bf.pdf)、[參考解答](https://www.ceec.edu.tw/files/file_pool/1/0j198592998976122749/101a%e7%89%a9%e7%90%86.pdf))。原版的題目中第3小題是要求 $M$ 的振幅,我在上課時曾經試著用質心位置固定以外的方法解題,但是效果似乎不太好,再加上學生不容易想像木塊的運動方式,所以我寫了完整的理論計算以及模擬動畫,希望能幫助學生理解這個題目。
<br />
---
###### tags:`Physics`、`VPython`