王明浩
湖北大學物理系 湖北武漢 430062
大學物理是大學理工科類學生的基礎必修課程。通過本課程的學習,學生可以了解自然界物質的結構、性質、物質之間的相互作用及其運動的基本規律[1]。良好的科學素養不論是在后續的學習還是未來的工作和生活中,都將會為學生提供幫助,可以說是受益終身[2]。然而,在大學物理的教學中,經常會有學生抱怨物理學太難了。這體現在一方面物理學需要大量的數學知識,而往往由于課程安排的緣故(譬如高等數學和大學物理同時開課),這些所需的數學知識學生尚未學習和掌握;另一方面,物理學自身也存在大量的抽象概念,單純從公式上很難理解其背后的物理圖像[3]。
隨著計算機技術的不斷發展,各類計算軟件層出不窮,這使得人們從繁重的計算任務中解放出來,從而投入更具創新性的活動中。計算軟件的應用十分廣泛,譬如,計算仿真軟件可以仿真各種實驗,而不需要真實地做實驗。這為我們節省了大量的資金和資源[4-5]。科學計算有望為解決大學物理教學中的上述問題提供幫助。
Python是目前最流行的高級程序設計語言之一,因其免費、易學習、可擴展以及豐富的第三方庫等特點,廣泛應用于科學研究中[6]。免費、易學習這兩個特點使其非常適合低年級本科生學習和使用。這將為Python引入大學物理的教學中提供了可能。Python擁有豐富的第三方庫。譬如,SCIPY可以處理最優化、積分、常微分方程求解等;MATPLOTLIB可以繪制各種精美的圖形,可以將計算結果可視化等。Python的這些庫可以幫助學生們有效地解決物理中的各種數學問題;同時,Python提供的諸多工具包可以將結果可視化,這有助于學生更好地理解抽象的物理過程,掌握其背后的物理圖像[7]。最后,在這個過程中,學生將逐漸培養出一種將問題歸結為計算問題,然后利用計算機進行求解的計算思維。新工科環境下,這種全新的思維方式顯得越來越重要,對學生未來的學習和工作大有裨益[8]。
大學物理中的很多問題,學生們在掌握了相應的物理知識之后,通常可以順利地列出相應的等式、方程組或者微分方程。然而,若在講授這些內容時,由于課程安排,學生尚未掌握求解這類問題的數學知識,必然會對物理教學產生影響。這是大學物理教學中普遍存在的現象,是導致學習大學物理困難的主要原因之一。我們發現借助Python科學計算,學生通過調用相關計算包可以容易地求解這類數學問題,這使得學生繞過復雜的數學求解,降低了學習的難度。同時,這也讓學生節省了大量精力,將注意力集中到物理問題本身,從而進一步討論其背后的物理。
這里我們用具體案例,討論Python在求解物理中數學問題的應用。
案例1:物體在黏滯流體中運動會受到流體的阻力作用。當速率不太大時,對于球形的物體,黏滯阻力大小約為Fr=6πηrv,其中r為物體半徑,v為其速率,η為流體的黏度。假設如圖1所示,質量為m半徑為r的球形物體由水面靜止釋放沉入水中,求球體的運動情況[1]。

圖1
本題是典型的運動學問題。按圖1所示,受力分析得小球在水中受到重力G、浮力FB以及阻力Fr共同作用,運動軌跡豎直向下。這里給定小球之后,重力G、浮力FB便確定了,相比較黏滯阻力Fr卻隨小球的運動情況而變化。

G-FB-Fr=ma
(1)
Fr=6πηrv
(2)
(3)
v(t=0)=0
(4)
聯立公式(1)、(2)、(3)和(4),我們有:
(5)
其中F=G-FB,b=6πηr。
大部分同學經過受力分析,利用牛頓定律都可以順利地列出上述方程。然而,數學知識的缺乏使得許多學生止步于此,后續的物理討論更是無法進行下去。這里,我們討論如何使用Python解決這一數學問題。學生只需敲下如下代碼:
1.FROM SYMPY IMPORT * # 從SYMPY包中導入函數
2.T,M,F,B=SYMBOLS('T,M,F,B') # 聲明T,M,F,B為符號
3.V=FUNCTION('V')(T) # 聲明V是關于T的函數
4.RESULT=DSOLVE(F-B * V-V.DIFF(T),ICS={V.SUBS(T,0):0})# 調用DSOLVE函數,求解微分方程。其中方程F-B * V-V.DIFF(T)等于0,表示待求方程,ICS={V.SUBS(T,0):0})表示初始條件V(T=0)=0
5.PRINT(RESULT) # 輸出計算結果
代碼1
便可以得到如下結果:EQ(V(T),(F+EXP(B*(-T/M+LOG(-F)/B)))/B),此即微分方程(5)的解:
案例1是大學物理力學部分非常典型的問題。從該案例可以看出,借助Python科學計算,學生們可以跳過微分方程復雜的求解過程,即使不懂如何求解微分方程,也可以順利得到結果。該方法并不復雜,低年級本科生可以很容易地掌握。這體現了一種非常重要思維——計算思維。學生在借助Python科學計算學習大學物理的同時,也培養和訓練了計算思維。
學習大學物理的另一個困難之處在于有些公式和結果過于抽象。初學者理解起來比較困難。Python科學計算提供了豐富的可視化工具。借助這些工具,學生可以很容易地將抽象的計算結果可視化,從而更容易地理解物理過程和圖像。本小節借助具體的案例,討論如何利用Python完成對物理問題和概念的可視化。
我們首先討論對函數的可視化。
案例2:接著案例1討論,我們已經求得v(t)的具體表達式,但是該表達式代表什么樣的物理過程呢?v-t圖可以幫助我們理解這個物理過程。借助Python,我們可以很容易地得到v-t圖。

