2018年5月10日 星期四

靜電力及簡諧

作者:王一哲
日期:2018/5/9




我們之前在〈重力及簡諧〉當中處理過重力造成的簡諧運動,當我們學到靜電力時會發現庫侖定律和萬有引力定律的型式很像,因此靜電力應該也能產生相同的運動模式。以下有 3 個不同的程式:





程式 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,用途已寫在該行的註解當中。




畫面設定


  1. 將大球放置於 (-d, 0, 0) 及 (d, 0, 0) 處,將小球放置於 (h, 0, 0)、初速度為 0、質量為 m。
  2. 畫大球間的連線。小球初位置為右端點,因此左端點應該位於 x = -h 處,於端點處畫線標記位置。
  3. 產生表示速度、加速度的箭頭,為了使箭頭不要疊在一起,分別畫在小球上方距離為 1、2 兩處。
  4. 開啟繪圖視窗,畫小球的位置、速度、加速度與時間關係圖。




物體運動


  1. 為了使動畫在小球來回 5 次時停止,將 while 迴圈當中的條件設定為 i < 5,並用 if(ball.pos.x >= h and ball.v.x >= 0) 判斷小球是否回到出發點,若回到出發點則印出經過的時間 t 及回到出發點的次數 i 。
  2. 利用庫侖定律計算小球所受合力 F,再由 F = ma 計算小球的加速度,更新速度及位置。
  3. 最後畫 x-tv-ta-t 圖,更新時間。




模擬結果


若以程式當中設定數值為例,當 h 很小的時候,週期理論值為 5.2345 ;若 h = 0.00001 則週期為 5.238000000000084;若 h = 3 則週期為 4.881999999999965;若 h = 6 則週期為 3.7829999999996944。若從 x-tv-ta-t 圖來看,當 h = 3 時圖形相當接近 cos、-sin、-cos 的樣子,但是當 h = 6 時圖形就很奇怪了。





程式 19-1 畫面截圖




程式 19-1:h = 3 的 x-tv-ta-t




程式 19-1:h = 6 的 x-tv-ta-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 幾乎一樣,以下只講解不同之處。

  1. 將小球放置於 (0, h, 0)。
  2. 小球初位置為上端點,因此下端點應該位於 y = -h 處,於端點處畫線標記位置。
  3. 表示速度、加速度的箭頭改成畫在小球右方距離為 1、2 兩處。
  4. 判斷小球是否回到出發點的條件改 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-tv-ta-t 圖來看,當 h = 3 時圖形相當接近 cos、-sin、-cos 的樣子,但是當 h = 9 時圖形就很奇怪了。





程式 19-2 畫面截圖




程式 19-2:h = 3 的 y-tv-ta-t




程式 19-2:h = 9 的 y-tv-ta-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-tv-ta-t 圖來看,當 h = 3 時圖形相當接近 cos、-sin、-cos 的樣子,但是當 h = 9 時圖形就很奇怪了。





程式 19-3 畫面截圖




程式 19-3:h = 3 的 y-tv-ta-t




程式 19-3:h = 9 的 y-tv-ta-t



結語


以前講這類的題目時只能由數學式子推導週期,但是學生很難憑空想像小球的運動過程,利用這個動畫可以讓小球動起來,學生會比較有印象。





VPython官方說明書


  1. canvas: http://www.glowscript.org/docs/VPythonDocs/canvas.html
  2. sphere: http://www.glowscript.org/docs/VPythonDocs/sphere.html
  3. arrow: http://www.glowscript.org/docs/VPythonDocs/arrow.html
  4. cylinder: http://www.glowscript.org/docs/VPythonDocs/cylinder.html
  5. ring: http://www.glowscript.org/docs/VPythonDocs/ring.html
  6. graph: http://www.glowscript.org/docs/VPythonDocs/graph.html



HackMD 版本連結:https://hackmd.io/@yizhewang/SJHKW2SzX

沒有留言:

張貼留言