月份彙整: 2017 年 2 月

VPhysics試教-都卜勒效應的視覺化

教學目標:

利用Python模擬出都卜勒效應的視覺化與數值化,實際”看到”,當波源與觀察者互相接近時,頻率上升,波長變短;當波源與觀察者互相遠離時,頻率下降,波長變長。

傳統教學缺點:

當我們要介紹都卜勒效應時,面臨兩大困境: 一、聲波是動態,黑板的板書無法呈現。二、生活體驗的都卜勒效應,易被聲音的大小聲(振幅)迷惑,誤以為靠近變大聲,遠離變小聲是都卜勒效應。課堂上僅介紹公式,學生無法體驗感受,屬於低學習成就的單元。

VPhysics教學優點:

利用學生改變參數,實際”看到”都卜勒效應的不同。

第一步,改變波源的速度,變成與觀察者速度相同=>觀察是否有都卜勒效應?。

第二步,改變觀察者的速度,變大變小=>觀察接受到波數的變化=>當觀察者速度大於波速,會有音爆(sonic bomb)、震波(shock wave)的產生。

第三步,由以上兩步驟,歸納出都卜勒效應的公式。

Python程式:

### doppler-Wavefront.py
### Doppler Effect for Sound (requires VPython)
### Rob Salgado
### salgado@physics.syr.edu http://physics.syr.edu/~salgado/
###
### v0.5 2007-02-27 tested on Windows XP/TabletPC
### with Python-2.3.4.exe and VPython-2003-10-15.exe
### 改寫: 中港高中王尊信老師 v.20170227

from visual import *

vs=0.20 #波源的速度
vr=0.30 #觀察者的速度
vw=0.00 #風速,預設為零,減少變因。原程式設為0.10

scene=display(x=0,y=0,height=700,width=700)
scene.autoscale=0

source=sphere(radius=0.2, pos=vector(0,0,0), vel=vector(vs,0,0), color=color.red)
receiver=sphere(radius=0.2, pos=vector(3,0,0), vel=vector(vr,0,0), color=color.green)
diffx=receiver.x-source.x
if diffx==0:
signdiffx=0
elif diffx==fabs(diffx):
signdiffx=1
else:
signdiffx=-1
windvel=vector(vw,0,0)
nudge=vector(0,6,0)
nudgev=vector(0,0.5,0)

vsarrow=arrow(pos=source.pos+nudge ,axis=5*vector(vs,0,0) , fixedwidth=1, shaftwidth=0.1, color=source.color)
vrarrow=arrow(pos=receiver.pos+nudge-nudgev ,axis=5*vector(vr,0,0),fixedwidth=1 ,shaftwidth=0.1, color=receiver.color)
if vw != 0: vwarrow=arrow(pos=nudge+2*vector(0,1,0) ,axis=5*vector(vw,0,0),fixedwidth=1 ,shaftwidth=0.1, color=color.cyan)

vslabel=label(pos=vsarrow.pos+nudge ,text=”%4.2f” %vs , color=source.color,box=1)
vrlabel=label(pos=vrarrow.pos-nudgev ,text=”%4.2f” %vr , color=receiver.color)
if vw != 0: vwlabel=label(pos=vwarrow.pos+vector(0,1,0) ,text=”wind speed= %4.2f” %vw , color=vwarrow.color)
tmax=12.
dt=0.005
twopi=2*math.pi
N=32

ball=[]
ball0flag=[]
sourcelabel=[]
receivedlabel=[]

def new_wave(t):
ball0flag.append(0)
sphere(radius=0.05, pos=source.pos, color=(.5,0,0) )
sphere(radius=0.05, pos=receiver.pos, color=(0,.5,0) )

for i in range(0,N):
theta=twopi*i/float(N)
ball.append(sphere(radius=0.1,pos=source.pos,
vel=vector(cos(theta),sin(theta),0) ))
sourcelabel.append( label(pos=ball[N*(len(ball0flag)-1)+3*N/4].pos, text=”%4.2f” %t,
color=source.color, linecolor=source.color ))
def meeting(t):
global signdiffx
label(pos=source.pos+nudge-nudgev/2.0, text=”(%4.2f)” %t,
color=color.white, linecolor=color.white )
print “(%4.2f)” %t
signdiffx=2

