日期:2018/5/13
拉塞福散射 (Rutherford scattering) 實驗是找到原子核存在的重要證據。將 α 粒子(氦原子核)射向金箔,α 粒子與金原子核之間的靜電力為排斥力,若忽略重力的作用,由於金原子核固定不動,α 粒子所受靜電力通過金原子核,相對於金原子核的角動量守恆。α 粒子與金原子核之間只有靜電力作功,系統力學能守恆。
下圖為拉塞福散射實驗示意圖,當 α 粒子於無窮遠處時速度向右,金原子核與速度方向之間的垂直距離稱為碰撞參數,通常代號為 b。這次的程式目標是改變 b,畫出 α 粒子動能、系統電位能、力學能與時間的關係圖,找出 α 粒子向上偏移的量值。
拉塞福散射實驗示意圖
程式 24-1.拉塞福散射
取得程式碼
GlowScript 網站動畫連結
"""
VPython教學: 24-1.拉塞福散射
Ver. 1: 2018/4/8
Ver. 2: 2019/9/19
作者: 王一哲
"""
from vpython import *
"""
1. 參數設定, 設定變數及初始值, 長度單位 nm, 質量單位 amu, 電量單位 e, 時間單位 ns
"""
r1, m1, q1, c1 = 0.4, 4, 2, color.red # 氦原子核半徑(放大後)、質量、電量、顏色
r2, m2, q2, c2 = 1, 197, 79, color.yellow # 金原子核半徑(放大後)、質量、電量、顏色
v0 = vec(10, 0, 0) # 氦原子核初速度
b, L, k = 1, 40, 1 # 氦原子核初速度與金原子核的垂直距離, 畫面長、寬, 假的靜電力常數
t, dt = 0, 0.001 # 時間, 時間間隔
"""
2. 畫面設定
"""
# 產生動畫視窗
scene = canvas(title="Rutherford Scattering", width=800, height=600, x=0, y=0,
center=vec(0, 0, 0), background=color.black)
# 產生原子核
alpha = sphere(pos=vec(-0.5*L + r1, b, 0), radius=r1, m=m1, q=q1, v=v0, color=c1, make_trail=True)
au = sphere(pos=vec(0, 0, 0), radius=r2, m=m2, q=q2, color=c2)
# 產生表示速度、加速度的箭頭
arrow_v = arrow(pos=alpha.pos, shaftwidth=0.5*r1, color=color.cyan)
arrow_a = arrow(pos=alpha.pos, shaftwidth=0.5*r1, color=color.magenta)
# 繪圖部分
gd = graph(title="Energy - Time Plot", width=600, height=450, x=0, y=600,
xtitle="t", ytitle="red: K, green: U, blue: E")
Kt = gcurve(graph=gd, color=color.red)
Ut = gcurve(graph=gd, color=color.green)
Et = gcurve(graph=gd, color=color.blue)
"""
3. 物體運動部分
"""
while(abs(alpha.pos.x) < L/2 and abs(alpha.pos.y) < L/2):
rate(500)
# 計算氦原子核所受合力, 更新氦原子核加速度、速度、位置
F = k*alpha.q*au.q / alpha.pos.mag2 * alpha.pos.norm()
alpha.a = F/alpha.m
alpha.v += alpha.a*dt
alpha.pos += alpha.v*dt
# 更新表示速度、加速度的箭頭
arrow_v.pos = alpha.pos
arrow_a.pos = alpha.pos
arrow_v.axis = alpha.v
arrow_a.axis = alpha.a
# 計算氦原子核動能、系統電位能、力學能並繪圖
K = 0.5 * alpha.m * alpha.v.mag2
U = k * alpha.q * au.q / alpha.pos.mag
E = K + U
Kt.plot(pos=(t, K))
Ut.plot(pos=(t, U))
Et.plot(pos=(t, E))
# 更新時間
t += dt
參數設定
在此設定變數為 r1、m1、q1、c1、r2、m2、q2、c2、v0、b、L、k、t、dt,用途已寫在該行的註解當中。為了使數值設定上較為方便,長度單位為 nm,質量單位為 amu,電量單位為 e,時間單位為 ns,k 的量值假設為1。
畫面設定
- 產生動畫視窗。
- 產生原子核。
- 產生表示速度、加速度的箭頭。
- 產生繪圖視窗。
物體運動
- 當粒子位於 -L/2 < x < L/2、 -L/2 < y < L/2 之間時動畫持續執行,因此 while 迴圈當中的條件設定為 (abs(alpha.pos.x) < L/2 and abs(alpha.pos.y) < L/2)。
- 計算氦原子核所受合力, 更新氦原子核加速度、速度、位置。
- 更新表示速度、加速度的箭頭。
- 計算氦原子核動能、系統電位能、力學能並繪圖。
- 更新時間。
模擬結果
手動設定 b 的量值並觀察結果,以下是使用 3 個不同的 b 值得到的結果。
程式 24-1:b = 1 畫面截圖
程式 24-1:b = 1 能量 - 時間闗係圖
程式 24-1:b = 3 畫面截圖
程式 24-1:b = 3 能量 - 時間闗係圖
程式 24-1:b = 5 畫面截圖
程式 24-1:b = 5 能量 - 時間闗係圖
程式 24-2.拉塞福散射, 用 for 迴圈依序代入 b = 0, 1, 2, 3, ..., 10
取得程式碼
GlowScript 網站動畫連結
"""
VPython教學: 24-2.拉塞福散射, 用 for 迴圈依序代入 b = 0, 1, 2, 3, ..., 10
Ver. 1: 2018/4/8
Ver. 2: 2019/9/19
作者: 王一哲
"""
from vpython import *
"""
1. 參數設定, 設定變數及初始值, 長度單位 nm, 質量單位 amu, 電量單位 e, 時間單位 ns
"""
r1, m1, q1 = 0.4, 4, 2 # 氦原子核半徑(放大後)、質量、電量
r2, m2, q2, c2 = 1, 197, 79, color.yellow # 金原子核半徑(放大後)、質量、電量、顏色
v0 = vec(10, 0, 0) # 氦原子核初速度
L, k = 40, 1 # 畫面長、寬, 假的靜電力常數
t, dt = 0, 0.001 # 時間, 時間間隔
"""
2. 畫面設定
"""
# 產生動畫視窗
scene = canvas(title="Rutherford Scattering", width=800, height=600, x=0, y=0,
center=vec(0, 0, 0), background=color.black)
# 產生金原子核
au = sphere(pos=vec(0, 0, 0), radius=r2, m=m2, q=q2, color=c2)
"""
3. 用 for 迴圈依序代入 b = 0, 1, 2, 3, ..., n
"""
n = 10
for i in range(0, n+1, 1):
# 產生氦原子核
alpha = sphere(pos=vec(-L/2 + r1, i, 0), radius=r1, m=m1, q=q1, v=v0,
color=vec((n-i)/n, 0, i/n), make_trail=True)
# 產生表示速度、加速度的箭頭
arrow_v = arrow(pos=alpha.pos, shaftwidth=0.5*r1, color=color.cyan)
arrow_a = arrow(pos=alpha.pos, shaftwidth=0.5*r1, color=color.magenta)
# 物體運動部分
while(abs(alpha.pos.x) < L/2 and abs(alpha.pos.y) < L/2):
rate(500)
# 計算氦原子核所受合力, 更新氦原子核加速度、速度、位置
F = k*alpha.q*au.q / alpha.pos.mag2 * alpha.pos.norm()
alpha.a = F/alpha.m
alpha.v += alpha.a*dt
alpha.pos += alpha.v*dt
# 更新表示速度、加速度的箭頭
arrow_v.pos = alpha.pos
arrow_a.pos = alpha.pos
arrow_v.axis = alpha.v
arrow_a.axis = alpha.a
# 更新時間
t += dt
# 於 while 迴圈結束時隱藏箭頭
arrow_v.visible = False
arrow_a.visible = False
# 印出 b - y 數值
print(i, alpha.pos.y - i)
程式設計部分
程式 24-2 和 24-1 很像,以下只說明修改之處。
- 畫面設定部分只先產生金原子核。
- 用 for 迴圈依序產生 0, 1, 2, …, 10 作為 b 的量值,將產生粒子及粒子運動部分的 while 迴圈放到 for 迴圈當中。
- 當 while 迴圈執行完畢使用 arrow_v.visible = False 以及 arrow_a.visible = False 隱藏箭頭。
- 印出碰撞參數 b 以及鉛直方向偏移量值 y。
模擬結果
以下是程式 24-2 的執行結果,可以看到當 b = 0 時粒子沿入射方向反彈,除此之外當 b 愈小時鉛直方向偏移量值 y 愈大。
b | y |
0 | 0.0 |
1 | 18.541669854502143 |
2 | 8.15934777838773 |
3 | 5.290932738798059 |
4 | 3.903700702382096 |
5 | 3.07827335437314 |
6 | 2.5262914670585754 |
7 | 2.1306456411917694 |
8 | 1.8315824334085065 |
9 | 1.597115286538127 |
10 | 1.4085584194546925 |
程式 24-2 畫面截圖
y - b 關係圖
結語
這個動畫的效果看起來比較單調,視覺效果上不像 PhET 的動畫那麼好,有興趣的同學可以自己研究一下如何修改。
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
- graph: http://www.glowscript.org/docs/VPythonDocs/graph.html
HackMD 版本連結:https://hackmd.io/@yizhewang/Sycg-ROzm
沒有留言:
張貼留言