ISSN 1002-4956 CN11-2034/T
实 验 技 术 与 管 理 Experimental Technology and Management 第38卷 第3期 2021年3月
Vol.38 No.3 Mar. 2021
DOI: 10.16791/j.cnki.sjg.2021.03.015
基于Python的物理实验数据处理系统设计与实现
刘雪琳1,章钰琪1,董爱国2
(1. 中国地质大学 信息工程学院,北京 100083; 2. 中国地质大学 物理实验教学示范中心,北京 100083)
摘 要:该文以测定三棱镜色散的实验数据处理为例,应用Python语言编写了物理实验数据处理系统。与传统的实验数据处理方法相比,基于Python的物理实验数据处理系统操作方便、处理效率高,能有效避免手工处理带来的误差,相较于Matlab而言免费开源、可移植性更强,提出了物理实验数据处理的新思路。 关键词:物理实验;数据处理;Python;PyQt5;Matplotlib;scipy
中图分类号:TP311 文献标识码:A 文章编号:1002-4956(2021)03-0074-05
Design and realization of python-based physical
experimental data processing system
LIU Xuelin1, ZHANG Yuqi1, DONG Aiguo2
(1. School of Information Engineering, China University of Geosciences, Beijing 100083, China;
2. Experimental Teaching Demonstration Center of Physics, China University of Geosciences, Beijing 100083, China)
Abstract: By taking the experimental data processing of measuring prism dispersion as an example, a physical experimental data processing system is written in Python language. Compared with the traditional experimental data processing methods, the physical experimental data processing system based on Python has the advantages of convenient operation, high processing efficiency, and can effectively avoid the error caused by manual processing. Python is free, open source and more portable than MATLAB, and this system puts forward a new idea of physics experiment data processing.
Key words: physical experiment; data processing; Python; PyQt5; Matplotlib; scipy
物理实验数据处理对整个实验过程来说必不可少,是实验的一个重要组成部分。在数据获取过程基本正确的前提下,数据处理的优劣与否决定了实验的成败,因此如何更好地处理这些复杂、繁冗的数据就成为人们普遍关注的问题。
Python是一种解释性的、具备动态语义的高层语言,用Python语言编写程序时无需考虑底层细节,可以只专注于解决问题本身,简化编程过程,提高开发效率。Python提供了完善的库,覆盖了网络、GUI、数据库等内容,许多功能有现成的库可以调用,
由此可见数据处理系统的各个组成部分都可以由Python第三方库提供的工具来实现。最重要的是,Python编写的程序可以打包为独立的exe文件,方便在任何环境下运行,这使得Pyhton在完全复现Matlab功能的基础上更胜一筹,成为数据处理系统开发新的切入点。
1 物理实验数据处理的现状
物理实验中的数据处理方法有很多,如逐差法、最小二乘法等。在传统的数据处理中,一般采用手工
收稿日期: 2020-04-28
基金项目: 2018年度中国地质大学(北京)大学生创新项目
作者简介: 刘雪琳(1998—),女,北京房山,本科生,chloe@cugb.edu.cn。
通信作者: 董爱国(1976—),男,河北唐山,高级实验师,中国地质大学(北京)物理实验教学中心副主任,从事大学物理实验教学与
实验室管理工作,dongag@cugb.edu.cn。
引文格式: 刘雪琳,章钰琪,董爱国. 基于Python的物理实验数据处理系统设计与实现[J]. 实验技术与管理, 2021, 38(3): 74-78.
Cite this article: LIU X L, ZHANG Y Q, DONG A G. Design and realization of python-based physical experimental data processing system[J]. Experimental Technology and Management, 2021, 38(3): 74-78. (in Chinese)
刘雪琳,等:基于Python的物理实验数据处理系统设计与实现 75
处理,利用笔或计算器等进行计算、绘图,这样的处理方式速度慢、偶然误差大,实验效率也相对较低。
在数据处理的计算过程中,常需要由已知量之间的函数关系求未知量或由数据求物理量间的函数关系。大多数情况下函数意义的理解是较为容易的,推理演算的逻辑顺序也十分清晰,而夹杂在其中的、繁复的工作正是重复的计算步骤。
对于数据关系的图形表示,一般采用作图法,即在坐标纸上标出实验点后拟合成线,所有的实验点大体分布在线的两边,观察接近即可。绘制完成后可能还要对图形进行后续处理,如求直线斜率或曲线在某一点的切线斜率等,但由于人工作图时的拟合就是肉眼观察的误差较大的绘图过程,因此实验结果出现一定的偏差也在所难免。
虽然实验数据处理也是物理实验的一个重要部分,但这并不意味着每一次的实验都要进行人工处理数据。通过教学和自主学习抓住物理实验的精髓、深入理解其中的推理逻辑之后,在反复实验中利用数据处理系统提高实验效率和精确度,未尝不是一件好事。
2 应用Python设计数据处理系统的基本思路
应用Pyhton进行数据处理系统的设计的基本思路如图1所示。
图1 设计思路
2.1 界面实现
一个系统首先需要一个简洁、友好的界面。虽然Python最初是作为一门脚本语言开发的,并不具备GUI功能,但由于其自身具有良好的可拓展性,能够不断地通过C或C++模块进行功能性拓展,目前已经有相当多的GUI控件集可以在Python中使用了。例如Tkinter、wxPython、PyQt等,其中PyQt是Qt为Python专门提供的GUI扩展,也是本系统开发时所采用的GUI控件集。
PyQt中有一些利于系统开发的特质:
(1)对Qt库的完全封装,可以将Python中的类直接声明为Qt中某个类的子类;
(2)能够运行在多种平台上;
(3)使用信号与槽机制进行通信,内置用法可以传递鼠标点击等内置信号,自定义用法则可在不同的类间自由传参,是PyQt编程的核心;
(4)提供了一整套丰富的控件库;
(5)如果不愿意手动编写复杂的界面,可以选择使用Qt Designer轻松设计复杂的界面。 2.2 逻辑实现
如果说界面设计是系统的皮囊,那么逻辑实现就是系统的灵魂所在。逻辑实现主要分为两部分:计算与绘图。 2.2.1 计算
在处理数据的计算问题时,需要有清晰、严谨的逻辑实现。Python中有类似Matlab数值计算功能的第三方库,可以用简洁的代码实现复杂的计算功能;Python具有一定的可扩展性,如果希望一段关键代码运行得更快或者希望某些算法不被公开,可以用C++进行部分编程,然后在Python程序中使用它们,即Python与C++的混合编程。 2.2.2 绘图
在处理数据的绘图问题时,需要有完备、可交互的图形界面的支持。Matplotlib是一个Python的2D绘图库,通过Matplotlib开发者可以用简短的代码绘制直方图、散点图、折线图等。
scipy是Python的一个开源科学计算库,建立在numpy之上,增加了众多数学、科学以及工程计算中常用的库函数,如线性代数、常微分方程数值求解、图像处理等,应用此库中的函数可以轻松准确地实现最小二乘法的拟合过程。 2.3 程序打包
在系统的各部分基本完成、成功组合并准备推出初代版本时,需要有将程序打包成独立的exe程序的方法。Pyinstaller库能在Windows、Linux、Mac OS X等操作系统下将Python的源文件打包,以便在没有安装Python的环境中运行。
3 基于Python的物理实验数据处理系统实例
3.1 测定三棱镜色散实验概述
原理:当入射光是单色光,经过2种介质的分界面时,虽然入射角对各种波长的光都相同,但折射角并不相同,表明折射率也不相同。
各种介质的n-λ曲线彼此不相同,通过实验得出的经验公式为
nD
B
2
C
4
其中,D、B、C是取决于介质的常量,可以通过3种
已知波长的折射率的测定求解。
对于波长范围不大的可见光区,上式取前两项:
nD
B
2
76 实 验 技 术 与 管 理
对一般的透明材料来说,折射率随波长的减小而增大。在三棱镜的光谱中,波长短的光,彼此间隔大,波长长的光,间隔小。
步骤:(1)调好分光计,将望远镜对准平行光管,读入入射光方位的右游标和左游标;
(2)观察色散现象,观察复色光经三棱镜折射分解成的线性光谱;
(3)观察最小偏向角,每次读方位角时,要从分光计2个游标盘读数。
图2为三棱镜折射光路图。
图2 三棱镜折射光路图
由图2知,mini1i42i1。
sin
min
对应折射率:nsini1
sini
min为最
2
sin
2(2
小偏向角)。
根据几种不同的n以及λ求出B和D:
1
nim
1
niB
i
2
i2
2
2
12m1
ii
2
1
2
2ninin1iDIi
2
1
12
i2mi2
3.2 系统各部分核心功能实现
在面向对象的语言中,程序是由数据和功能组合而成的对象构建起来的,即类。在本系统中共实现了
6个类:main,UI_main,figure,UI_figure,MatplotlibWidget,MplCanvas。各个类之间的关系如图3所示。
main类实例化了UI_main类和figure类,figure类实例化了UI_figure类,提升自身的QWidget为
MatplotlibWidget类,而MatplotlibWidget类则实例化了MplCanvas类,
main类和MplCanvas类之间有信号
与槽机制所建立的关系。
图3 本系统各个类之间关系
3.2.1 界面设计类
UI_main是主函数的界面实现类,继承了QMainWindow类,封装了主函数界面的一切非功能性要素,包括获取输入的QLineEdit、输出结果的QLabel、选择功能的QToolBar等,整体应用了网格布局使得为数众多的框格显得工整美观;而UI_figure则是绘图界面的实现类,继承QMainWindow类,加入了2个
QWidget并将其提升为MatplotlibWidget类以作为之后绘图的容器。
3.2.2 主函数类
主函数类负责实现UI_main中控件的具体功能,包括获取数据、按键响应、计算数据、输出数据等与主界面交互的功能。
在LineEdit框中按度、分顺序输入实验中得到的入射光方向、不同谱线的折射光方向的左右游标并单击工具栏的Run按钮,后台执行按钮的clicked事件将数据自动换算为统一单位后依据公式计算并储存结果,然后将在Label中按指定格式输出计算结果。
某一次实验中的具体数据输入输出结果如图4所示。
主函数类还负责开放程序入口、创建UI_main类和figure类的实例、建立与MplCanvas类之间的信号与槽机制。其中通过信号与槽机制传递参数的部分代码如图5所示。
main类中实例化MplCanvas类,定义二者之间的连接,被连接的函数位于MplCanvas类中,在计算完成后会发送信号以传递参数。
3.2.3 绘图的三个类
1)figure。
figure类实例化了UI_figure类,因为自身的2个QWidget都是提升的MatplotlibWidget类,所以可以直接通过定义的QWidget调用MplCanvas中的绘图函数而无需实例化MatplotlibWidget。
2)MatplotlibWidget。
MatplotlibWidget类继承了QWidget,实例化MplCanvas类和工具栏类,并创建了一个垂直布局以放置2个部件:图和工具栏。因此这个类相当于实现
刘雪琳,等:基于Python的物理实验数据处理系统设计与实现 77
图4 某次实验中的具体数据输入输出结果
Signal = pyqtSignal(list,list) #创建于类首,传递两个List参数 self.wid = MplCanvas() #实例化 self.Signal.connect(self.wid.Slot_emit) #连接 self.Signal.emit(self.n,self.wave) #发送信号
def f_1(self, x, A, B, C, D):
return A×x×x×x+B×x×x+C×x+D def plotf1(self): global Y
self.fig.suptitle('n-λ色散曲线')
self.x0 = [4 046, 4 358, 4 916, 5 461, 5 769, 5 790] #绘制散点
self.axes.scatter(self.x0[:], Y[:], 25, \"black\") #三次拟合
A,B,C,D = optimize.curve_fit(self.f_1, self.x0, Y)[0] x = arange(4000, 5800, 0.01) y = A×x×x×x+B×x×x+C×x+D self.axes.plot(x, y,\"red\") self.axes.set_ylabel('n') self.axes.set_xlabel('λ') self.axes.grid(True)
图5 通过信号与槽机制传递参数的部分代码
了一个图形的绘制,是Matplotlib图形绘制的模板,可以多次应用于不同项目系统的编程,大大提高编程效率。
3)MplCanvas。
MplCanvas类主要包括了绘图函数的具体实现以及接收主函数传递来的参数的槽函数的实现。图6中代码即为槽函数的实现,接收2个未指明类型的参数并将其赋给当前类中的全局变量Y、X以简化后续数据调用过程。
def Slot_emit(self, a, b):
global Y, X #全局变量,简化参数传递 Y=a X=b
图7 具体实现代码
图6 槽函数的实现
其中一个图像绘制的具体实现代码如图7所示。
f_1函数定义了一个3次函数用以实现3次拟合。拟合的过程其实就是应用最小二乘法的一个过程,不过
图8 n-λ色散曲线
Python的scipy库中的curve_fit函数可以使我们一步完成拟合,免去大量底层步骤。
图8和图9分别为主函数测试数据的两个对应图形绘制。
3.3 将Python代码打包成为独立的exe文件
注意:在打包之前把第三方库的包复制到py文件
从命令行通过cd命令进入py文件所在的文件夹,之后输入一系列指令,如图10所示。
pyinstaller -f -c main.py 部分涉及的指令如下所示:
-F:指定打包后只生成一个exe格式的文件; -D:创建一个目录,包含exe文件,但会依赖很多文件(默认);
目录下,否则可能会打包失败或者打包成功后程序闪退。
78 实 验 技 术 与 管 理
-c:使用控制台(默认); -w:无控制台;
-p:添加搜索路径,让其找到对应的库; -i:改变程序图标。
在指令中使用了默认的-D进行打包,其原因主要为:虽然此指令会依赖很多文件,但是对于程序文件较多的情况,此指令生成的程序运行速度会相对较快。
生成的exe文件存放在py文件目录下dist中的
图9 n–1/λ2曲线
main文件夹,直接将其取出即可运行。
图10 输入指令
4 结语
物理实验数据处理的过程中有些数据处理方法误差小、准确度高,但是过于繁复、难以计算,或者图形绘制不够准确,影响后续对实验结果的分析判断。
[2] [3] [4] [5] [6]
讨[J]. 电子制作,2017(20): 59–60.
王申浩,陶宗明,杨蕾,等. 基于三种色散公式的三棱镜色散实验研究[J]. 大学物理实验,2017, 30(3): 58–62. 肖文鹏. 用PyQt进行Python下的GUI开发[J]. 中文信息,2002(7): 73–75.
肖郑颖. 基于Matlab的大学物理实验数据处理系统设计[J]. 廊坊师范学院学报(自然科学版),2015, 15(6): 45–47. 郑君刚,陈彪,樊旭峰,等. 大学物理实验数据处理的Matlab应用[J]. 大学物理实验,2015, 28(2): 116–117.
施浩楠,崔昊,闵富红,等. 基于Python的彩色图像忆阻系统多稳态加密[J]. 复杂系统与复杂性科学,2018, 15(3): 82– 82. [7] [8] [9]
王硕,孙洋洋. PyQt5快速开发与实战[M]. 北京:电子工业出版社,2017: 317–450.
周惟公. 大学物理实验[M]. 2版. 北京:高等教育出版社,2014: 177–183.
邱霞,段渭军,黄亮,等. 基于PyQt无线传感器网络监控软件开发[J]. 现代电子技术,2014, 37(16): 66–67.
[10] 赵立萍,杨昕卉,尹龙承,等. 基于MATLAB大学物理实验
数据处理[J]. 实验教学,2012(12): 122–123.
Matlab一般是开发物理实验数据处理系统的首选,但是具有一些无法彻底忽视的弊病,比如对环境的依赖性高、自由度低等。
Python拥有强大的第三方库,可以模仿Matlab进行数值计算,也可以开发优美的GUI界面、绘制准确、可交互的图线等。同时它免费、开源,自由度高,可移植性强,是物理实验数据处理系统开发的新的、更好的选择。在测定三棱镜色散的数据处理系统的基础上,利用类似的基本思想可以继续开发出更多优秀的实验数据处理程序。 参考文献 (References)
[1]
代红权,陈海燕. 基于MATLAB语言的物理实验数据处理探
[9] HOU H, GAO F, WEI G, et al. Electrospinning 3C-SiC
mesoporous fibers with high purities and well-controlled structures[J]. Crystal Growth & Design, 2012, 12(1): 536–539. [10] 王淑红. 静电纺丝制备几种聚合物/无机复合纳米纤维与性能
研究[D]. 哈尔滨:哈尔滨工程大学,2012.
[11] 何婷婷,魏取福,黄锋林,等. 静电纺丝法制备PAN/Fe3O4
磁性纳米纤维[J]. 化工新型材料,2012, 40(7): 28–30. [12] 黄沛霖. “on-off”智能刺激响应纳米药物控释系统制备、表
征及性能研究[D]. 广州:华南农业大学,2016.
[13] 单艾娴,王荣明. 磁性纳米材料的控制合成及介观特性研究
进展[J]. 中国材料进展,2016, 35(4): 292–301.
[14] 魏佳佳. 静电纺丝制备微生物高分子磁性固化载体的研究
[D]. 青岛:青岛科技大学,2018.
[15] 王新月,高强,高春霞,等. α-Fe2O3中空磁性纳米纤维的
制备研究[J]. 功能材料,2015, 46(8): 8094–8097.
(上接第73页)
[2] [3] [4] [5] [6] [7] [8]
代玉鑫. 阿司匹林引起的上消化道出血的临床特点和危险因素分析[D]. 上海:上海交通大学,2015.
何婷. 静电喷射法制备载药微球和载药纳米纤维[D]. 广州:华南农业大学,2015.
程凤. 载药抗菌创伤敷料的制备与性能研究[D]. 上海:东华大学,2015.
李玉洁,姚军燕,陈明河,等. 聚乳酸静电纺丝纳米纤维及其药物缓释体系[J]. 高分子材料科学与工程,2014, 30(6): 147–151. 胡敏. ZnO/Ag/PVP/PCL双金属纳米纤维对创伤的愈合作用研究[D]. 重庆:第三军医大学,2017.
王庆. 抗菌纳米纤维的制备及其促进创面愈合的机制研究[D]. 重庆:重庆医科大学,2016.
王艳宏,姜继宗,李洋,等. 静电纺丝技术在药物传递系统中应用的研究进展[J]. 中成药,2014, 36(9): 1952–1958.
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务