# 角動量守恆
> 作者:王一哲
> 日期:2020/2/28
<br />
## 物理情境
若質量可忽略的桿子長度為$2R$,桿子兩端各連接一顆質量為$m$的球,放置於水平光滑桌面上,以桿子的中央、垂直射出桌面方向為轉軸,起始的角速度為$\omega$。如果小球的旋轉半徑隨著時間縮短,假設後來的旋轉半徑為$R'$、角速度為$\omega'$,根據角動量守恆可得
$$mR^2 \omega = mR'^2 \omega' ~\Rightarrow~ \omega' = \left( \frac{R}{R'} \right)^2 \omega$$
所以當兩個球距離變近時,旋轉的角速率會跟著變快。
<br />
<img style="display: block; margin-left: auto; margin-right: auto" height="60%" width="60%" src="https://imgur.com/vjYC19W.png">
<div style="text-align:center">模擬程式畫面截圖</div>
<br />
## 模擬動畫程式
[GlowScript 網站動畫連結](https://www.glowscript.org/#/user/yizhe/folder/Public/program/AngularMomentum)
```python=
from vpython import *
"""
1. 參數設定, 設定變數及初始值
"""
size, R, dR = 0.3, 5, 1
theta1, theta2, omega = 0, pi, 2
t, dt = 0, 0.00005
"""
2. 畫面設定
"""
scene = canvas(title="Angular Momentum Conservation", width=600, height=600, x=0, y=0, background=color.black)
b1 = sphere(pos=R*vec(cos(theta1), sin(theta1), 0), radius=size, color=color.red, make_trail=True)
b2 = sphere(pos=R*vec(cos(theta2), sin(theta2), 0), radius=size, color=color.green, make_trail=True)
stick = cylinder(pos=b2.pos, axis=b1.pos-b2.pos, radius=0.2*size, color=color.yellow)
circle = ring(pos=vec(0, 0, 0), axis=vec(0, 0, 1), radius=R, thickness=0.05*size, color=color.white)
xaxis = cylinder(pos=vec(-1.2*R, 0, 0), axis=vec(2.4*R, 0, 0), radius=0.05*size, color=color.cyan)
yaxis = cylinder(pos=vec(0, -1.2*R, 0), axis=vec(0, 2.4*R, 0), radius=0.05*size, color=color.cyan)
gd = graph(title="<i>ω</i> - t plot", width=600, height=450, x=0, y=600,
xtitle="<i>t</i>(s)", ytitle="<i>ω</i>(rad/s)")
wt_plot = gcurve(graph=gd, color=color.red)
"""
3. 物體運動部分
"""
while R >= 2*size:
rate(1000)
omega *= (R / (R-dR*dt))**2
R -= dR*dt
theta1 += omega*dt
theta2 += omega*dt
b1.pos = R*vec(cos(theta1), sin(theta1), 0)
b2.pos = R*vec(cos(theta2), sin(theta2), 0)
stick.pos = b2.pos
stick.axis = b1.pos-b2.pos
wt_plot.plot(t, omega)
t += dt
```
<br />
### 參數設定
以下所有物理量單位皆為 SI 制
1. 小球半徑 size = 0.3
2. 圓周運動半徑 R = 5
3. 每經過 1 s 圓周運動半徑縮短量值 dR = 1
4. 球1旋轉角度 theta1 = 0
5. 球2旋轉角度 theta2 = pi
6. 角速度 omega = 2
7. 時間 t = 0
8. 時間間隔 dt = 0.00005
### 畫面設定
1. 用 sphere 物件產生小球,球1 (b1) 初位置為 (R, 0, 0),球2 (b2) 初位置為 (-R, 0, 0)。
2. 用 cylinder 物件產生兩個小球之間的桿子 (stick)。
3. 為了便於看出小球的運動方式,用 ring 物件畫出半徑為 R 的圓形 (circle),再用 cylinder 物件畫出 x 軸 (xaxis) 和 y 軸 (yaxis)。
4. 用 graph 開啟繪圖物件 (gd),再用 gcurve 物件畫出 ω -t 圖 (wt_plot)。
### 物體運動部分
1. 當 $R \geq 2 size$ 時持續執行動畫。
2. 用角動量守恆定律計算旋轉半徑縮短後的角速度,再將數值指定給變數 omega。
$$\omega' = \left( \frac{R}{R'} \right)^2 \omega = \left( \frac{R}{R - dR \cdot dt} \right)^2 \omega $$
3. 計算縮短後的旋轉半徑,再將數值指定給變數 R。
4. 更新小球的旋轉角度、位置。
5. 更新桿子的位置、軸的長度及方向。
6. 繪製 ω -t 圖。
7. 更新時間。
<img style="display: block; margin-left: auto; margin-right: auto" height="60%" width="60%" src="https://imgur.com/vjYC19W.png">
<div style="text-align:center">模擬程式畫面截圖</div>
<br />
<img style="display: block; margin-left: auto; margin-right: auto" height="60%" width="60%" src="https://imgur.com/KrnuBvA.png">
<div style="text-align:center">ω -t 圖</div>
<br />
## 結語
這個動畫是假設兩個小球旋轉半徑以固定的速率縮短,如果將兩者改為星球,計算兩者之間的重力,應該就能做出雙星系統因為重力作用一邊旋轉、一邊互相接近的動畫,有興趣的同學可以嘗試看看。
<br />
---
###### tags:`VPython`