吳 濤,劉 陽,王世芳
(1. 武漢工程大學 數(shù)理學院,湖北 武漢 430205;2. 湖北第二師范學院 物理與機電工程學院,湖北 武漢 430205)
上世紀80年代,哈佛大學前校長德里克·博克(Derek Bok)[1]第一個提出了本科教學方法重于課程內(nèi)容的理念,主張要把教學方式、方法的革新放在首位,其次才是課程內(nèi)容的更新. 時至今日,隨著現(xiàn)代信息技術(shù)的飛速發(fā)展,教學手段和方法發(fā)生了一系列的變革,大學物理作為一門公共基礎(chǔ)課程,在這場新時代的教學模式變革中一直走在前列[2-6].
近年來,隨著互聯(lián)網(wǎng)和機器智能技術(shù)的不斷發(fā)展,各種高性能科學計算語言與軟件層出不窮,呈現(xiàn)出百花齊放的局面,在互聯(lián)網(wǎng)時代計算機語言的重要性已經(jīng)毋庸置疑,是每一位本科生的必備技能.現(xiàn)代物理學呈現(xiàn)出理論物理、實驗物理和計算物理三足鼎立的格局,而計算機的普及和發(fā)展也大力促進了大學物理形象化、可視化教學手段的應(yīng)用. 如何利用好現(xiàn)有資源和現(xiàn)代教育技術(shù),切合學生實際情況,合理實現(xiàn)科學計算軟件與語言和高校物理基礎(chǔ)課程教學的深度融合,在“新工科”形勢下培養(yǎng)學生的科學素養(yǎng)、工程技能和計算思維具有重要實際意義.
常用的Matlab、Mathematica和Origin等是商業(yè)軟件,價格昂貴,而基于Python語言的大量自由、免費、開源的軟件,最近幾年得到了飛速發(fā)展,例如著名的計算機視覺庫OpenCV、三維可視化庫VTK、醫(yī)學圖像處理庫ITK,而Python專用服務(wù)科學計算的擴展庫就更多了,例如如下幾個十分經(jīng)典的科學計算與專業(yè)作圖擴展庫:Numpy、Scipy、Pandas和Matplotlib,它們分別為Python提供了快速數(shù)組處理、數(shù)值運算以及繪圖功能. 因此Python語言及其眾多的擴展庫所構(gòu)成的開發(fā)環(huán)境十分適合工程技術(shù)、科研人員處理實驗數(shù)據(jù)、制作圖表,甚至開發(fā)科學計算應(yīng)用程序,尤其是基于Jupyter lab/notebook交互式教學平臺,可以無縫導入豐富的第三方庫來實現(xiàn)大學物理的三維可視化,例如Vpython可以快速創(chuàng)建三維場景和動畫,其內(nèi)置大量的函數(shù)可實現(xiàn)大學物理教學內(nèi)容的快速編程,三維可視化展示物理圖像. Matplotlib是基于Python語言的第三方專業(yè)繪圖庫,可以方便的導入Jupyter lab/notebook平臺,除此之外,還有豐富的其它基于Python的專業(yè)繪圖庫可供選擇,例如Plotly、Seaborn、Bokeh等. 在大學物理交互式、可視化教學中,Matlab、Mathematica等商業(yè)軟件完全可以由Python語言及其豐富的且更新速度很快、不斷發(fā)展進步的第三方庫所替代.
最近,中國農(nóng)業(yè)大學的研究者劉玉穎等在大學物理教學中引入Vpython對剛體的三維運動[7]、天體的軌道運動[8]、點電荷體系的靜電場及電荷在電場中的運動[9]進行了三維模擬. 本文以大學物理教學中簡諧振動部分為例,完整地介紹基于Jupyter lab平臺編寫教案與課件的方法,首先構(gòu)建簡諧振動的三維場景,給出簡諧振動方程的理論推導、數(shù)值求解及其擴展應(yīng)用、振動曲線的動態(tài)繪制,基于Vpython對簡諧振動的旋轉(zhuǎn)矢量法描述進行編程動畫展示,并進一步基于旋轉(zhuǎn)矢量法動態(tài)分析振動的合成與分解,得出拍的形成和李薩如圖的動態(tài)展示,最后給出復雜振動的傅里葉分析合成圖. 本文展示了基于Jupyter lab平臺對簡諧振動這一部分的教學,可以通過分析源代碼和三維動畫的方式完整的展示出來,便于學生進行探索式、互動式的學習,為培養(yǎng)學生計算思維和“新工科”教學模式改革與探索提供了新的借鑒,其相關(guān)內(nèi)容和知識可以推廣到其它學科的教學模塊.
Jupyter lab作為基于web的集成開發(fā)環(huán)境,利用它可以方便地編寫教案和制作授課課件,圖1展示了基于Jupyter lab制作的大學物理簡諧振動教學內(nèi)容與流程的截圖. Jupyter lab相比Jupyter notebook具有代碼塊折疊功能,在實際授課中能夠方便地展示本堂課的全部教學內(nèi)容. 圖1中下圖給出的為第一部分內(nèi)容(簡諧振動彈簧振子的三維場景構(gòu)建與理論分析)的隱藏內(nèi)容截圖,可以看出包含有Markdown編輯文字、LaTeX公式區(qū)、Python代碼區(qū)和三維動畫場景及作圖畫布區(qū). 其中集成的Markdown工具能夠支持廣泛使用的LaTex公式編輯語法,對復雜的物理公式與公式推導具有優(yōu)秀的展示效果. Python代碼區(qū)支持語法高亮和代碼補全等功能,可以方便學生閱讀和修改代碼,具有很好的互動效果. 三維動畫場景及畫布區(qū)能夠通過程序進行自由控制展示效果,特別是基于Vpython的動畫場景輸出能夠利用鼠標實現(xiàn)旋轉(zhuǎn)、移動、放大和縮小等各種功能,方便學生從不同的角度進行觀察,同時也增強了學習過程的互動性和趣味性.
圖1 基于Jupyter lab大學物理簡諧振動教學內(nèi)容與流程運行截圖
圖1利用第三方庫Vpython豐富的內(nèi)置三維形體對象,構(gòu)建出了水平彈簧振子的三維場景,并通過Python語言程序代碼可以自由方便的控制簡諧振動小球的三維動態(tài)運動,并同步動態(tài)在畫布上畫出振動曲線,讓學生直觀、生動的獲取簡諧振動的運動圖景. 動畫展示部分可以采用for循環(huán),也可以采用while語句,通過修改三維實物對象的pos屬性參數(shù)實現(xiàn)實物運動模擬仿真的實景效果.
def ode_rk4(funcs, time_span, y0_list, n_step, alpha):
n_var = len(y0_list)
dt = (time_span[1] - time_span[0]) / (n_step - 1)
y_solve = np.zeros((n_var, n_step))
y_solve[:, 0] = y0_list
time =np.linspace(time_span[0], time_span[1], n_step)
for i in range(n_step - 1):
k1 =np.array(funcs(y_solve[:, i], time[i] , alpha))
k2 =np.array(funcs(y_solve[:, i] + k1 * dt / 2, time[i] + dt / 2, alpha))
k3 =np.array(funcs(y_solve[:, i] + k2 * dt / 2, time[i] + dt / 2, alpha))
k4 =np.array(funcs(y_solve[:, i] + k3 * dt, time[i] + dt, alpha))
y_solve[:, i + 1] = y_solve[:, i] + dt / 6 * (k1 + 2 * k2 + 2 * k3 + k4)
return time,y_solve
只要根據(jù)物理問題的需要定義好funcs函數(shù),并導入程序運行所需的numpy庫,該ode_rk4求解函數(shù)可以求解含阻尼振動形式的一階常微分方程組,對于簡諧振動對應(yīng)的微分方程組的funcs函數(shù)可以用以下函數(shù)進行測試:
def funcs(y, t_var, alpha):
return [y[1], -y[0] - 2*alpha*y[1]]
給定初始條件,調(diào)用函數(shù)ode_rk4即可數(shù)值求解. 例如,利用調(diào)用參數(shù)為t, y_list=ode_rk4(funcs, [0, 15], [0, 6], 101, alpha=0)的數(shù)值解和解析解的位移-時間圖對比結(jié)果如圖2所示.
圖2 簡諧振動的龍格-庫塔法數(shù)值解和解析解對比圖
從圖2可以看出,具有4階精度的數(shù)值解和解析解結(jié)果吻合得非常好. 對于該數(shù)值求解,還可以引導學生進一步思考含有阻尼的振動,即假設(shè)振子運動過程中受到的阻力正比于速度的大小,只需要對調(diào)用函數(shù)ode_rk4中alpha值進行修改,可得出過阻尼、臨界阻尼及欠阻尼振動形式的數(shù)值解.
圖3 零阻尼、臨界阻尼、欠阻尼和過阻尼情況下的龍格-庫塔法數(shù)值解
圖3給出了不同阻尼系數(shù)alpha值情形下的數(shù)值解,分別對應(yīng)零阻尼、臨界阻尼、欠阻尼和過阻尼情況下的龍格-庫塔法數(shù)值解,這一部分可以作為研究性內(nèi)容讓學生進行選學,學生通過探索,得出不同類型情況下的阻尼系數(shù)所處的范圍,進而對各種振動形式有更深入和直觀的理解,同時探討在實際生活中的應(yīng)用,如樓道內(nèi)自動關(guān)閉門的阻尼鉸鏈的阻尼大小會非常接近臨界阻尼,以獲得最快的關(guān)閉速度,防止其來回振蕩.
利用Vpython強大的三維展示功能,可以動態(tài)的實現(xiàn)簡諧振動旋轉(zhuǎn)矢量描述的動畫展示,以及同步展示簡諧振動的位移-時間和速度-時間曲線,如圖4所示. 主要設(shè)計思想如下:首先給出作圓周運動的黑色小球在初始時刻的位置矢量,以及該小球在x軸上的投影位置,即真正作簡諧振動的灰色小球位置,再作出從坐標原點指向黑色小球的旋轉(zhuǎn)矢量以及簡諧振動灰色小球的速度矢量,該矢量也正好是圓周運動的黑色小球速度矢量在x軸上的投影.最后,當這些反映簡諧振動的小球運動起來后,通過循環(huán)語句更新不同時刻它們的位置坐標,并同步畫出簡諧振動灰色小球的位移-時間和速度-時間曲線,通過滑動體改變振幅、周期和初相,實現(xiàn)簡諧振動的旋轉(zhuǎn)矢量法交互式動畫演示效果. 旋轉(zhuǎn)矢量動畫和同步位移(速度)-時間曲線實現(xiàn)程序的循環(huán)語句如下:
x_plot = gcurve(graph=g, color=color.red, label="x")
v_plot = gcurve(graph=g, color=color.green, label="v")
while time <= T:
rate(10)
circle_list = vector(R*cos(theta), R*sin(theta), 0)
ball.pos = circle_list
b.pos = vector(circle_list.x, 0, 0)
a.axis = ball.pos
curve(a.pos+a.axis,b.pos,radius=0.01,color=color.green, opacity=0.5)
vel.pos = ball.pos
vel.axis = omega * R * vector(-sin(theta), cos(theta), 0)
vel2.pos =b.pos
vel2.axis = omega * R * vector(-sin(theta), 0, 0)
x_plot.plot(time, R * cos(theta))
v_plot.plot(time, R*omega*cos(theta + pi/2))
time += 1/15
theta = omega * time + phi
圖4 簡諧振動旋轉(zhuǎn)矢量描述法的Vpython動畫展示
類似圖4的Vpython編程思路,圖5給出了利用旋轉(zhuǎn)矢量描述法對拍振動曲線形成的交互式動畫演示截圖,旋轉(zhuǎn)矢量動畫和同步位移-時間曲線實現(xiàn)程序的循環(huán)語句如下:
x_plot = gcurve(graph=g, color=color.green, label="x")
time = 0
while time <= 5:
rate(10)
circle_1=vector(R1*cos(theta1),R1*sin(theta1),0)
ball1.pos = circle_1
arrow1.axis = ball1.pos
circle_2=vector(R2*cos(theta2),R2*sin(theta2),0)
ball2.pos = circle_2
arrow2.axis = ball2.pos
circle_3 = ball1.pos + ball2.pos
ball3.pos = circle_3
arrow3.axis = ball3.pos
b.pos = vector(circle_3.x, 0, 0)
curve(arrow3.pos+arrow3.axis, b.pos)
x_plot.plot(time, ball3.pos.x)
time += 1/300
theta1 = omega1 * time + phi1
theta2 = omega2 * time + phi2
圖5 利用旋轉(zhuǎn)矢量法動畫演示拍曲線的形成
從圖5的動畫演示中可以看出,代表兩個分振動的旋轉(zhuǎn)矢量的角速度很大且有細微差別時,它們構(gòu)成的平行四邊形的形狀即合成矢量的長度會不斷緩慢的變化,值得指出的是有兩個特殊的時刻,即當兩個分振動對應(yīng)的旋轉(zhuǎn)矢量重合時,合振動的振幅最大,當兩個分振動對應(yīng)的旋轉(zhuǎn)矢量成180°角時,合振幅為零. 從振動曲線也能同步反映這個合振幅周期性變化的特點,兩次最大振幅或者最小振幅之間的時間間隔即為拍的周期,其倒數(shù)就是拍頻.通過該旋轉(zhuǎn)矢量的動畫演示,可以直觀看出1 s內(nèi)兩個分振動的旋轉(zhuǎn)矢量能夠重合的次數(shù)就是它們的頻率之差,這對應(yīng)的正是拍頻.
振動的合成與分解是引導學生理解簡諧振動是自然界最基本的一種振動形式的關(guān)鍵內(nèi)容,除了采用2.2節(jié)的旋轉(zhuǎn)矢量法動態(tài)演示拍的形成外,還可以采用振動曲線疊加法進行交互式演示,圖6給出了基于Jupyter lab演示同方向簡諧振動合成過程的交互式界面截圖. 學生可以通過滑動條改變兩個同方向作簡諧振動的質(zhì)點的振幅、角頻率和初相,振動曲線就能動畫演示其合成的振動的振動曲線,通過這種方式也能演示拍和其它復雜振動的合成結(jié)果.值得注意的是,在Python編程中實現(xiàn)交互式演示編程中,需要導入第三方庫Ipywidget的Interactive方法,其中部分函數(shù)的定義與調(diào)用代碼為:
def same_direction_plotting(A1=5, A2=5, w1=1, w2=2, phi1=pi, phi2=1/3 * pi):
x1, x2, x = [], [], []
for t in times:
x1.append(A1 * cos(w1 * t + phi1))
x2.append(A2 * cos(w2 * t + phi2))
for i in range(len(x1)):
x.append(x1[i] + x2[i])
fig, axes =plt.subplots(3,1)
plt.tight_layout()
interactive_plot=interactive(same_direction_plotting,A1=(1,5,1), A2=(1, 5, 1), w1=(1, 101),w2=(1, 101), phi1=(0, 2*pi), phi2=(0, 2*pi))
interactive_plot
類似圖6交互式演示的編程方法,基于Vpython可以實現(xiàn)垂直方向簡諧振動的合成動畫演示,同樣學生可以通過圖7上邊的滑動條修改相關(guān)參數(shù),實現(xiàn)不同整數(shù)頻率之比的李薩如圖的繪制與動畫演示效果,繪制出非常復雜的振動曲線. 從這些合成復雜振動的動畫演示中,可以引導學生通過自己設(shè)置模擬參數(shù),交互式繪制圖像、曲線,通過修改程序代碼實現(xiàn)不同振動曲線,并思考李薩如圖有哪些實際應(yīng)用,理解為什么說簡諧振動是一種最基本的振動形式.
圖6 基于Jupyter lab拍形成的交互式可視化截圖
圖7 基于Jupyter lab李薩如圖形成的交互式可視化截圖
圖8 基于Jupyter lab方波信號傅里葉諧波交互式合成圖
圖8給出了基于Jupyter lab方波信號的傅里葉合成圖,在生成圖8的編程中導入了交互式作圖第三方庫Plotly,從圖8中可以看出,通過滑動條可以交互式改變諧波的個數(shù),直觀的看到隨著諧波數(shù)的增大,傅里葉合成曲線與原始方波信號的近似程度越來越高,學生可以通過進一步修改代碼來探索方波信號傅里葉分解的頻譜結(jié)構(gòu),并可以讓學生課后類似地作出鋸齒三角波的傅里葉合成與分解圖. 最后,通過圖8方波和三角波的傅里葉分解,引出傅里葉分析與簡諧振動的合成與分解的關(guān)系,說明任何復雜的線性振動都可以分解為若干個最基本的、最簡單的簡諧振動的合成,這些最基本的合成單元可能是無數(shù)多個,并引導學生在課后利用Python語言編程進一步作出這些復雜振動所對應(yīng)的頻譜圖,從而深刻理解物理學中疊加原理的思想.
大學物理理論性強、概念抽象,學生在學習過程中一直存在物理概念不清楚、物理圖像不清晰、內(nèi)容枯燥難懂的問題. 本文基于Jupyter lab平臺和Vpython庫,展示了大學物理簡諧振動部分相對完整的交互式、三維可視化的教學教案、編程方式與教學手段. 在教學實踐中便于學生理解和掌握相關(guān)物理概念、物理圖像,為提高學生的學習興趣、自主學習能力,培養(yǎng)學生的計算思維提供了新的交互式學習模式. 例如,利用Markdown功能編寫教學課件,編排復雜的數(shù)學公式,創(chuàng)新界面美觀、所見即所得的學習模式,易于掌握和激發(fā)學生動手能力和學習興趣. 程序代碼和三維圖像界面可以動態(tài)的展示出來,并能夠拖動和變換角度,使抽象的概念可以獲得非常直觀的物理圖像. 通過Vpython的動畫演示,讓學生自己修改程序代碼的參數(shù),可以實現(xiàn)人機互動的模擬實驗過程,使抽象的物理公式和概念形象化、具體化,在增強趣味性的同時,幫助學生掌握了物理圖像和編程技巧. 利用Jupyter lab平臺把數(shù)值實驗搬到教學課堂,并督促學生自己完成數(shù)值實驗的課后作業(yè),對培養(yǎng)學生的計算思維,體現(xiàn)“新工科”教學的培訓和學習目標提供了有益的探索與借鑒.