Lecture 9 List的練習
建國高中特色選修課程 - 物理現象的程式設計與模擬
作者:賴奕帆
日期:2018/8/25
一、場的觀念
當某些物體出現時,會在它們四周空間裡造成影響,「場」就代表這些影響。
- 純量場:物理量本身僅具有大小。Ex:雨量場。
- 向量場:物理量本身不僅具有大小,還有方向之場。Ex:重力場、電場、磁場。
- 重力場:一物體因有質量而在空間建立重力場,另一物體在此重力場中則受到萬有引力。
重力場強度和重力加速度
- 重力場強度(gravitational field):
將測試質點放入空間中某點,其所受萬有引力 與其質量m的比值,定義為該點重力場強度 。簡稱為重力場。
(1) 公式:每單位質量的物體所受之重力,即
(2) 單位:或,方向與F相同,指向地心
(3) 重力場強度是位置的函數,與測試質點無關。
(4) 重力場為向量,場源有數個時,應以向量加法的方式合成。
- 空間中某點的「重力場強度」等於該點的「重力加速度」。
- 質量為的質點在重力場強度為的位置,所受重力。
- 重力場的向量性:
疊加原理(Principle of superposition):
若空間一位置的重力場並不是單獨由一物所建立,則該位置的重力場強度為各物所單獨建立之重力場的向量和。如圖所示,星球質量M1及M2在P位置各建立的重力場為及,則P位置的重力場 。
電場(Eledtric field)
-
電場︰在帶電體的周圍附近,電力所及的空間。
-
電場強度(electric field strengh簡稱電場):
將電量甚小的測試電荷放入空間中某點(測試電荷不能影響原本空間電荷分佈),其所受靜電力與其電量的比值,定義為該點的電場強度。 -
公式: ;
(定義為:某點的電場等於單位正電荷在該點所受的靜電力。) -
電場單位:牛頓/庫侖
-
點電荷在空間中產生的電場分布:
(1)與點電荷相距之某點的電場大小 。
(2)若Q為正,電場方向背向Q向外射出;若Q為負,電場方向指向Q由外射入。
(3)點電荷不只一個時,空間中某點電場等於各個點電荷在此點建立電場的向量和。
電力線 (Line of electric force)
- 法拉第引入的想像概念:
沿著正電荷受力的方向連續移動所得的軌跡稱為電力線
(1) 置一可動單位正電荷在電場中,沿所受電力方向緩慢連續移動此電荷所得的曲線。
(2) 正電荷在線上任一點的切線方向,即電力在該點的方向,即此正電荷在該點所受電場方向。
-
電力線的特性:
(1)電力線始於正電荷,終止於負電荷,非封閉曲線。
(2)電力線上各點切線方向表示「該點的電場方向」。
(3)電力線互不相交,否則同一點將有兩個電場的方向。
(4)電力線會彼此排擠,可解釋 同性 電會互斥。
(5)電力線是張緊的力線,可解釋 異性 電會相吸。
(6)電力線不一定等於正電荷的運動軌跡。 -
「電力線密度」表示「電場強度大小」:
(1) 每單位面積上通過的電力線數正比於該處的電場強度。
(2) 電荷所發出或終止的電力線數須正比於其電量。
二、List的練習_萬有引力
高二物理第六章 萬有引力 範例題目
均勻的細圓環半徑為R,質量為M,在中心軸上距環中心d處有質量為m的物體,則:
(1)m受圓環的萬有引力F為何?
(2)若m置於環中心(即d=0),則F為何?
(3)若d >>R時,則F為何?
(4)若R >> d時,則F為何?若細圓環固定,將物體m靜止釋放會如何運動?週期為何?
【參考解答】
(1) 將環等分成N個等分,則每等分質點dM = M/N ,dM與m之萬有引力為,其與垂直環面之分量為
所有dm質點對m之合力為
(2) 若d=0,則質點與環之引力F=0
(3) 若d>> R,,相當於質點與質點之間的作用力。
(4) 若R>> d,同學若暫時不能完全理解上述計算其實沒有關係,總言之,若d<<R時,m會因受圓環萬有引力的作用,而在圓環環心處上下震盪,其震盪週期為,符合簡協運動的運動方程式,且,所以m釋放後會做簡協運動,代入簡協運動的週期公式,
同學若暫時不能完全理解上述計算其實沒有關係,總言之,若d<<R時,m會因受圓環萬有引力的作用,而在圓環環心處上下震盪,其震盪週期為
讓我們練習寫這個題目吧。
"""
建國中學 Vpython物理模擬
作者: 物理科 賴奕帆老師
日期: 107/08/25
特色課程 Lecture 09 List的練習_萬有引力_球與圓環的SHM
9_01_SHM_Circle and Ball_Fg.py
"""
from vpython import * #引用視覺畫套件Vpython
"""
1. 參數設定
"""
G=2000 #重力常數
M=1.0 #圓環總質量
m=1.0 #球質量
dt = 0.001
t = 0
R = 10 #圓環半徑
"""
2. 畫面設定
"""
scene = canvas(width=1000, height=600, background=vec(0.6,0.8,0.8),range = 0.9*R)
scene.center = vec(0,0,0) #設定視窗中心點
ball = sphere(pos=vector(0,0.5,0), radius = 0.5, color=color.green, v = vec(0,0,0), make_trail = True)
# 利用List畫出360顆小球代表圓環
balllist = []
for N in range(0,360,1):
balllist.append(sphere(pos=vector(R*cos(N*pi/180),0,R*sin(N*pi/180)),
radius = 0.1, color=color.red))
"""
3. 執行迴圈
"""
while True:
rate (1000)
t = t+dt
ball.pos = ball.pos
-
執行後,可看到紅色的球ball1、藍色的球ball2、彈簧與兩顆球的速度箭頭等物件,現在都還不會動。
-
在程式中的畫面設定裡面,有準備描繪出這兩顆球運動中的x-t、v-t與a-t圖,但目前還沒呈現出來。
-
執行後,我們可以看到我們利用了List畫了360顆小球,來代表圓環,圓環的環心上方有一顆綠球,等等要讓綠球受到360顆小球的萬有引力,並在環心之間做簡諧運動。
-
但是,數學可能還沒教三角函數,所以可能很難理List畫圓的程式碼,讓我們換個方式練習List吧。
練習List,用list寫長方形木板
將畫圓環的程式碼改為下面的語法。
""" 練習List_改成利用紅球畫棒子"""
for N in range(-50,51,1):
balllist.append(sphere(pos=vector(N*0.02*R,0,0), radius = 0.1, color=color.red))
-
將紅球排列成一列直棒,請問你知道這裡到底有幾顆球嗎?
-
若要更清楚紅球的編號與位置,可以在while True前,打
print (balllist[0].pos , balllist[1].pos, balllist[49].pos, balllist[100].pos)
可以知道每個球的編號意義與相對位置關係。
*同學能嘗試自己將長棒改為平板,甚至是立方體嗎?
利用雙重甚至三重的迴圈,嘗試看看吧。
課堂作業 9-1
請嘗試用雙重甚至三重的迴圈,做出如下圖的平板甚至是立方體的圖示吧。
-
用小球繪製平板,同學可以猜猜這裡有幾個小球,如何編號呢?
-
用小球繪製立方體,老師這裡用的球比較少,因為太多會嚴重lag,共有7x7x7顆球。
課堂作業 9-1 參考解法步驟 :
-
將在for N in range(-50,51,1)改為for N1 in range(-50,51,1),並再多一層迴圈for N2 in range(-50,51,1),注意多層迴圈的程式縮排。
-
修改pos=vector(N x 0.02 x R,0,0)為pos=vector(N1 x 0.02 x R,0,__________)。
-
若成功修改,請嘗試想想這裡到底有幾顆球,10000顆嗎?這些球是如何排列編號的呢?請嘗試用 print (balllist[???].pos) 檢視自己的想法。
-
由於這裡的物件超過一萬,所以程式明顯產生lag。
-
改換回繪製立方體,在加多一層for迴圈,由於只要7x7x7顆球,因此修改for N1 in range(???,???,1)
讓球受圓環萬有引力,使其運動並計算簡諧運動週期
讓綠球受到圓環360顆紅色小球的受力,觀察綠球運動模式與計算運動週期
""" 讓綠球受到圓環360顆紅色小球的受力(3. 執行迴圈)"""
Fglist=[] #定義List
for P in range(0,360,1): #用for迴圈計算每個紅球與綠球間的距離與計算引力
dist = ((ball.pos.x-balllist[P].x)**2+(ball.pos.y-balllist[P].y)**2+(________________)**2)**0.5
radiavector = (ball.pos-balllist[P].pos)/dist
Fglist.append(-G*M*m*radiavector/(dist**2))
Fg = vector(0, 0, 0) #每次迴圈重新計算要歸0
for K in range(0,360,1): #利用for迴圈將Fglist內儲存的力累加起來
Fg += ______________
ball.v += ______________ #有力後就能改變速度與控制位置
ball.pos = ball.pos + ball.v*dt
- 這裡要讓綠球色到360顆紅色小球的萬有引力,我們用了list的概念,每dt的時間內,個別計算了每個紅球與綠球間的位置、判斷出它們之間的萬有引力,並放入Fglist內。
- 再利用for迴圈,將Fglist內儲存的力資料,用Fg += Fglist[K]累加,形成合力,並使其運動。
- 執行後,有看到綠球在圓環圓心上下震盪嗎? 當綠球很靠近環心時,上下的震盪週期應該是
- 讓我們檢視看看。
計算SHM震盪週期
利用三點紀錄法,讓程式算出簡諧運動的震盪週期,檢視是否與理論相符。
""" 三點紀錄法_定義前點位置(2. 畫面設定)"""
pre_ball_pos = vector(0,0,0)
""" 三點紀錄法_在迴圈中記錄前點與前前點(3. 執行迴圈)"""
pre_pre_ball_pos = pre_ball_pos
pre_ball_pos = vector(ball.pos.x , ball.pos.y, ball.pos.z)
""" 三點紀錄法_在綠球震盪最上方,列印震盪週期(3. 執行迴圈最末)"""
if pre_ball_pos.y > pre_pre_ball_pos.y and pre_ball_pos.y > ball.pos.y :
tp = _________________________
print ('simulate period = ' , '%1.5f'%t , 'theory period = ' , '%1.5f'%tp)
t = 0
- tp = _____________,請嘗試自行將理論公式輸入,其中比較需要注意的地方是,M是圓環的質量喔,而不是圓環中單一紅球的質量。
- 在此我們成功利用List將此題的理論與模擬結合。
- 但是,最後綠球居然……,開始亂跑!? 這是符合物理概念的嗎? 還是程式模擬的錯誤呢?
三、List的練習_重力場與靜電場
請同學先玩一下下述的程式碼,裡面用到滑鼠控制的部分,有機會再討論。
"""
建國中學 Vpython物理模擬
作者: 物理科 賴奕帆老師
日期: 107/08/25
特色課程 Lecture 09 List的練習
Practice dipole field.py
"""
from vpython import * #引用視覺畫套件Vpython
ec = 1.6e-19 # electron charge
scene = canvas(width=1000, height=600, background=vec(0.0,0.0,0.0),range = 2e-13)
scene.title="Electric Field Vectors"
charges = [ sphere( pos = vec(-1e-13,0,0), Q = +ec, color=color.red, radius = 6e-15 ),
sphere( pos = vec(1e-13,0,0), Q = -ec, color=color.blue, radius = 6e-15 ), ]
def getfield(p):
f = vector(0,0,0)
for c in charges:
f = f + (p-c.pos) * 8.988e9 * c.Q / mag(p-c.pos)**3
return f
while True:
rate(30) #以每1/30秒的週期執行下列指令
m_ev = scene.waitfor('click mousedown mouseup mousemove') #滑鼠event
if m_ev.event == 'mousedown': #如果滑鼠按下左鍵
f = getfield(m_ev.pos)
m = mag(f)
red = max( 1-1e17/m, 0 )
blue = min( 1e17/m, 1 )
if red >= blue:
blue = blue/red
red = 1.0
else:
red = red/blue
blue = 1.0
arrow( pos=m_ev.pos, axis=f * (4e-14/1e17),
shaftwidth = 6e-15,color=vec(red,0,blue))
- 執行後,會看到空間中出現紅色與藍色兩顆小球,這裡分別代表正電荷與負電荷。當我們按下滑鼠的右鍵,會出現一個箭頭,這箭頭代表了若在此位置有個單位小正電荷,此單位電荷的受力(電場)。
- 我們也可以修改紅色小球的電量,使其由正電荷改為負電荷,並觀察空間中的電場如何變化。
- 在上述程式碼中,可以利用滑鼠點擊,得出空間中每一個位置受兩個電荷的電場結果,但卻難以理解整體空間的電場分布,若想得知整體空間中的分布狀況,有沒有更有效的處理方法呢?
繪製空間中的重力場
先執行下述的程式碼,看看如何用List與for迴圈繪製空間中的場。
"""
建國中學 Vpython物理模擬
作者: 物理科 賴奕帆老師
日期: 107/08/25
特色課程 Lecture 09 List的練習_重力場與電場
9_01_Gravity force field.py
"""
from vpython import * #引用視覺畫套件Vpython
"""
1. 參數設定
"""
G = 6.67 ; M = 6*10**1 ; Re = 10 ; t = 0 ; dt = 0.001
"""
2. 畫面設定
"""
def ag(x): #定義重力場公式
return -G*M/(x**2)
scene = canvas(width=1000, height=800, center=vec(0,0,0),background=vec(0.6,0.8,0.8),range=6*Re)
earth = sphere(pos=vec(0,0,0), radius=Re, texture=textures.earth)
arrowlist = [] #定義箭頭放置的List
for N1 in range(-5,6,1): #X軸
for N2 in range(-5,6,1):#Y軸
arrowlist.append(arrow(pos=vector(N1*Re,N2*Re,0),axis=vector(5,0,0),shaftwidth=1 , color=color.red))
"""
3. 執行迴圈
"""
while True:
rate(1000)
- 執行後,看到有個地球,且在空間中利用前述List與for迴圈,繪出11x11個向量箭頭,目前每個箭頭的方向均為vector(5,0,0),讓箭頭的方向改為受地球重力場的方向。
- 讓空間中List中的箭頭方向改為所受地球重力場的方向。
"""
2. 畫面設定
"""
for N in arrowlist:
N_dist = mag(N.pos - earth.pos) #計算每個箭頭與地球間的距離純量
N_radiavector = norm(N.pos-earth.pos) #計算每個箭頭與地球間的距離單位向量
if N_dist > 1.2*Re and N_dist < 5*Re:
N.axis = ag(_________) * _________ * 10
else: N.axis = vector(0,0,0)
- 這裡將arrowlist中的arrow以N表示,逐一計算每個arrow與地球之間的位置向量(包含大小N_dist與方向N_radiavector),
- 再帶入前面定義的ag(x)重力場函數,最後重新標示出每個arrow(N)的axis。
- 比較特別的地方是我們只計算N_dist>1.2*Re的引力場,因為地表內的引力場不能簡單用計算。
課堂作業 9-2
如同課堂作業9-1,請同學嘗試修改上述的arrowlist append迴圈,寫出如下圖立方體空間的引力場。
課堂作業 9-2 參考解法步驟 :
- 將原有的平面for迴圈再多一層改為三層的立體for迴圈。
- 將arrowlist.append(arrow(pos=vector(N1xRe,N2xRe,_______)中的Z軸位置補上。
四、List的練習_力線
在上節,我們已經會用向量箭頭來表達空間中的力場,在Vpython中能用力線表達力場嗎?
"""
建國中學 Vpython物理模擬
作者: 物理科 賴奕帆老師
日期: 107/08/25
特色課程 Lecture 09 List的練習_重力場與電場
9_03_electric field line simulation.py
"""
from vpython import * #引用視覺畫套件Vpython
"""
1. 參數設定
"""
k = 9*10**9 ; size = 0.1 ; b_N = 36
Q1_charge = 10**(-5) #Q1電量
Q1_position = vector(0, 0, 0) #Q1位置
t = 0 ; dt = 0.001
"""
2. 畫面設定
"""
scene = canvas(title='dipole', height=600, width=1200, range=3.5,
auto_scale=False, background=vec(0.3,0.4,0.4), fov=0.004)
Q1 = sphere(pos = Q1_position , radius = size , color = color.blue)
#2 畫出每個質點球, 每個球的名稱為field_ball[N] (N=0~b_N)
field_ball=[]
for N in range(0,b_N,1):#build field ball from ball
field_ball.append(sphere(pos=vector(size*cos(2*pi*N/b_N), size*sin(2*pi*N/b_N),0)+Q1_position,
radius=0.01, color=color.yellow, make_trail=True, v=vec(0,0,0)))
def Force_E(r, q):#force of field
r1 = r - Q1_position
return k*q*Q1_charge*r1.norm()/(r1.mag*r1.mag)
"""
3. 執行迴圈
"""
while True:
rate(1000)
for N in field_ball:
N.v = Force_E(N.pos, 1.0).norm()
N.pos += N.v*dt
- 執行後,我們可以看到畫面中間有一個藍色的Q1正電荷,往外射出36條電力線。
- 電力線其實是等速前進留下軌跡的黃色小球,它們的運動軌跡是依循著與藍色正電荷間的庫倫作用力的方向,而非如之前運動學所述,由受力產生加速度,加速度改變速度,速度控制位置的概念。
加入一個紅色的負電荷,觀察電力線如何變化
首先在參數設定加入紅色負電荷的基本參數,並在畫面設定處置入紅色電荷。
"""
1. 參數設定
"""
Q2_charge = -1*10**(-5) #Q2電量
Q2_position = vector(2, 0, 0) #Q2位置
"""
2. 畫面設定
"""
Q2 = sphere(pos = Q2_position , radius = size , color = color.red)
請同學們練習自行修正def Force_E(r, q)中的return,讓黃色小球運動的軌跡能同時依循藍色正電荷與紅色負電荷的庫倫作用力合力的方向。
def Force_E(r, q):#force of field
r1 = r - Q1_position
r2 = ___________________
return k*q*Q1_charge*r0.norm()/(r1.mag*r1.mag)+____________________________
- 黃色小球的軌跡可以視為有一個單位正電荷所受藍色正電荷與紅色負電荷,所受合力的受力方向。(注意,此處黃色小球軌跡是受力方向,而非速度方向)
同學們可以調整藍色正電荷與紅色負電荷的電荷量,若改為2:1,則會如下圖所示。
- 與之前高中課本內附的圖示相符,感覺相當不錯。
- 但對學科學的我們而言,感覺還是差了一點,不夠對稱的美,有辦法讓模擬圖看起來更舒服嗎?
讓紅色負電荷也射出電力線
上節程式碼成功的利用黃色小球代表單位正電荷,其運動軌跡繪出電力線來表達電力場的概念,但卻不夠對稱完美,能讓紅色負電荷也會射出"單位負電荷",來繪製電力線吧。
"""
讓兩個球都能畫單位電荷,List的名稱分別為field_ball_1與field_ball_2
"""
field_ball_1=[]
for N in range(0,b_N,1):
field_ball_????.append(sphere(pos=vector(size*cos(2*pi*N/b_N), size*sin(2*pi*N/b_N),0)+Q1_position,
radius=0.01, color=vec(1,1,0), make_trail=True, v=vector(0,0,0)))
field_ball_????=[]
for N in range(0,b_N,1):
field_ball_????.append(sphere(pos=vector(size*cos(2*pi*N/b_N), size*sin(2*pi*N/b_N),0)+____________,
radius=0.01, color=vec(0.8,0.8,0.3), make_trail=True, v=vector(0,0,0)))
並且在"“執行迴圈”"處讓兩個List的單位電荷場球都能隨著靜電力的方向運動。
"""
修改執行迴圈的程式碼,讓兩組List都能隨著靜電力方向運動
"""
for N in field_ball_????:
N.v = Force_E(N.pos, 1.0).norm()
N.pos += N.v*dt
for N in _______________:
N.v = __________________________
N.pos += _____________
- 模擬出來的結果就跟課本中一樣的完美。
- 但再次提醒同學,黃色小場球的運動軌跡是單位電荷的受力方向,而非速度方向。
- 我們可以嘗試真的放入一顆小電荷,看看它在這個空間中的運動狀況。
加入一個橘色小電荷,觀察其運動
讓我們真實的加一顆能運動的橘色小電荷進去,看看它會怎麼動吧。
""" 設定電荷參數(1. 參數設定)"""
q_charge = 1 * 10 **(-7) #小電荷電量
q_position = vector (1 , 1 , 0) #小電荷初始位置
q_m = 10**(-3) #小電荷質量
q_v = vector (0.0 , 0.0 , 0.0) #小電荷初速度
""" 在模擬中放置橘色小球代表電荷 (2. 畫面設定)"""
q = sphere(pos = q_position , radius = 0.5*size , color = color.green , v = q_v, make_trail=True)
""" 讓小電荷能受靜電力作用開始運動 (3. 執行迴圈)"""
if mag(q.pos-Q1_position)>=size and mag(q.pos-Q2_position)>=size :
q.v = q.v + Force_E(q.pos, q_charge)/q_m *dt
q.pos = q.pos+q.v*dt
else :
q.pos = q.pos
- 綠色小球的運動軌跡挺有趣的對吧,大家可以想想為何在初始設定下,綠球會在固定範圍內反覆運動。也可以嘗試隨便改參數,如起始位置、速度、電量、質量等,玩玩看不同的狀況吧。
進階作業 9-1
105年 台大物理系二階段試題
在三維空間中有一xy平面,有兩個靜止的正面荷(電量為q)分別位於x軸的d/2和-d/2處,另有兩個靜止的負電荷(電量為-q)位於y軸的d/2和-d/2處,如下圖所示,請在xy平面上繪出電力線。
並嘗試在空間中也丟入一個綠色正電荷小球,使其受到這四顆固定電荷的靜電力,觀察其運動軌跡。
進階作業 9-1 參考解法步驟 :
-
在畫面設定處,重新設定四個電荷的名稱與位置。
-
重新放置四組List的場球
-
重新定義每顆場球受到四個電荷的靜電力(電場)
-
在迴圈處控制四組List電場球
-
放入綠色小球,觀察它的運動狀況
進階作業 9-2
請同學先執行以下程式碼
"""
建國中學 vpython 物理模擬
作者: 物理 科賴奕帆老師
高二物理
gas collision
"""
from vpython import *
from random import *
"""
1. 參數設定
"""
t = 0.0 ; t1 = 0.0 ; dt = 0.0001 #時間參數
theta = 30.0 * pi / 180 #氣體入射角度
d = 3.0 #氣體與牆壁距離
r = 0.50 #氣柱半徑
v0 = 2.0 # 氣體初速率
m = 0.01 #單一氣體質量
K = 5.0 #牆壁碰撞參數
per_N = 100.0 #每秒射出的氣體數
F_theory = 2*m*v0*cos(theta)*per_N #氣體碰撞的理論平均力
"""
2. 畫面設定
"""
scene = canvas(align = 'left' , center = vec ( -0.5*d , 0 , 0 ) , height=600, width=600, range=3.5,
auto_scale=False, background=vec(0.6,0.8,0.8) , fov = 0.004) #設定畫面
wall = box(pos=vec(0.0,0,0),length=0.6, height=5 , width=5, opacity = 0.9 , texture = textures.wood) #設定牆壁
gas = [] #氣體的List
F_t = graph(align='left',width=400,height=400, #畫J-t圖
title='F-t', xtitle='t', ytitle='F',
foreground=color.black,background=color.white,
xmax=5, xmin=0, ymax=2*F_theory, ymin=0)
f1 = gcurve(color=color.red)
f2 = gcurve(color=color.blue)
sum_F = 0 #計算程式中每顆小球撞擊牆壁時的總力
"""
3. 執行迴圈
"""
while True:
rate(10000)
t = t + dt #時間
t1 = t1 + dt
sum_F = 0 #每千分之一秒,程式內的總力要歸零重算
if t1 > 1/ per_N: # 設定per_N = 100.0時,則每1/100秒會射出一顆空氣分子
t1 = 0
r_dom = random() #空氣射出的位置隨機參數
p_dom = random() #空氣射出的角度位置參數
gas.append( sphere(pos = vector((-d*cos(theta)+r*r_dom*cos(p_dom*2*pi)*sin(theta)),(d*sin(theta)+r*r_dom*cos(p_dom*2*pi)*cos(theta)),(r*r_dom*sin(p_dom*2*pi))) , radius = 0.05, v = vec(v0*cos(theta),-v0*sin(theta),0) , Fx = 0 , visible = True))
# 每1/100秒會產生一個隨機位置的空氣分子,以相同的速度射出
for N in gas : #gas List內所有的空氣分子撞擊牆壁時,都會受到一個-Kx的向左受力
N.Fx = 0
if N.pos.x > wall.pos.x: #當x軸位置比牆壁還右側時,會受到-Kx的向左受力
N.Fx = - K*(N.pos.x - wall.pos.x) #牆壁給空氣分子的力
N.v.x += N.Fx / m * dt #力改變x軸方向的速度
N.pos += N.v*dt #速度控制位置
else: #若空氣分子沒碰到牆壁時,即等速度前進
N.pos += N.v*dt
sum_F += -N.Fx #累加所有空氣分子所受牆壁的受力
if N.pos.x < -d*cos(theta) - 0.3 : #當空氣分子打至左側 -d*cos(theta) - 0.3位置時,使其由List消失
N.Fx = 0
N.visible = False
N = None
f1.plot( pos=(t,sum_F)) #繪圖
f2.plot( pos=(t,F_theory))
-
gas collision是高三上物理 氣體動力論中常討論的問題,將空氣噴出,若碰撞到牆壁反彈,則牆壁所受到的平均力(平均壓力)的討論。
-
同學可以嘗試修改入射角度theta與每秒射出的氣體數per_N兩個基本參數玩看看。
-
請同學們嘗試將此模擬,加上上一節所教的靜電力概念,改成下圖另一個大家熟悉的金箔原子撞擊模擬。
-
希望同學們修完這九節課之後,都能有這樣的能力,加油。
進階作業 9-2 參考解法步驟 :
-
先擷取此原程式中最主要的部份,即射出粒子的程式碼,並讓粒子能超過vec(0,0,0)一段距離後就能消失。其他不需要的都先用alt+3忽略。
-
重新設定基本參數,包含萬有引力常數k,電荷電量與電荷質量等等,並且讓球射出的數量減少,調整螢幕大小。
""" 重新設定基本參數(1. 設定參數)"""
theta = 00.0 * pi / 180 #氣體入射角度, 改為平行入射
per_N = 5.0 #每秒射出的粒子數,改為每秒射入5個粒子
k = 9*10**9 #設定庫倫常數
Q_charge = 10**(-5) #設定金原子電量
q_charge = 10 **(-8) #設定粒子電量
q_m = 10**(-3) #設定粒子質量
""" 調整螢幕大小(2. 設定畫面)"""
scene = canvas(..., height=600, width=1000)
- 讓射出的粒子加上軌跡
- 若以上設定均調整無誤,應該可以看到螢幕左側射出粒子,並於右側消失。
-
在原點畫出金原子,並定義庫倫力公式。
-
在執行迴圈處讓List內的電荷都會受到金原子庫倫力的作用。
Lecture 9 作業完整參考解法
-
同學們,在看參考解之前,請先想清楚自己是否真的有花時間想過如何寫課堂作業和進階作業了呢?
-
學習無他,但求自己覺得好玩而已。
-
若真的想把一件事情學好,務必花時間才能掌握。
-
希望這邊的作業參考解法,真的都只是讓同學們拿來參考,而不是為了繳交作業的複製貼上。
-
想過了嗎? 那請點下面的網址吧。
本單元課程自2018.7.1日起已被瀏覽 2554 次