日期:2018/5/9
我們之前在〈重力及簡諧〉當中處理過重力造成的簡諧運動,當我們學到靜電力時會發現庫侖定律和萬有引力定律的型式很像,因此靜電力應該也能產生相同的運動模式。以下有 3 個不同的程式:
- 19-1. 兩個固定的帶電球體,可移動的帶電球體放置在連心線中點右側 (GlowScript 網站動畫連結)
- 19-2. 兩個固定的帶電球體,可移動的帶電球體放置在中垂線上方 (GlowScript 網站動畫連結)
- 19-3. 將 19-2 中的帶電球體改為圓環,可移動的帶電球體放置在中垂線上方 (GlowScript 網站動畫連結)
程式 19-1
理論推導
如下圖所示,有兩個電量為 $+Q$ 的點電荷,兩者位置固定、距離為 $2d$,在連心線上中央偏左側距離 $x$ 處,有一個電量為 $+q$、質量為 $m$ 的點電荷。
若 $+q$ 點電荷在此處的速度為0, $x \ll d$,只考慮物體間靜電力的作用,則 $+q$ 所受合力方向向右,量值為
$$ \begin{align*}
F &= \frac{kQq}{(d-x)^2} - \frac{kQq}{(d+x)^2} \\
&= kQq \left[ \frac{(d+x)^2 - (d-x)^2}{(d-x)^2 (d+x)^2} \right ]\\
&= kQq \left[ \frac{4dx}{d^4 \left(1 - \frac{x}{d} \right)^2 \left(1 + \frac{x}{d} \right)^2} \right ]\\
&\approx \frac{4kQq}{d^3} \cdot x = Kx
\end{align*} $$
因此 $+q$ 做簡諧運動,週期
$$ T = 2 \pi \sqrt{\frac{m}{k}} = 2 \pi \sqrt{\frac{md^3}{4kQq}} = \pi \sqrt{\frac{md^3}{kQq}} $$
下圖是以 $Q = q = 2 \times 10^4 ~\mathrm{C}$ 繪製的靜電力F-距離x關係圖,由圖中可以看出當x很小時, $F \propto x$,且斜率約等於 1.5,與理論值相符。
靜電力F-距離x關係圖 (0 ≤ x ≤ 9)
靜電力F-距離x關係圖 (0 ≤ x ≤ 4)
程式 19-1.靜電力造成的簡諧運動(放置在連心線中點右側)
取得程式碼
"""
VPython教學: 19-1.靜電力造成的簡諧運動(放置在連心線中點右側)
Ver. 1: 2018/3/14
Ver. 2: 2019/9/15
作者: 王一哲
"""
from vpython import *
"""
1. 參數設定, 設定變數及初始值, 當 h << d 時週期理論值 5.2345 s
"""
size, m = 1, 1 # 小球半徑, 質量
q, Q = 2E-4, 2E-4 # 小球電量, 大球電量
d, h = 10, 3 # 大球之間距離的0.5倍, 小球在連心線中點右側的距離
k = 8.988E9 # 靜電力常數
i, t, dt = 0, 0, 0.001 # 小球回到初位置的次數, 時間, 時間間隔
"""
2. 畫面設定
"""
# 產生動畫視窗
scene = canvas(title="Electric Force and Simple Harmonic Motion", width=600, height=600, x=0, y=0,
center=vec(0, 0, 0), background=color.black, range=1.2*d)
# 產生固定位置的大球、可移動的小球
s1 = sphere(pos=vec(-d, 0, 0), radius=size, color=color.blue)
s2 = sphere(pos=vec(d, 0, 0), radius=size, color=color.blue)
ball = sphere(pos=vec(h, 0, 0), v=vec(0, 0, 0), radius=0.4*size, color=color.red, m=m)
# 畫大球連心線、平衡點、端點位置
line = cylinder(pos=s1.pos, axis=s2.pos-s1.pos, radius=0.1*size, color=color.yellow)
center = cylinder(pos=vec(0, -2, 0), axis=vec(0, 4, 0), radius=0.1*size, color=color.white)
right = cylinder(pos=vec(h, -2, 0), axis=vec(0, 4, 0), radius=0.1*size, color=color.white)
left = cylinder(pos=vec(-h, -2, 0), axis=vec(0, 4, 0), radius=0.1*size, color=color.white)
# 產生代表速度、加速度的箭頭
arrow_v = arrow(pos=ball.pos+vec(0, 1, 0), axis=vec(0, 0, 0), shaftwidth=0.3*size, color=color.green)
arrow_a = arrow(pos=ball.pos+vec(0, 2, 0), axis=vec(0, 0, 0), shaftwidth=0.3*size, color=color.magenta)
# 繪圖部分
gd = graph(title="plot", width=600, height=450, x=0, y=600, xtitle="<i>t</i> (s)",
ytitle="blue: <i>x</i> (m), green: <i>v</i> (m/s), magenta: <i>a</i> (m/s<sup>2</sup>)")
xt = gcurve(graph=gd, color=color.blue)
vt = gcurve(graph=gd, color=color.green)
at = gcurve(graph=gd, color=color.magenta)
"""
3. 物體運動部分, 小球來回 5 次時停止
"""
while(i < 5):
rate(1000)
# 計算小球所受靜電力並存到變數 F
r1 = ball.pos - s1.pos
r2 = ball.pos - s2.pos
F1 = (k*Q*q) / r1.mag2 * r1.norm()
F2 = (k*Q*q) / r2.mag2 * r2.norm()
F = F1 + F2
# 計算運動中小球的加速度、速度、位置, 畫出代表速度、加速度的箭頭
ball.a = F/ball.m
ball.v += ball.a*dt
ball.pos += ball.v*dt
arrow_v.pos = ball.pos + vec(0, 1, 0)
arrow_a.pos = ball.pos + vec(0, 2, 0)
arrow_v.axis = ball.v
arrow_a.axis = ball.a
# 畫出 x-t, v-t, a-t 圖
xt.plot(pos=(t, ball.pos.x))
vt.plot(pos=(t, ball.v.x))
at.plot(pos=(t, ball.a.x))
# 判斷小球是否回到出發點, 計算回到出發點的次數
if(ball.pos.x >= h and ball.v.x >= 0):
print(t)
i += 1
# 更新時間
t += dt
參數設定
在此設定變數為Q、q、m、size、d、h、k、i、t、dt,用途已寫在該行的註解當中。
畫面設定
- 將大球放置於 (-d, 0, 0) 及 (d, 0, 0) 處,將小球放置於 (h, 0, 0)、初速度為 0、質量為 m。
- 畫大球間的連線。小球初位置為右端點,因此左端點應該位於 x = -h 處,於端點處畫線標記位置。
- 產生表示速度、加速度的箭頭,為了使箭頭不要疊在一起,分別畫在小球上方距離為 1、2 兩處。
- 開啟繪圖視窗,畫小球的位置、速度、加速度與時間關係圖。
物體運動
- 為了使動畫在小球來回 5 次時停止,將 while 迴圈當中的條件設定為 i < 5,並用 if(ball.pos.x >= h and ball.v.x >= 0) 判斷小球是否回到出發點,若回到出發點則印出經過的時間 t 及回到出發點的次數 i 。
- 利用庫侖定律計算小球所受合力 F,再由 F = ma 計算小球的加速度,更新速度及位置。
- 最後畫 x-t、v-t、a-t 圖,更新時間。
模擬結果
若以程式當中設定數值為例,當 h 很小的時候,週期理論值為 5.2345 ;若 h = 0.00001 則週期為 5.238000000000084;若 h = 3 則週期為 4.881999999999965;若 h = 6 則週期為 3.7829999999996944。若從 x-t、v-t、a-t 圖來看,當 h = 3 時圖形相當接近 cos、-sin、-cos 的樣子,但是當 h = 6 時圖形就很奇怪了。
程式 19-1 畫面截圖
程式 19-1:h = 3 的 x-t、v-t、a-t 圖
程式 19-1:h = 6 的 x-t、v-t、a-t 圖
程式 19-2
理論推導
如下圖所示,有兩個電量為 $+Q$ 的點電荷,兩者位置固定、距離為 $2R$,在兩者中垂線上距離 $x$ 處,有一個電量為 $-q$、質量為 $m$ 的點電荷。
若 $-q$ 點電荷在此處的速度為0, $x \ll R$,只考慮物體間靜電力的作用,則 $-q$ 所受合力方向向下,量值為
$$ F = \frac{kQq}{R^2 + x^2} \frac{x}{\sqrt{R^2 + x^2}} \cdot 2 = \frac{2kQqx}{R^3 \left(1 + \frac{x^2}{R^2} \right)^{\frac{3}{2}}} \approx \frac{2kQqx}{R^3} = Kx $$
因此 $-q$ 做簡諧運動,週期
$$ T = 2\pi \sqrt{\frac{m}{K}} = 2\pi \sqrt{\frac{R^3}{2kQq}} $$
下圖是以 $Q = q = 2 \times 10^4 ~\mathrm{C}$ 繪製的靜電力F-距離x關係圖,由圖中可以看出當x很小時,$F \propto x$,且斜率約等於 0.7,與理論值相符。
靜電力F-距離x關係圖 (0 ≤ x ≤ 100)
靜電力F-距離x關係圖 (0 ≤ x ≤ 10)
程式 19-2.靜電力造成的簡諧運動(放置在中垂線上方)
取得程式碼
"""
VPython教學: 19-2.靜電力造成的簡諧運動(放置在中垂線上方)
Ver. 1: 2018/3/14
Ver. 2: 2019/9/15
作者: 王一哲
"""
from vpython import *
"""
1. 參數設定, 設定變數及初始值, 當 h << d 時週期理論值 7.4075 s
"""
size, m = 1, 1 # 小球半徑, 質量
q, Q = -2E-4, 2E-4 # 小球電量, 大球電量
d, h = 10, 3 # 大球之間距離的0.5倍, 小球在連心線中點右側的距離
k = 8.988E9 # 靜電力常數
i, t, dt = 0, 0, 0.001 # 小球回到初位置的次數, 時間, 時間間隔
"""
2. 畫面設定
"""
# 產生動畫視窗
scene = canvas(title="Electric Force and Simple Harmonic Motion", width=600, height=600, x=0, y=0,
center=vec(0, 0, 0), background=color.black, range=1.2*d)
# 產生固定位置的大球、可移動的小球
s1 = sphere(pos=vec(-d, 0, 0), radius=size, color=color.blue)
s2 = sphere(pos=vec(d, 0, 0), radius=size, color=color.blue)
ball = sphere(pos=vec(0, h, 0), v=vec(0, 0, 0), radius=0.4*size, color=color.red, m=m)
# 畫大球連心線、平衡點、端點位置
line = cylinder(pos=s1.pos, axis=s2.pos-s1.pos, radius=0.1*size, color=color.yellow)
top = cylinder(pos=vec(-2, h, 0), axis=vec(4, 0, 0), radius=0.1*size, color=color.white)
bottom = cylinder(pos=vec(-2, -h, 0), axis=vec(4, 0, 0), radius=0.1*size, color=color.white)
# 產生代表速度、加速度的箭頭
arrow_v = arrow(pos=ball.pos+vec(1, 0, 0), axis=vec(0, 0, 0), shaftwidth=0.3*size, color=color.green)
arrow_a = arrow(pos=ball.pos+vec(2, 0, 0), axis=vec(0, 0, 0), shaftwidth=0.3*size, color=color.magenta)
# 繪圖部分
gd = graph(title="plot", width=600, height=450, x=0, y=600, xtitle="<i>t</i> (s)",
ytitle="blue: <i>y</i> (m), green: <i>v</i> (m/s), magenta: <i>a</i> (m/s<sup>2</sup>)")
yt = gcurve(graph=gd, color=color.blue)
vt = gcurve(graph=gd, color=color.green)
at = gcurve(graph=gd, color=color.magenta)
"""
3. 物體運動部分, 小球來回 5 次時停止
"""
while(i < 5):
rate(1000)
# 計算小球所受靜電力並存到變數 F
r1 = ball.pos - s1.pos
r2 = ball.pos - s2.pos
F1 = (k*Q*q) / r1.mag2 * r1.norm()
F2 = (k*Q*q) / r2.mag2 * r2.norm()
F = F1 + F2
# 計算運動中小球的加速度、速度、位置, 畫出代表速度、加速度的箭頭
ball.a = F/ball.m
ball.v += ball.a*dt
ball.pos += ball.v*dt
arrow_v.pos = ball.pos + vec(1, 0, 0)
arrow_a.pos = ball.pos + vec(2, 0, 0)
arrow_v.axis = ball.v
arrow_a.axis = ball.a
# 畫出 y-t, v-t, a-t 圖
yt.plot(pos=(t, ball.pos.y))
vt.plot(pos=(t, ball.v.y))
at.plot(pos=(t, ball.a.y))
# 判斷小球是否回到出發點, 計算回到出發點的次數
if(ball.pos.y >= h and ball.v.y >= 0):
print(t)
i += 1
# 更新時間
t += dt
程式設計部分
程式 19-2 與 19-1 幾乎一樣,以下只講解不同之處。
- 將小球放置於 (0, h, 0)。
- 小球初位置為上端點,因此下端點應該位於 y = -h 處,於端點處畫線標記位置。
- 表示速度、加速度的箭頭改成畫在小球右方距離為 1、2 兩處。
- 判斷小球是否回到出發點的條件改 if(ball.pos.y >= h and ball.v.y >= 0) 。
模擬結果
若以程式當中設定數值為例,當 h 很小的時候,週期理論值為 7.4075 ;若 h = 0.00001 則週期為 7.408000000000809;若 h = 3 則週期為 7.778000000000932;若 h = 9 則週期為 10.478999999999631。若從 y-t、v-t、a-t 圖來看,當 h = 3 時圖形相當接近 cos、-sin、-cos 的樣子,但是當 h = 9 時圖形就很奇怪了。
程式 19-2 畫面截圖
程式 19-2:h = 3 的 y-t、v-t、a-t 圖
程式 19-2:h = 9 的 y-t、v-t、a-t 圖
程式 19-3
理論推導
如下圖所示,有一個半徑為 $R$ 的環,圓環總電量為 $+Q$,電量均勻分布。若圓環位置固定,在兩者圓心上於距離 $x$ 處,有一個電量為 $-q$、質量為 $m$ 的點電荷。
若 $-q$ 點電荷在此處的速度為0,$x \ll R$,只考慮物體間靜電力的作用。計算 $-q$ 所受合力時,可以先將圓環分割成 $N$ 個小球,每小球的電量為 $\Delta Q = Q/N$,$-q$ 所受靜電力沿著連線方向,在另一側會有大小相等、左右方向相反的力,因此 $-q$ 合力方向向下,量值為
$$ F = \frac{kQq}{R^2 + x^2} \frac{x}{\sqrt{R^2 + x^2}} = \frac{kQqx}{R^3 \left(1 + \frac{x^2}{R^2} \right)^{\frac{3}{2}}} \approx \frac{kQqx}{R^3} = Kx $$
因此 $-q$ 做簡諧運動,週期
$$ T = 2\pi \sqrt{\frac{m}{K}} = 2\pi \sqrt{\frac{R^3}{kQq}} $$
程式 19-3.靜電力造成的簡諧運動(圓環, 放置在中垂線上方)
取得程式碼
"""
VPython教學: 19-3.靜電力造成的簡諧運動(圓環, 放置在中垂線上方)
Ver. 1: 2018/3/14
Ver. 2: 2019/9/15
作者: 王一哲
"""
from vpython import *
"""
1. 參數設定, 設定變數及初始值, 當 h << d 時週期理論值 5.29348 s
"""
size, m = 0.4, 1 # 小球半徑, 質量
q, Q = -2E-4, 8E-4 # 小球電量, 圓環總電量
r, N = 10, 100 # 圓環的半徑, 圓環分割成小球的數量
dQ = Q/N # 圓環分割後每個小球的電量
h = 9 # 小球在星球連線的中垂線上的距離
k = 8.988E9 # 靜電力常數
j, t, dt = 0, 0, 0.001 # 小球回到初位置的次數, 時間, 時間間隔
"""
2. 畫面設定
"""
# 產生動畫視窗
scene = canvas(title="Electric Force and Simple Harmonic Motion", width=600, height=600, x=0, y=0,
center=vec(0, h, 0), background=color.black)
scene.camera.pos = vec(0, 0.2, 0.8)*3*r
scene.camera.axis = vec(0, -0.2, -0.8)*3*r
# 產生可移動的小球
ball = sphere(pos=vec(0, h, 0), v=vec(0, 0, 0), radius=size, color=color.red, m=m)
# 產生帶電圓環及空白 list, 用 for 迴圈產生圓環分割後的小球並填入空白 list 中
Q_ring = ring(pos=vec(0, 0, 0), axis=vec(0, 1, 0), radius=r, thickness=0.4*size, color=color.green)
charges = []
for i in range(0, N):
charges.append(sphere(pos=vec(r*cos(i*2*pi/N), 0, r*sin(i*2*pi/N)), radius=0.5*size, color=color.blue))
# 畫圓環直徑、小球運動端點位置
line1 = cylinder(pos=vec(-r, 0, 0), axis=vec(2*r, 0, 0), radius=0.1*size, color=color.yellow)
line2 = cylinder(pos=vec(0, 0, -r), axis=vec(0, 0, 2*r), radius=0.1*size, color=color.yellow)
top = cylinder(pos=vec(-2, h, 0), axis=vec(4, 0, 0), radius=0.1*size, color=color.white)
bottom = cylinder(pos=vec(-2, -h, 0), axis=vec(4, 0, 0), radius=0.1*size, color=color.white)
# 產生代表速度、加速度的箭頭
arrow_v = arrow(pos=ball.pos+vec(1, 0, 0), axis=vec(0, 0, 0), shaftwidth=0.8*size, color=color.green)
arrow_a = arrow(pos=ball.pos+vec(2, 0, 0), axis=vec(0, 0, 0), shaftwidth=0.8*size, color=color.magenta)
# 繪圖部分
gd = graph(title="plot", width=600, height=450, x=0, y=600, xtitle="<i>t</i> (s)",
ytitle="blue: <i>y</i> (m), green: <i>v</i> (m/s), magenta: <i>a</i> (m/s<sup>2</sup>)")
yt = gcurve(graph=gd, color=color.blue)
vt = gcurve(graph=gd, color=color.green)
at = gcurve(graph=gd, color=color.magenta)
"""
3. 物體運動部分, 小球來回 5 次時停止
"""
while(j < 5):
rate(1000)
# 用 for 迴圈將 charges 當中的小球依序讀取出來指定給變數 charge, 計算小球的靜電力並存到變數 F
F = vec(0, 0, 0)
for charge in charges:
r = ball.pos - charge.pos
f = (k*dQ*q) / r.mag2 * r.norm()
F += f
# 計算運動中小球的加速度、速度、位置, 畫出代表速度、加速度的箭頭
ball.a = F/ball.m
ball.v += ball.a*dt
ball.pos += ball.v*dt
arrow_v.pos = ball.pos+vec(1, 0, 0)
arrow_a.pos = ball.pos+vec(2, 0, 0)
arrow_v.axis = ball.v
arrow_a.axis = ball.a
# 畫出 y-t, v-t, a-t 圖
yt.plot(pos=(t, ball.pos.y))
vt.plot(pos=(t, ball.v.y))
at.plot(pos=(t, ball.a.y))
# 判斷小球是否回到出發點, 計算回到出發點的次數
if(ball.pos.y >= h and ball.v.y >=0):
print(t)
j += 1
# 更新時間
t += dt
程式設計部分
程式 19-3 與 19-2 幾乎一樣,差別在於先將圓環切成 N 個小球,再利用 for 迴圈計算分割後的每一小段圓環與可移動小球之間的靜電力,最後求出可移動小球的合力。
模擬結果
若以程式當中設定數值為例,當 h 很小的時候,週期理論值為 5.29348 ;若 h = 0.00001 則週期為 5.238000000000084;若 h = 3 則週期為 5.500000000000171;若 h = 9 則週期為 7.409000000000809。若從y-t、v-t、a-t 圖來看,當 h = 3 時圖形相當接近 cos、-sin、-cos 的樣子,但是當 h = 9 時圖形就很奇怪了。
程式 19-3 畫面截圖
程式 19-3:h = 3 的 y-t、v-t、a-t 圖
程式 19-3:h = 9 的 y-t、v-t、a-t 圖
結語
以前講這類的題目時只能由數學式子推導週期,但是學生很難憑空想像小球的運動過程,利用這個動畫可以讓小球動起來,學生會比較有印象。
VPython官方說明書
- canvas: http://www.glowscript.org/docs/VPythonDocs/canvas.html
- sphere: http://www.glowscript.org/docs/VPythonDocs/sphere.html
- arrow: http://www.glowscript.org/docs/VPythonDocs/arrow.html
- cylinder: http://www.glowscript.org/docs/VPythonDocs/cylinder.html
- ring: http://www.glowscript.org/docs/VPythonDocs/ring.html
- graph: http://www.glowscript.org/docs/VPythonDocs/graph.html
HackMD 版本連結:https://hackmd.io/@yizhewang/SJHKW2SzX
沒有留言:
張貼留言