牛相宏,潘乘風(fēng),陳 偉,李興鰲
(南京郵電大學(xué) 理學(xué)院,江蘇 南京 210023)
隨著現(xiàn)代電子信息技術(shù)的飛速發(fā)展,Java、C++、Python等計(jì)算機(jī)編程語(yǔ)言在大學(xué)課程中的應(yīng)用愈加普遍。同時(shí)隨著理論與實(shí)驗(yàn)的不斷融合,《大學(xué)物理實(shí)驗(yàn)》課程所涉及的實(shí)驗(yàn)內(nèi)容更加前沿與廣泛,部分實(shí)驗(yàn)涉及的參數(shù)較多、實(shí)驗(yàn)數(shù)據(jù)冗雜,分析精度也不斷提高。能夠科學(xué)有效地使用科學(xué)軟件對(duì)實(shí)驗(yàn)數(shù)據(jù)進(jìn)行準(zhǔn)確地處理,理解實(shí)驗(yàn)中蘊(yùn)含的物理意義也是《大學(xué)物理實(shí)驗(yàn)》教學(xué)目的之一。Python是一種開(kāi)源免費(fèi)的程序設(shè)計(jì)語(yǔ)言,其擴(kuò)展庫(kù)中的numpy、matlotlib、sklearn等,提供了相應(yīng)的方法用以實(shí)現(xiàn)數(shù)據(jù)擬合和圖像可視化。因其具有面向?qū)ο蟆⒅С謩?dòng)態(tài)語(yǔ)義、內(nèi)置高級(jí)數(shù)據(jù)結(jié)構(gòu)、語(yǔ)法簡(jiǎn)潔優(yōu)美等優(yōu)點(diǎn),Python在日常學(xué)習(xí)和科學(xué)研究中得到十分廣泛的應(yīng)用。通過(guò)對(duì)Python語(yǔ)言的學(xué)習(xí),掌握可編程的數(shù)據(jù)可視化、不同方式下的數(shù)據(jù)擬合,能夠加深學(xué)生對(duì)于大學(xué)物理實(shí)驗(yàn)中相關(guān)理論知識(shí)的理解,進(jìn)一步培養(yǎng)學(xué)生利用現(xiàn)代科學(xué)技術(shù)不斷探索的創(chuàng)新意識(shí),為其今后的課程學(xué)習(xí)和科研工作打下堅(jiān)實(shí)的基礎(chǔ)。
Python作為一門(mén)功能強(qiáng)大的計(jì)算機(jī)編程語(yǔ)言,迄今為止已經(jīng)發(fā)展得較為完善。Python在軟件設(shè)計(jì)、工業(yè)生產(chǎn)、自動(dòng)化應(yīng)用等方面展現(xiàn)出獨(dú)特的魅力,但在《大學(xué)物理實(shí)驗(yàn)》課程中的應(yīng)用卻寥寥無(wú)幾。本文對(duì)Python語(yǔ)言如何處理實(shí)驗(yàn)數(shù)據(jù)作詳細(xì)的討論。首先以《受迫振動(dòng)》實(shí)驗(yàn)為引例,介紹如何利用Python語(yǔ)言對(duì)其實(shí)驗(yàn)數(shù)據(jù)快速地進(jìn)行可視化處理;隨后通過(guò)《電介質(zhì)介電常數(shù)的測(cè)量》以及《熱敏電阻和溫差電動(dòng)勢(shì)的測(cè)量》兩個(gè)實(shí)驗(yàn)分別介紹了線性擬合和對(duì)數(shù)擬合的操作方法,在每個(gè)實(shí)驗(yàn)中均附上運(yùn)行代碼,同時(shí)可以根據(jù)程序設(shè)計(jì)的“擬合參數(shù)”對(duì)擬合結(jié)果進(jìn)行有效評(píng)價(jià)。
作圖法是《大學(xué)物理實(shí)驗(yàn)》課程中數(shù)據(jù)處理的一種基本方法。該傳統(tǒng)方法利用坐標(biāo)紙手工繪圖處理數(shù)據(jù),僅適用于自變量和因變量呈簡(jiǎn)單線性關(guān)系這一情況。當(dāng)實(shí)驗(yàn)數(shù)據(jù)樣本參數(shù)多以及呈現(xiàn)出非線性等復(fù)雜情況時(shí),利用科學(xué)軟件對(duì)其進(jìn)行可視化處理,便可以得到既方便又可靠的結(jié)果。對(duì)這樣冗雜的實(shí)驗(yàn)數(shù)據(jù)若仍采取坐標(biāo)紙繪圖的方法,極有可能由于人為誤差,例如作圖不規(guī)范等導(dǎo)致某些關(guān)鍵物理量的錯(cuò)誤或丟失。在自變量和因變量呈非線性函數(shù)關(guān)系的情況下,極值點(diǎn)、拐點(diǎn)、邊界點(diǎn)等特殊點(diǎn)往往代表著物理特性的轉(zhuǎn)變或相變等,這對(duì)于理解該實(shí)驗(yàn)蘊(yùn)含的原理和內(nèi)在機(jī)制起到至關(guān)重要的作用。而采用坐標(biāo)紙手繪作圖法會(huì)很容易在特殊數(shù)據(jù)點(diǎn)的連接上忽略甚至丟失這些關(guān)鍵的特征數(shù)據(jù)。利用Python語(yǔ)言進(jìn)行實(shí)驗(yàn)數(shù)據(jù)可視化處理,不僅易于保存完整的實(shí)驗(yàn)數(shù)據(jù),更有助于掌握當(dāng)前實(shí)驗(yàn)結(jié)果以及理解其蘊(yùn)含的物理機(jī)制。
在《受迫振動(dòng)的研究》實(shí)驗(yàn)中,以表1中的數(shù)據(jù)為例:為了便于比較,實(shí)驗(yàn)要求在同一張紙上繪制出振幅θ、相位差φ隨頻率比ω/ω0變化的幅頻曲線和相頻曲線。利用Python語(yǔ)言及其內(nèi)置的擴(kuò)展庫(kù),可以方便快捷地完成實(shí)驗(yàn)要求。以下給出相關(guān)代碼并對(duì)關(guān)鍵處給予注釋:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score
# 名稱為x,y,z的列表中分別寫(xiě)入頻率比ω/ω0、振幅θ、相位差φ實(shí)驗(yàn)數(shù)據(jù)。
x=[0.970,0.971,0.972,0.974,0.977,0.982,0.987,0.994,0.999,1.002,1.006,1.016,1.025,1.035,1.042,1.045]
y=[65,68,70,76,82,97,119,137,147,144,136,98,72,58,50,47]
z=[25,26,27,30,32,40,50,69,87,99,113,137,149,155,159,161]
# 使用numpy中的一種方法建立多項(xiàng)式模型。
model_1=np.poly1d(np.polyfit(x,y,10))
model_2=np.poly1d(np.polyfit(x,z,10))
# 指定行的顯示方式,從0.970開(kāi)始至1.045結(jié)束。
line_1=np.linspace(0.970,1.045,100)
line_2=np.linspace(0.970,1.045,100)
# 用r-squared的值來(lái)衡量多項(xiàng)式回歸擬合度,r平方的數(shù)值范圍屬于0-1,其中0表示不相關(guān),而1則表示完全相關(guān)。
print(r2_score(y,model_1(x)))
print(r2_score(z,model_2(x)))
# 繪制散點(diǎn)圖
plt.scatter(x,y)
plt.scatter(x,z)
# 畫(huà)出多項(xiàng)式回歸線
plt.plot(line_1,model_1(line_1),label="θ")
plt.plot(line_2,model_2(line_2),label="ψ")
plt.legend()
# 顯示
plt.show()
如圖1所示,運(yùn)行代碼可以成功繪制出兩條符合實(shí)驗(yàn)要求的曲線,充分體現(xiàn)了Python語(yǔ)言在可視化數(shù)據(jù)作圖中的優(yōu)越性。從控制臺(tái)輸出的內(nèi)容可以發(fā)現(xiàn)兩次擬合的r-squared的值分別為0.999 36、0.999 66,這也充分說(shuō)明了程序給出的可視化圖像是足夠準(zhǔn)確的。不僅如此,代碼運(yùn)行后生成的窗體還支持光標(biāo)獲取曲線上任意點(diǎn)的數(shù)值,這對(duì)數(shù)據(jù)分析和實(shí)驗(yàn)結(jié)果的理解也是大有裨益。根據(jù)處理后的圖像顯示,當(dāng)ω/ω0在1附近時(shí),產(chǎn)生共振現(xiàn)象(振幅達(dá)到最大值,相位差φ=90°)。表1為測(cè)得的相應(yīng)實(shí)驗(yàn)數(shù)據(jù)。
圖1 《受迫振動(dòng)的研究》實(shí)驗(yàn)中的幅頻曲線和相頻曲線
表1 《受迫振動(dòng)》實(shí)驗(yàn)數(shù)據(jù)
利用電橋法測(cè)量固體材料的介電常數(shù)εr,測(cè)得固體電介質(zhì)樣品直徑d,電介質(zhì)面積s=πd2/4,電介質(zhì)厚度l,電容極板面積s0=2 158 mm2,極板間距D=5.000 mm。C串=εrε0s/[l+εr(D-l)]表示樣品面積范圍內(nèi)電容和空氣層電容串聯(lián)得到的電容量;C0=ε0s/D表示以空氣為介質(zhì)所對(duì)應(yīng)的電容量;C分表示測(cè)量時(shí)引線及系統(tǒng)引發(fā)的分布電容之和;C邊表示固體電介質(zhì)面積以外的板極電容量和邊界電容量之和。當(dāng)極板間介質(zhì)為空氣和固體電介質(zhì)時(shí),分別測(cè)量其電容,兩次測(cè)量過(guò)程中保持極板間距和系統(tǒng)狀態(tài)不變,故以空氣為介質(zhì)下的電容量Cair可以表示為Cair=C0+C邊+C分,放入固體電介質(zhì)下的電容量Cr可以表示為Cr=C串+C邊+C分。處理一下,可以得到固體電介質(zhì)相對(duì)介電常數(shù)εr的表達(dá)式如下:εr=l(Cr-Cair+ε0s/D)/[ε0s-(Cr-Cair+ε0s/D)(D-l)]
為了減小實(shí)驗(yàn)誤差,采用多次測(cè)量取平均值的方法對(duì)相關(guān)參數(shù)進(jìn)行測(cè)量,表2為測(cè)得的相應(yīng)實(shí)驗(yàn)數(shù)據(jù)。在測(cè)量計(jì)算空氣介電常數(shù)和系統(tǒng)分布電容過(guò)程中,不斷增加極板間距并測(cè)量其相應(yīng)的電容量,表3為測(cè)得的相應(yīng)實(shí)驗(yàn)數(shù)據(jù)。
表2 固體電介質(zhì)介電常數(shù)測(cè)量的實(shí)驗(yàn)數(shù)據(jù)
表3 空氣介電常數(shù)和系統(tǒng)分布電容測(cè)量的實(shí)驗(yàn)數(shù)據(jù)
import matplotlib.pyplot as plt
from scipy import stats
import numpy as np
x=[]
x_=[1.00,1.10,1.20,1.30,1.40,1.50,1.60,1.70,1.80,1.90]
y=[33.12,31.56,30.18,29.11,28.16,27.14,26.38,25.72,25.14,24.60]
for i in x_:
x.append(1/i)
# 建立線性擬合模型
slope,intercept,r,p,std_err=stats.linregress(x,y)
def myfunc(x):
return slope * x + intercept
model=list(map(myfunc,x))
# 獲取線性擬合后的各項(xiàng)系數(shù)并在控制臺(tái)輸出
coef=np.polyfit(x,y,1)
print(“各項(xiàng)系數(shù)為:”, coef)
print(r)
plt.scatter(x,y)
plt.plot(x,model,label="Linear Fitting")
plt.legend()
# 對(duì)x軸,y軸進(jìn)行標(biāo)簽
name_x=plt.xlabel("d(mm)")
name_y=plt.ylabel("C(pF)")
# 顯示
plt.show()
如圖2所示,得到線性擬合的結(jié)果。r-squared=0.999 8,說(shuō)明擬合效果非常好。同時(shí)可以在控制臺(tái)上得到輸出的關(guān)于線性擬合的系數(shù)分別為18.089、15.109,即ε0s0=18.09,C分=15.11。據(jù)此可以求得ε0=8.382×10-3pF/mm,將ε0帶入εr的表達(dá)式中,求得固體電介質(zhì)的相對(duì)介電常數(shù)εr=4.157。將這一數(shù)據(jù)和手繪作圖得到的固體電介質(zhì)相對(duì)介電常數(shù)4.266相比,差距明顯,這是因?yàn)槭謩?dòng)擬合人為不可控因素過(guò)多導(dǎo)致的較大誤差,精度遠(yuǎn)遠(yuǎn)不及計(jì)算機(jī)擬合的高精度。從結(jié)果上看,利用Python及其自帶的擴(kuò)展庫(kù)對(duì)實(shí)驗(yàn)數(shù)據(jù)進(jìn)行擬合,不僅節(jié)約時(shí)間、提高準(zhǔn)確率,并且在精確度上也有極大的提升。
d/mm
在一些物理實(shí)驗(yàn)中,所關(guān)注的物理量和待測(cè)量之間可能既不存在線性關(guān)系也不存在多項(xiàng)式關(guān)系的情況,如果直接對(duì)實(shí)驗(yàn)數(shù)據(jù)進(jìn)行處理可能會(huì)造成結(jié)果失真。當(dāng)所求物理量和待測(cè)量之間僅存在指數(shù)關(guān)系時(shí),依據(jù)對(duì)數(shù)分析則可以簡(jiǎn)化處理過(guò)程,起到事半功倍的效果。
保持其他狀態(tài)不變,測(cè)得不同溫度下的熱敏電阻阻值RT,表4記錄了相關(guān)實(shí)驗(yàn)數(shù)據(jù)。同樣地,利用Python可以迅速地得到擬合結(jié)果,運(yùn)行代碼及注釋如下:
表4 《熱敏電阻和溫差電動(dòng)勢(shì)的測(cè)量》中阻值隨溫度變化實(shí)驗(yàn)數(shù)據(jù)
import matplotlib.pyplot as plt
from scipy import stats
import numpy as np
x=[]
y=[]
x_=[30,35,40,45,50,55,60,65,70]
y_=[1933,1301,970,775,627,540,459,408,372]
for i in x_:
x.append(1/i)
for j in y_:
y.append(np.log(j))
slope,intercept,r,p,std_err=stats.linregress(x,y)
def myfunc(x):
return slope * x + intercept
# 預(yù)測(cè)溫度為75 ℃下的熱敏電阻阻值并輸出到控制臺(tái)
R=myfunc(1/75)
print(np.exp(R))
model=list(map(myfunc,x))
# 獲取線性擬合后的各項(xiàng)系數(shù)并在控制臺(tái)輸出
coef=np.polyfit(x,y,1)
print("各項(xiàng)系數(shù)為:", coef)
print(r)
plt.scatter(x,y)
plt.plot(x,model,label="Linear Fitting")
plt.legend()
# 對(duì)x軸,y軸進(jìn)行標(biāo)簽
name_x=plt.xlabel("1/T/K")
name_y=plt.ylabel("lnR")
# 顯示
plt.show()
如圖3所示,從控制臺(tái)輸出的結(jié)果可以得到以下結(jié)論:B=86.80,lnA=4.69,即A=108.85,B=86.80。不僅如此,代碼中還包含預(yù)測(cè)功能,上述給出的代碼中預(yù)測(cè)了當(dāng)溫度T達(dá)到75 ℃時(shí),熱敏電阻阻值Rt=347.91 Ω。該功能使用起來(lái)也相當(dāng)便捷,只需直接修改代碼中“myfunc()”相關(guān)數(shù)值即可。顯而易見(jiàn),實(shí)現(xiàn)以上所有功能均依賴于Python語(yǔ)言中強(qiáng)大的數(shù)學(xué)擴(kuò)展庫(kù)。此外,還有更多有關(guān)數(shù)據(jù)處理,圖像可視化等方面的功能有待在大學(xué)物理實(shí)驗(yàn)領(lǐng)域中開(kāi)發(fā)與應(yīng)用。
1/T/K
本文主要介紹了在大學(xué)物理實(shí)驗(yàn)中如何利用Python語(yǔ)言處理數(shù)據(jù)的一些基本方法,包括圖像可視化、數(shù)據(jù)擬合等。利用功能日漸豐富的計(jì)算機(jī)編程語(yǔ)言對(duì)復(fù)雜實(shí)驗(yàn)數(shù)據(jù)的處理也變得簡(jiǎn)單便捷。利用Python語(yǔ)言及其自帶的擴(kuò)展庫(kù)不僅可以實(shí)現(xiàn)基本的實(shí)驗(yàn)要求,而且能夠根據(jù)需要增添一些額外的功能,例如精確獲得具體點(diǎn)的函數(shù)值、對(duì)未知物理量的預(yù)測(cè)等等。在《大學(xué)物理實(shí)驗(yàn)》課程中引入Python語(yǔ)言,不僅實(shí)現(xiàn)了對(duì)實(shí)驗(yàn)數(shù)據(jù)的可視化作圖,而且數(shù)據(jù)分析更加自動(dòng)化、專業(yè)化。同時(shí)也能夠加深學(xué)生對(duì)于大學(xué)物理實(shí)驗(yàn)及其相關(guān)知識(shí)的理解和把握,有利于培養(yǎng)學(xué)生嚴(yán)謹(jǐn)治學(xué)的態(tài)度和積極探索、踴躍創(chuàng)新的意識(shí)。將軟件融于實(shí)驗(yàn),將理論與實(shí)際結(jié)合,為學(xué)生今后的課程學(xué)習(xí)和科研工作打下堅(jiān)實(shí)的基礎(chǔ)。