print “successive wavefronts received at time…”
new_wave(0)
told=0
#clock=label()
for t in arange(0,tmax+dt,dt):
rate(100)

# clock.text=”%f” % (t%1.0)
if t%1.0 < told%1.0:
# print “t=”,t, “len=”,len(ball)
new_wave(t)

told=t

if signdiffx==0:
if fabs(receiver.x-source.x)>0: meeting(t)
elif signdiffx==1:
if (receiver.x-source.x)<=0: meeting(t)
elif signdiffx==-1:
if (receiver.x-source.x)>=0: meeting(t)

for i in arange(len(ball)):
ball[i].pos += (ball[i].vel+windvel)*dt
source.pos += source.vel * dt
receiver.pos += receiver.vel * dt

vsarrow.pos=source.pos+nudge
vrarrow.pos=receiver.pos+nudge-nudgev

vslabel.pos=vsarrow.pos+nudgev
vrlabel.pos=vrarrow.pos-nudgev

for j in arange(len(ball0flag)):
sourcelabel[j].pos=ball[N*j+3*N/4 ].pos
if (ball0flag[j]==0 and
( (receiver.x >= source.x and ball[N*j].x >= receiver.x)
or (receiver.x <= source.x and ball[N*j+N/2].x < receiver.x)
)):
ball0flag[j]=1
print “%4.2f” %t
receivedlabel.append( label(pos=ball[N*j+(N-3)].pos, text=”%4.2f” %t,
color=receiver.color, linecolor=receiver.color ))
elif ball0flag[j]==1:
receivedlabel[j].pos=ball[N*j+(N-3) ].pos

#Now… WHEN AN OBJECT IS PICKED, 如果選擇某物體
#TRANSLATE THE scene.center TO THE OBJECT’S POSITION, THEN ZOOM 視窗將會移到此物體,放大
while 1:
rate(5)
if scene.mouse.clicked:
scene.mouse.getclick()

newPick=scene.mouse.pick
if newPick !=None:
tempcolor=newPick.color
newPick.color=color.yellow
#pick_r=newPick.x*4.
#string= “r=%7.5f” % pick_r
#label(pos=newPick.pos,text=string,xoffset=-5,yoffset=5)

target=newPick.pos
step=(target-scene.center)/20.
for i in arange(1,20,1):
rate(10)
scene.center +=step
scene.scale *= 1.037 #(1.037**19=1.99)
newPick.color=tempcolor

心得:

用Python學物理,並非一步登天,馬上要學會程式的撰寫。處在資訊時代,看懂程式,改適當的參數,是學Python可讀性高(read-ability)的優勢,充分利用這樣的優勢,讓物理變視覺化,幫助理解,是科學教育、創客精神(maker)重要的一環

 

VPhysics試教-計算等加速度追趕公車問題

教學目標:

利用Python計算出模擬出運動學的等加速度運動,以常見段考題~~追趕公車問題為例,熟悉Python的等速度與等加速度,藉由改變參數,讓追趕問題變有感

傳統教學缺點:

當我們要計算追趕問題時,學生一方面要對等速度與等加速度的觀念熟悉;另一方面,當兩者綜合時,學生往往容易混淆而產生迷思概念,屬於低學習成就的單元。

VPhysics教學優點:

利用學生改變公車與趕公車的乘客的速度與加速度,歸納出追上公車的情形,進而了解兩這相對速度、相對位移與v-t圖的交錯面積。

Python程式:

###############################程式開始##############################
from visual import *

#——————————————————————————
# 1. 參數設定: 改成追趕公車題型
#——————————————————————————
v = 0.09 #木塊速度 = 0.03 m/s
dt = 0.0001 #畫面更新的時間間隔,單位為s
t = 0 #模擬所經過的時間 ,單位為s,初始值為0

a=1
v2=0
dx=0.045

