宮薇薇,祝繼常,韓 煦
(中國鐵道科學(xué)研究院 運輸及經(jīng)濟研究所,北京 100081)
?
基于Python的網(wǎng)頁版物理實驗快速建設(shè)技術(shù)
宮薇薇,祝繼常,韓 煦
(中國鐵道科學(xué)研究院 運輸及經(jīng)濟研究所,北京 100081)
如何使用科學(xué)計算軟件自動與數(shù)據(jù)庫進行交互,實現(xiàn)網(wǎng)頁版實驗結(jié)果的快速輸出,共享實驗結(jié)果并應(yīng)用于教學(xué)工作是大學(xué)物理實驗領(lǐng)域核心和熱點的關(guān)注問題。一直探索使用Matlab解決上述問題,但是其Complier二十幾萬的商業(yè)使用費用,使得科學(xué)計算函數(shù)與數(shù)據(jù)庫通訊和基于Java的網(wǎng)頁開發(fā)方案有始無終。然而,Python多領(lǐng)域大規(guī)模的函數(shù)包、基于網(wǎng)頁開發(fā)的免費、公開、快捷的框架設(shè)計快速、有效并輕量級地解決了上述問題。本文在介紹Python科學(xué)計算語言,比較Matlab、Python進行網(wǎng)頁版實驗的技術(shù)框架的基礎(chǔ)上,完成實驗數(shù)據(jù)的數(shù)據(jù)讀取、科學(xué)計算函數(shù)庫的使用、網(wǎng)頁版實驗結(jié)果的生成,并以光學(xué)物理實驗劈尖的等厚干涉條紋實驗為例完成網(wǎng)頁版物理實驗的建設(shè)。通過本文可以幫助具備Matlab基礎(chǔ)的科學(xué)實驗者,快速實現(xiàn)物理實驗的網(wǎng)頁版輸出。
實驗數(shù)據(jù);Python;網(wǎng)頁生成
Python由Guido van Rossum于20世紀90年代編寫,是一種面向?qū)ο蟮慕忉屝驼Z言,功能強大、簡單易學(xué)、完全免費。2014年,已經(jīng)成為美國大學(xué)計算機科學(xué)系入門課程最受歡迎的編程語言[1],被著名的YouTube、Dropbox、美國銀行等諸多網(wǎng)站所使用。適合每個人甚至是青少年學(xué)習(xí)和使用。首先,Python具有豐富的擴展庫,能夠輕量級地完成各種高級任務(wù),例如C語言要寫1 000行代碼,Java只需要寫100行,而Python可能只要20行[2]。其次,在科學(xué)計算領(lǐng)域,擁有數(shù)據(jù)快速處理Numpy、Pandas,數(shù)值計算庫Scipy,符號運算庫Sympy擴展庫,圖表輸出庫Matplotlib,Web集成庫Ftplib、Httplib、Urllib,Web圖表庫Bokeh、Mpld[3]。最后,其安裝十分簡單,推薦Anaconda3,直接從其官網(wǎng)下載相應(yīng)的版本進行安裝即可,不需要配置任何環(huán)境變量。與Matlab相比Python科學(xué)計算庫基本能夠覆蓋其函數(shù),而且可以使用SMOP[4]進行Matlab與Python之間的代碼轉(zhuǎn)化。安裝開發(fā)環(huán)境Anaconda,并使用PyCharm開發(fā)工具進行編譯器Anaconda Python.exe的調(diào)用(圖1),即可進行網(wǎng)頁版物理實驗的快速搭建。
圖1 編程環(huán)境安裝
本文在比較Matlab、Python進行網(wǎng)頁版實驗的技術(shù)框架的基礎(chǔ)上,以光學(xué)物理實驗劈尖的等厚干涉條紋實驗為例,完成實驗數(shù)據(jù)的數(shù)據(jù)讀取、科學(xué)計算函數(shù)庫的使用、網(wǎng)頁版實驗結(jié)果的生成。
矩陣計算和多領(lǐng)域的算法庫是Matlab科學(xué)計算軟件的核心,它所提供的大量函數(shù)庫為科研工作者進行專業(yè)領(lǐng)域?qū)嶒炋峁┝司薮蟮姆奖?,但是如果與數(shù)據(jù)庫交互,實現(xiàn)網(wǎng)頁版的結(jié)果推送,需要實驗設(shè)計者掌握較多的計算機技能。兩者的開發(fā)框架差別如圖2所示,Matlab無法直接與數(shù)據(jù)庫或者網(wǎng)頁直接通訊,需要借助第三方語言,以Java為例,通過Matlab Complier與Java通訊然后通過JSP書寫Html代碼生成相應(yīng)的網(wǎng)頁,與Database數(shù)據(jù)庫的通訊也需要通過Java。
圖2 Matlab開發(fā)技術(shù)框架
Matlab方案存在兩個問題:其一、第三方語言Java對于非計算機專業(yè)人士很難入門,其二、Matlab JDK和Comlier的費用較高。然而,這兩個問題都可以通過基于Python的開發(fā)框架有效地解決(圖3),通過Python的自身擴展包即可完成所有的功能,通過Numpy/Pandas/Scipy替代Matlab矩陣科學(xué)計算,MySQLDB庫進行與數(shù)據(jù)庫的通訊,Matplotlib進行輸出結(jié)果的展示。最重要的一點是不需要書寫任何的Html代碼,通過調(diào)用Mpld3直接將Matplotlib數(shù)據(jù)結(jié)果轉(zhuǎn)化為網(wǎng)頁形式進行輸出。
圖3 Python開發(fā)技術(shù)框架
實驗數(shù)據(jù)的讀入是物理實驗建立的第一步,在數(shù)據(jù)量較小的情況是,可以采用直接為變量賦值的方式。如果輸入的數(shù)據(jù)量超大,可以使用cx_Oracle、MySQLDB讀取Oracle或者Mysql數(shù)據(jù)庫方式。但是由于數(shù)據(jù)庫處理對計算機技能要求較高,推薦采用Excel進行數(shù)據(jù)存儲,通過xlrd函數(shù)進行讀取,可以吸取上述兩種方式的優(yōu)點,易于存儲、方便修改。
以《Matlab可視化大學(xué)物流實驗》中的7.2劈尖的等厚干涉條紋實驗[5]為例進行網(wǎng)頁形式python實驗的編寫。首先引入需要使用的庫,變量賦值的代碼如下:
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存儲和讀入,只需引入xlrd庫,然后用open函數(shù)進行打開,具體使用數(shù)據(jù)參看文獻[6]。
importxlrd
data= xlrd.open_workbook('文件名')
數(shù)據(jù)引入后,需要進行數(shù)據(jù)的處理,Matlab所使用的函數(shù),可以在Numpy、Pandas、Scipy、Sympy中進行查找,也可以通過smop[7]庫進行代碼的直接轉(zhuǎn)化。劈尖的等厚干涉條紋實驗實驗的轉(zhuǎn)換對應(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)實,Matlab和Python的圖表輸出函數(shù)比較相似,均使用subplot函數(shù)。然而,Python的mpld3[8]庫,為Matplotlib的網(wǎng)頁輸出提供了極大的方便,以基本的線性圖為例,代碼及運行結(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)頁輸出
如果將結(jié)果使用mpld3.show()輸出,其圖標就會自動生成網(wǎng)頁。不許要實驗者了解任何關(guān)于網(wǎng)頁編程的知識。因此,在第三步的數(shù)據(jù)處理結(jié)束后加入該語句即可,運行結(jié)果如圖5所示[9-12]。
圖5 mpld3實驗結(jié)果網(wǎng)頁輸出
Python是否能夠替代Matlab作為網(wǎng)絡(luò)的熱點話題爭論不休,就大量函數(shù)庫和長期的應(yīng)用積累來看,Python不能夠完全替代Matlab。但如果從擴展開發(fā)和簡便輕量來看Python有著免費、開源、輕量的先天優(yōu)勢。Python多樣的科學(xué)計算庫,基于網(wǎng)頁的圖表化輸出,為物理實驗的網(wǎng)頁編程,共享實驗結(jié)果提供了有效的工具。本文所編制的代碼雖然與Matlab輸出的圖表樣式有所不同,但能夠獲得源代碼相同的數(shù)據(jù)結(jié)果輸出。因此,Python是科學(xué)式樣工作者進行大學(xué)物理實驗Web擴展開發(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é)物理實驗.清華大學(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ù)據(jù)處理中的應(yīng)用[J].大學(xué)物理實驗,2008,21(1):88-90.
[10] 姚琴芬.Matlab語言在物理實驗數(shù)據(jù)處理中的應(yīng)用[J].大學(xué)物理實驗,2011,24(6):52-54.
[11] 岳鵬,程敏熙.用MatLab曲線擬合工具箱處理物理實驗數(shù)據(jù)[J].大學(xué)物理實驗,2014(5):93-96.
[12] 宮薇薇.基于Matlab數(shù)據(jù)庫工具箱的實驗數(shù)據(jù)自動抽取及應(yīng)用[J].大學(xué)物理實驗,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
中國鐵道科學(xué)研究院基金(2014YJ099)、(2015YJ080)
1007-2934(2016)05-0114-04
O 4-39
A DOI:10.14139/j.cnki.cn22-1228.2016.005.029