1.IMPORT MATPLOTLIB.PYPLOT AS PLT # 導入相關包
2.IMPORT NUMPY AS NP
3.T=NP.LINSPACE(0,60,100) # 離散化時間
4.B_LIST=[0.1,0.2,0.3] # 設定B的可能取值
5.V_LIST=[]
6.FOR B IN B_LIST: # 循環帶入B的值,計算不同時刻得到速度
7.V=1/B *(1-NP.EXP(-B * T))
8.V_LIST.APPEND(V)
9.PLT.PLOT(T,V_LIST[0],LABEL="B=0.1") # 繪圖B=0.1時的V-T圖
10.PLT.PLOT(T,V_LIST[1],LABEL="B=0.2") # 繪圖B=0.2時的V-T圖
11.PLT.PLOT(T,V_LIST[2],LABEL="B=0.3") # 繪圖B=0.3時的V-T圖
12.PLT.XLABEL("T")
13.PLT.YLABEL("V")
14.PLT.LEGEND()
15.PLT.SHOW() # 顯示圖片
代碼2
運行結果為:

圖2 速度隨時間變化曲線
圖2給出了v-t圖。借助這個圖,學生可以清楚地看出速度隨時間的變化趨勢:隨著時間的推移,小球的速度越來越大,但是卻會收斂于某個值;b越小最后的收斂值越大。有了這個結論,不難對其進行物理上的解釋,即隨著小球速度逐漸增大,受到的阻力會隨之增大,當G-FB=Fr時,小球處于受力平衡狀態,根據公式(1),小球加速度為零,速度不再增加;并且b越小,阻力越小,小球最終的速度也就越大;特別的,若b=0,則小球將一直加速下去。借助這個結果,學生們就很容易聯想并理解為什么雨點降落到地面時的速度是有限的了。
大學物理中還有另外一個極為重要的概念——場。但由于其較為抽象,學生理解起來也較為困難。接下來,我們討論Python對場的可視化,從視覺上感受其分布。
案例3:光學是大學物理的重要組成部分,已知雙縫干涉接收屏上光場的強度分布近似為:
(7)
其中I1和I2分別為狹縫1和2到達接收屏上任意一點的光強,λ為波長,d′為接收屏到狹縫的距離,d為狹縫之間的距離。這樣的一個光場是什么樣的分布呢?
為了方便可視化,我們假設I1=I2=1。輸入如下代碼
1.IMPORT NUMPY AS NP # 導入相關包
2.IMPORT MATPLOTLIB.PYPLOT AS PLT
3.X,Y=NP.MESHGRID(NP.LINSPACE(-15,15,100),NP.LINSPACE(-7.5,7.5,100)) # 離散數據點
4.I1=2+2*NP.COS(X) # 輸入場分布
5.I2=2+2*NP.COS(0.5*X)
6.PLT.SUBPLOT(2,1,1)
7.PLT.PCOLORMESH(X,Y,I1) # 繪圖
8.PLT.COLORBAR()
9.PLT.XLABEL("X")
10.PLT.YLABEL("Y")
11.PLT.TITLE("A",LOC='LEFT')
12.PLT.SUBPLOTS_ADJUST(HSPACE=0.5)
13.PLT.SUBPLOT(2,1,2)
14.PLT.PCOLORMESH(X,Y,I2)
15.PLT.COLORBAR()
16.PLT.XLABEL("X")
17.PLT.YLABEL("Y")
18.PLT.TITLE("B",LOC='LEFT')
19.PLT.SHOW()
代碼3
輸出結果為:

圖3 雙縫干涉圖
這里圖3中的圖a對應2πd/d′λ=1,圖b對應2πd/d′λ=0.5。
代碼3看似復雜,實際上核心語句只是4和5行。學生們稍作修改就可以繪出其他光場,不難掌握。學生可以從圖上直接感受到光場分布,并且容易得出結論:圖b和圖a相比,相當于增大λ或者減小d,不論何種,實際效果都增大了條紋間距。
本文討論了Python科學計算在大學物理教學中的應用。Python科學計算的引入首先可以有效地解決本科生數學基礎薄弱的問題,使學生們跳過復雜的數學求解,將精力更多地投入物理問題中,從而降低學習物理的難度,這將極大地維護學生學習物理的興趣。此外,Python眾多的第三方庫可以便捷高效地將函數、場等物理結果可視化。這些豐富的可視化可以有效地幫助學生理解物理概念和物理圖像。當然,我們這里只是列舉了幾個簡單的案例。如果調用更高級的第三方庫,可以繪制更加美觀的圖片,甚至是三維模型。這將進一步為學生提供更多的思考視角和幫助。本文的重點是闡述可視化思想,因此不再過多舉例。最后,學生們在利用Python學習大學物理的同時,還可以早些掌握一門高級計算語言,更重要的是計算思維得到了一定的訓練,這將為后續的學習以及未來的科研打下良好的基礎。