#——————————————————————————
# 2. 畫面設定
#——————————————————————————
scene = display(title=’1′, width=800, height=800, x=0, y=0, center=(0,0.06,0), background=(0.5,0.6,0.5))
floor = box(pos=(0,-(0.005)/2,0), length=0.3, height=0.005, width=0.1)
cube = box(pos=(0, 0.05/2, 0), length=0.05, height=0.05, width=0.05, material=materials.wood)
cube2 = box(pos=(0, 0.05/2, 0), length=0.05, height=0.04, width=0.05)
cube2.pos.x =dx

#——————————————————————————
# 3. 物體運動部分
#——————————————————————————
while(cube.pos.x < 0.10):
rate(1000)
t += dt
cube.pos.x += v*dt
v2 +=a*dt
cube2.pos.x += v2*dt
print t

心得:

這是第一個將物理講義的題目,變成Python的程式,寫完可以滿足學生在程式設計的成就感

VPhysics試教-計算波耳氫原子光譜條數

教學目標:

利用Python計算出波耳氫原子光譜,當電子由高能階降到低能階時,總共產生哪幾個能階

傳統教學缺點:

當我們要計算波耳氫原子能階的條數時,如果學生的排列組合觀念不佳時,老師無法以列舉法詳細列出光譜種類,利用Python可以大量列舉、反覆練習,故適合用Python作為此單元的補救教學

VPhysics教學優點:

利用學生改變高低能階時,詳細列出各種情形,使學生徹底了解光譜的規則

Python程式:

# -*- coding: cp950 -*-
# 0.程式目標: 計算波爾氫原子光譜條數 coded by 中港高中王尊信老師
# v. 201702 wthwth@mail.cgsh.tc.edu.tw

# 1.參數設定

# 2.畫面設定

# 3.初始條件

ni=2 #低能階
nf=6 #高能階
# 4.運動輸出

for i in range (ni,nf):

for j in range (i+1, nf+1):
print’There is the spectrum from the ‘,i,’th energy level to the ‘,j,’th energy level.’

心得:

此程式簡單扼要,適合初學者學習,容易產生成就感

VPhysics試教-計算波耳氫原子光譜

教學目標:

利用Python計算出波耳氫原子光譜,當電子由高能階降到低能階時,損失能量以光能釋出,故可求得對應之能量、頻率與波長

傳統教學缺點:

99課綱教材在基礎物理新納入量子現象此單元,因為需要計算,學生普遍覺得困難,故許多資深老師反映學習成效不高,屬於低學習成就之單元,曾有人建議教育部課綱小組刪除此單元,故適合用Python輔助教學

VPhysics教學優點:

利用學生改寫程式時,需要對參數有所了解,否則將輸出錯誤結果,提高學習成效,達成有感教學之目標

Python程式:

# -*- coding: cp950 -*-
# 0.程式目標: 計算波爾氫原子光譜 coded by 中港高中王尊信老師
# v. 201702 wthwth@mail.cgsh.tc.edu.tw

# 1.參數設定

# 2.畫面設定

# 3.初始條件

ni=1 #低能階
nf=2 #高能階

deltaE =13.6/ni**2-13.6/nf**2 #能階差
wavelength =1240/deltaE #波長
frequency = 3E17/ wavelength #頻率

# 4.運動輸出

print(‘The energy from the ‘,nf,’th energy level to the ‘,ni,’th energy level is’,deltaE, ‘eV.’)

print(‘The wavelength of the EM wave is’,wavelength, ‘nm.’)

print(‘The frequence of the EM wave is’,frequency, ‘Hz.’)

心得:

此程式簡單扼要,適合初學者學習,容易產生成就感

VPhysics試教- Python學習

一、運動學

一.1 一維直線運動

等速度

等加速度

變加速度

一.2 二維平面運動

等加速度

變加速度

一.3 三維空間運動

二、力學(流體力學)

看見都卜勒效應相對運動產生頻率、波長的變化

三、光學

四、電磁學

五、近代物理

計算 波耳氫原子光譜的能量、頻率與波長

計算波耳氫原子光譜線條數

 

六、其他

(詳細教材請看PPT)

一、下載Phython、VPython

1. 鍵入www.python.org  =>下載 =>安裝

2. 鍵入vpython.org=>下載 =>安裝

 

二、環境介紹、執行

三、網路資源

(1) 石明豐教授 VPhysics課程 http://vphysics.ntu.edu.tw