Python科学计算在大学物理教学中的应用
2023-01-16王明浩
王明浩
湖北大学物理系 湖北武汉 430062
1 概述
大学物理是大学理工科类学生的基础必修课程。通过本课程的学习,学生可以了解自然界物质的结构、性质、物质之间的相互作用及其运动的基本规律[1]。良好的科学素养不论是在后续的学习还是未来的工作和生活中,都将会为学生提供帮助,可以说是受益终身[2]。然而,在大学物理的教学中,经常会有学生抱怨物理学太难了。这体现在一方面物理学需要大量的数学知识,而往往由于课程安排的缘故(譬如高等数学和大学物理同时开课),这些所需的数学知识学生尚未学习和掌握;另一方面,物理学自身也存在大量的抽象概念,单纯从公式上很难理解其背后的物理图像[3]。
随着计算机技术的不断发展,各类计算软件层出不穷,这使得人们从繁重的计算任务中解放出来,从而投入更具创新性的活动中。计算软件的应用十分广泛,譬如,计算仿真软件可以仿真各种实验,而不需要真实地做实验。这为我们节省了大量的资金和资源[4-5]。科学计算有望为解决大学物理教学中的上述问题提供帮助。
Python是目前最流行的高级程序设计语言之一,因其免费、易学习、可扩展以及丰富的第三方库等特点,广泛应用于科学研究中[6]。免费、易学习这两个特点使其非常适合低年级本科生学习和使用。这将为Python引入大学物理的教学中提供了可能。Python拥有丰富的第三方库。譬如,SCIPY可以处理最优化、积分、常微分方程求解等;MATPLOTLIB可以绘制各种精美的图形,可以将计算结果可视化等。Python的这些库可以帮助学生们有效地解决物理中的各种数学问题;同时,Python提供的诸多工具包可以将结果可视化,这有助于学生更好地理解抽象的物理过程,掌握其背后的物理图像[7]。最后,在这个过程中,学生将逐渐培养出一种将问题归结为计算问题,然后利用计算机进行求解的计算思维。新工科环境下,这种全新的思维方式显得越来越重要,对学生未来的学习和工作大有裨益[8]。
2 利用Python求解物理中的数学问题
大学物理中的很多问题,学生们在掌握了相应的物理知识之后,通常可以顺利地列出相应的等式、方程组或者微分方程。然而,若在讲授这些内容时,由于课程安排,学生尚未掌握求解这类问题的数学知识,必然会对物理教学产生影响。这是大学物理教学中普遍存在的现象,是导致学习大学物理困难的主要原因之一。我们发现借助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科学计算学习大学物理的同时,也培养和训练了计算思维。
3 利用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学习大学物理的同时,还可以早些掌握一门高级计算语言,更重要的是计算思维得到了一定的训练,这将为后续的学习以及未来的科研打下良好的基础。