宮薇薇,祝繼常,韓 煦
(中國(guó)鐵道科學(xué)研究院 運(yùn)輸及經(jīng)濟(jì)研究所,北京 100081)
?
基于Python的網(wǎng)頁(yè)版物理實(shí)驗(yàn)快速建設(shè)技術(shù)
宮薇薇,祝繼常,韓 煦
(中國(guó)鐵道科學(xué)研究院 運(yùn)輸及經(jīng)濟(jì)研究所,北京 100081)
如何使用科學(xué)計(jì)算軟件自動(dòng)與數(shù)據(jù)庫(kù)進(jìn)行交互,實(shí)現(xiàn)網(wǎng)頁(yè)版實(shí)驗(yàn)結(jié)果的快速輸出,共享實(shí)驗(yàn)結(jié)果并應(yīng)用于教學(xué)工作是大學(xué)物理實(shí)驗(yàn)領(lǐng)域核心和熱點(diǎn)的關(guān)注問題。一直探索使用Matlab解決上述問題,但是其Complier二十幾萬(wàn)的商業(yè)使用費(fèi)用,使得科學(xué)計(jì)算函數(shù)與數(shù)據(jù)庫(kù)通訊和基于Java的網(wǎng)頁(yè)開發(fā)方案有始無(wú)終。然而,Python多領(lǐng)域大規(guī)模的函數(shù)包、基于網(wǎng)頁(yè)開發(fā)的免費(fèi)、公開、快捷的框架設(shè)計(jì)快速、有效并輕量級(jí)地解決了上述問題。本文在介紹Python科學(xué)計(jì)算語(yǔ)言,比較Matlab、Python進(jìn)行網(wǎng)頁(yè)版實(shí)驗(yàn)的技術(shù)框架的基礎(chǔ)上,完成實(shí)驗(yàn)數(shù)據(jù)的數(shù)據(jù)讀取、科學(xué)計(jì)算函數(shù)庫(kù)的使用、網(wǎng)頁(yè)版實(shí)驗(yàn)結(jié)果的生成,并以光學(xué)物理實(shí)驗(yàn)劈尖的等厚干涉條紋實(shí)驗(yàn)為例完成網(wǎng)頁(yè)版物理實(shí)驗(yàn)的建設(shè)。通過本文可以幫助具備Matlab基礎(chǔ)的科學(xué)實(shí)驗(yàn)者,快速實(shí)現(xiàn)物理實(shí)驗(yàn)的網(wǎng)頁(yè)版輸出。
實(shí)驗(yàn)數(shù)據(jù);Python;網(wǎng)頁(yè)生成
Python由Guido van Rossum于20世紀(jì)90年代編寫,是一種面向?qū)ο蟮慕忉屝驼Z(yǔ)言,功能強(qiáng)大、簡(jiǎn)單易學(xué)、完全免費(fèi)。2014年,已經(jīng)成為美國(guó)大學(xué)計(jì)算機(jī)科學(xué)系入門課程最受歡迎的編程語(yǔ)言[1],被著名的YouTube、Dropbox、美國(guó)銀行等諸多網(wǎng)站所使用。適合每個(gè)人甚至是青少年學(xué)習(xí)和使用。首先,Python具有豐富的擴(kuò)展庫(kù),能夠輕量級(jí)地完成各種高級(jí)任務(wù),例如C語(yǔ)言要寫1 000行代碼,Java只需要寫100行,而Python可能只要20行[2]。其次,在科學(xué)計(jì)算領(lǐng)域,擁有數(shù)據(jù)快速處理Numpy、Pandas,數(shù)值計(jì)算庫(kù)Scipy,符號(hào)運(yùn)算庫(kù)Sympy擴(kuò)展庫(kù),圖表輸出庫(kù)Matplotlib,Web集成庫(kù)Ftplib、Httplib、Urllib,Web圖表庫(kù)Bokeh、Mpld[3]。最后,其安裝十分簡(jiǎn)單,推薦Anaconda3,直接從其官網(wǎng)下載相應(yīng)的版本進(jìn)行安裝即可,不需要配置任何環(huán)境變量。與Matlab相比Python科學(xué)計(jì)算庫(kù)基本能夠覆蓋其函數(shù),而且可以使用SMOP[4]進(jìn)行Matlab與Python之間的代碼轉(zhuǎn)化。安裝開發(fā)環(huán)境Anaconda,并使用PyCharm開發(fā)工具進(jìn)行編譯器Anaconda Python.exe的調(diào)用(圖1),即可進(jìn)行網(wǎng)頁(yè)版物理實(shí)驗(yàn)的快速搭建。
圖1 編程環(huán)境安裝
本文在比較Matlab、Python進(jìn)行網(wǎng)頁(yè)版實(shí)驗(yàn)的技術(shù)框架的基礎(chǔ)上,以光學(xué)物理實(shí)驗(yàn)劈尖的等厚干涉條紋實(shí)驗(yàn)為例,完成實(shí)驗(yàn)數(shù)據(jù)的數(shù)據(jù)讀取、科學(xué)計(jì)算函數(shù)庫(kù)的使用、網(wǎng)頁(yè)版實(shí)驗(yàn)結(jié)果的生成。
矩陣計(jì)算和多領(lǐng)域的算法庫(kù)是Matlab科學(xué)計(jì)算軟件的核心,它所提供的大量函數(shù)庫(kù)為科研工作者進(jìn)行專業(yè)領(lǐng)域?qū)嶒?yàn)提供了巨大的方便,但是如果與數(shù)據(jù)庫(kù)交互,實(shí)現(xiàn)網(wǎng)頁(yè)版的結(jié)果推送,需要實(shí)驗(yàn)設(shè)計(jì)者掌握較多的計(jì)算機(jī)技能。兩者的開發(fā)框架差別如圖2所示,Matlab無(wú)法直接與數(shù)據(jù)庫(kù)或者網(wǎng)頁(yè)直接通訊,需要借助第三方語(yǔ)言,以Java為例,通過Matlab Complier與Java通訊然后通過JSP書寫Html代碼生成相應(yīng)的網(wǎng)頁(yè),與Database數(shù)據(jù)庫(kù)的通訊也需要通過Java。
圖2 Matlab開發(fā)技術(shù)框架
Matlab方案存在兩個(gè)問題:其一、第三方語(yǔ)言Java對(duì)于非計(jì)算機(jī)專業(yè)人士很難入門,其二、Matlab JDK和Comlier的費(fèi)用較高。然而,這兩個(gè)問題都可以通過基于Python的開發(fā)框架有效地解決(圖3),通過Python的自身擴(kuò)展包即可完成所有的功能,通過Numpy/Pandas/Scipy替代Matlab矩陣科學(xué)計(jì)算,MySQLDB庫(kù)進(jìn)行與數(shù)據(jù)庫(kù)的通訊,Matplotlib進(jìn)行輸出結(jié)果的展示。最重要的一點(diǎn)是不需要書寫任何的Html代碼,通過調(diào)用Mpld3直接將Matplotlib數(shù)據(jù)結(jié)果轉(zhuǎn)化為網(wǎng)頁(yè)形式進(jìn)行輸出。
圖3 Python開發(fā)技術(shù)框架
實(shí)驗(yàn)數(shù)據(jù)的讀入是物理實(shí)驗(yàn)建立的第一步,在數(shù)據(jù)量較小的情況是,可以采用直接為變量賦值的方式。如果輸入的數(shù)據(jù)量超大,可以使用cx_Oracle、MySQLDB讀取Oracle或者M(jìn)ysql數(shù)據(jù)庫(kù)方式。但是由于數(shù)據(jù)庫(kù)處理對(duì)計(jì)算機(jī)技能要求較高,推薦采用Excel進(jìn)行數(shù)據(jù)存儲(chǔ),通過xlrd函數(shù)進(jìn)行讀取,可以吸取上述兩種方式的優(yōu)點(diǎn),易于存儲(chǔ)、方便修改。
以《Matlab可視化大學(xué)物流實(shí)驗(yàn)》中的7.2劈尖的等厚干涉條紋實(shí)驗(yàn)[5]為例進(jìn)行網(wǎng)頁(yè)形式python實(shí)驗(yàn)的編寫。首先引入需要使用的庫(kù),變量賦值的代碼如下:
importnumpy as np
import math
importmatplotlib.pyplot as plt,mpld3
lamb=np.array([750*1e-9,540*1e-9,440*1e-9])
n = 1.5
k = 10
dx = 0.002
xm = k * dx
x = np.linspace(0,xm,10)
theta = lamb[0]/2/n/dx
e = np.zeros(10,np.float)
np.multiply(x,math.tan(theta),e)
pi = 3.1416
如果使用excel存儲(chǔ)和讀入,只需引入xlrd庫(kù),然后用open函數(shù)進(jìn)行打開,具體使用數(shù)據(jù)參看文獻(xiàn)[6]。
importxlrd
data= xlrd.open_workbook('文件名')
數(shù)據(jù)引入后,需要進(jìn)行數(shù)據(jù)的處理,Matlab所使用的函數(shù),可以在Numpy、Pandas、Scipy、Sympy中進(jìn)行查找,也可以通過smop[7]庫(kù)進(jìn)行代碼的直接轉(zhuǎn)化。劈尖的等厚干涉條紋實(shí)驗(yàn)實(shí)驗(yàn)的轉(zhuǎn)換對(duì)應(yīng)的代碼如下:
defgete(lamb):
c = 2*n*e/lamb
e1 = np.zeros(10,np.float)
fori in range(0,10,1):
e1[i] = math.cos(pi * (c[i] + 0.5))
e1[i] = e1[i]*e1[i]
return e1
M3 = np.zeros((3,10),np.float)
i1 = gete(lamb[0])
M = np.zeros((3,10),np.float)
M[0,:] = i1
fig = plt.figure()
ax = fig.add_subplot(221)
ax.imshow(M)
i2 = gete(lamb[1])
M1= np.zeros((3,10),np.float)
M1[1,:] = i2
ax = fig.add_subplot(222)
ax.imshow(M1)
i3 = gete(lamb[2])
M2= np.zeros((3,10),np.float)
M2[2,:] = i3
ax = fig.add_subplot(223)
ax.imshow(M2)
M2= np.zeros((3,10),np.float)
M3[0,:] = i1
M3[1,:] = i2
M3[2,:] = i3
ax = fig.add_subplot(224)
ax.imshow(M3)
關(guān)于結(jié)果的現(xiàn)實(shí),Matlab和Python的圖表輸出函數(shù)比較相似,均使用subplot函數(shù)。然而,Python的mpld3[8]庫(kù),為Matplotlib的網(wǎng)頁(yè)輸出提供了極大的方便,以基本的線性圖為例,代碼及運(yùn)行結(jié)果如圖4所示。
import matplotlib.pyplot as plt,mpld3
plt.plot([3,1,4,1,5],'ks-',mec='w',mew=5,ms=20)
mpld3.show()
圖4 mpld3示例網(wǎng)頁(yè)輸出
如果將結(jié)果使用mpld3.show()輸出,其圖標(biāo)就會(huì)自動(dòng)生成網(wǎng)頁(yè)。不許要實(shí)驗(yàn)者了解任何關(guān)于網(wǎng)頁(yè)編程的知識(shí)。因此,在第三步的數(shù)據(jù)處理結(jié)束后加入該語(yǔ)句即可,運(yùn)行結(jié)果如圖5所示[9-12]。
圖5 mpld3實(shí)驗(yàn)結(jié)果網(wǎng)頁(yè)輸出
Python是否能夠替代Matlab作為網(wǎng)絡(luò)的熱點(diǎn)話題爭(zhēng)論不休,就大量函數(shù)庫(kù)和長(zhǎng)期的應(yīng)用積累來(lái)看,Python不能夠完全替代Matlab。但如果從擴(kuò)展開發(fā)和簡(jiǎn)便輕量來(lái)看Python有著免費(fèi)、開源、輕量的先天優(yōu)勢(shì)。Python多樣的科學(xué)計(jì)算庫(kù),基于網(wǎng)頁(yè)的圖表化輸出,為物理實(shí)驗(yàn)的網(wǎng)頁(yè)編程,共享實(shí)驗(yàn)結(jié)果提供了有效的工具。本文所編制的代碼雖然與Matlab輸出的圖表樣式有所不同,但能夠獲得源代碼相同的數(shù)據(jù)結(jié)果輸出。因此,Python是科學(xué)式樣工作者進(jìn)行大學(xué)物理實(shí)驗(yàn)Web擴(kuò)展開發(fā)的更有效的利器。
[1] http://cacm.acm.org/blogs/blog-cacm/176450-python -is-now-the-most-popular-introductory-teaching- language-at-top-us-universities/fulltext?utm_source=ourjs.com
[2] http://www.liaoxuefeng.com/wiki/001374738125095c955
c1e6d8bb493182103fac9270762a000.
[3] https://docs.continuum.io/anaconda/index
[4] https://pypi.python.org/pypi/smop
[5] 周群益.Matlab可視化大學(xué)物理實(shí)驗(yàn).清華大學(xué)出版社,2010:259-260.
[6] http://www.cnblogs.com/lhj588/archive/2012/01/06/2314181.html
[7] https://pypi.python.org/pypi/smop/0.22
[8] http://mpld3.github.io/
[9] 韓敬,鐘方川,李林.Matlab在大學(xué)物理實(shí)驗(yàn)數(shù)據(jù)處理中的應(yīng)用[J].大學(xué)物理實(shí)驗(yàn),2008,21(1):88-90.
[10] 姚琴芬.Matlab語(yǔ)言在物理實(shí)驗(yàn)數(shù)據(jù)處理中的應(yīng)用[J].大學(xué)物理實(shí)驗(yàn),2011,24(6):52-54.
[11] 岳鵬,程敏熙.用MatLab曲線擬合工具箱處理物理實(shí)驗(yàn)數(shù)據(jù)[J].大學(xué)物理實(shí)驗(yàn),2014(5):93-96.
[12] 宮薇薇.基于Matlab數(shù)據(jù)庫(kù)工具箱的實(shí)驗(yàn)數(shù)據(jù)自動(dòng)抽取及應(yīng)用[J].大學(xué)物理實(shí)驗(yàn),2015(2):96-99.
Rapid Construction Technology of Web Page Physical Experiment Based on Python
GONG Wei-wei,ZHU Ji-chang,HAN Xu
(Transport and Economic Research Institute,China Academy of Railway Sciences,Beijing 100081)
How to use scientific calculation software to interact with the data base automatically,apply the web version of the experimental results in a fast way,share the results and application is a core and hot problem gaining concerns in the university physics experiment field.It is tried hard to solve the problem via Matlab,but the complier,which costs tens of thousands commercially,makes the scientific computing function and database communication based on Java Web development scheme die.However,Python with multi domain large-scale packages,based on web development of free,open,fast design frame,effective and lightweight solves this problem.This paper introduced the python scientific calculation language,compare the framework between MATLAB and python,how to do the variable assignment,use the scientific computing function library and generate the web version results using the optical physics experimental split tip of the equal thickness interference fringe experiment as an example.So this paper can help the Matlab based science researchers to apply the rapid construction technology of web page physical experiment in Python.
experimental data;Python;web page program
2016-05-20
中國(guó)鐵道科學(xué)研究院基金(2014YJ099)、(2015YJ080)
1007-2934(2016)05-0114-04
O 4-39
A DOI:10.14139/j.cnki.cn22-1228.2016.005.029