刘雅娴
(武汉东湖学院电子信息工程学院 湖北·武汉 430212)
早在1786年,苏格兰工程师威廉·普莱费尔(William Playfair)因坚信图表比数据更有说服力,在《商业与政治图解集》中给出了线图、柱图、饼图和面积图,从此开创了图表的新纪元。
随着大数据时代的到来,数据分析应用于生活的方方面面。数据分析的可视化研究更是进入了热点研究课题。大量数据不仅可以用如2D、3D图形,直观、简洁、实时呈现出来,而且能从可视化中获取更多有用的信息,成为人们关注的焦点。
数据分析的可视化工具,非常丰富,编程语言也非常多,如C++,Java。而Python语言作为一种解释性的、交互式的、面向对象的编程语言,因其具有简单、优雅的语法,同时具有开源、免费使用、丰富的第三方库等特性,越来越受到学者们的关注与使用。
光学现象,看得见摸得着,而对于描述光学现象的方程,具有晦涩难懂的特性。因此,如何将描述光学现象的方程的解,用图形表现出来,对理解光学现象,显得尤为重要。2019年,Aydogan Ozcan首次提出一种全新的光学——AI系统,即全光衍射深度神经网络,依靠光的传播,实现几乎零能耗、零延迟的深度学习,它是光学工具、3D打印和神经网络的结合。基于光学衍射的研究逐渐成为研究热点。仿真技术与手段,克服了光学器材的昂贵及实验过程不易操作、实验结果不易获得等特性,将光学过程和现象用二维、三维或动态图像很好地呈现出来。
无论是光学仿真,还是光学仿真平台的搭建,目前用的最多的软件是MATLAB,用simulink搭建平台,组建模型,并对模型实施仿真。而对于使用Python进行光学仿真,学者Vasudevan Lakshminarayanan在Understanding Optics with Python中对光学现象进行了详尽的阐述。本文对夫琅禾费单缝、双缝衍射的强度分布图形以及随着单缝宽度的变化,引起的单缝衍射图形的变化,用Python做了仿真。
目前为止,可视化软件很多,如熟知的Matlab、Mathemetica、Excel等,也有比较多的商业化的可视化软件,如:Datawrapper,Tableau Public,Smartbi,Chart.js等。
自1989年Python语言由荷兰工程师Guido van Rossum设计并开发以来,逐渐成为主流程序设计语言之一。在TIOBE编程语言排行榜2020年最新版名列第三。Python又被称为胶水语言,能够很轻松地使用C/C++、Java等其他语言的各种模块接口,这使Python语言用途更为广泛。
Python具有强大的可视化能力,具有众多可视化库,如2D及3D可视化库Matplotlib、seaborn和pandas等,交互信息可视化库 Bokeh、Plotly和 Pyecharts等,地图可视化库 folium、basemap、Geoplotlib、Mapbox、Pyecharts的Map和Geo 等等。
Matplotlib是Python的面向对象的绘图库,通过pyplot模块提供了一整套和MATLAB类似的绘图函数集,可以进行静态、动画和交互式可视化。也可以很方便的将它作为绘图控件,嵌入到GUI应用程序中。Matplotlib附带了几个附加工具包,包括3D绘图mplot3d。可以满足对2D、3D、动画的要求。
使用pyplot绘图的一般过程为:
生成或读入数据-〉折线图、散点图、柱状图、饼状图、雷达图或三维曲线和曲面-〉设置坐标轴标签、坐标轴刻度、标题等图形属性-〉显示或保存绘图结果。
Numpy是Python的一个扩展库,支持数组与矩阵运算,也为数组运算提供大量的数学函数库。通常和SciPy(Scientific Python)和Matplotlib(绘图库)一起用于科学计算及可视化,能替代Matlab,很好解决科学绘图的问题。
光的衍射是指可见光在传播过程中,如果遇到障碍物或小孔,原本直线传播的光将偏离直线传播而绕到障碍物后面传播,在接收屏上得到明暗相间的条纹。光的衍射和干涉一起证明了光具有波动性。因此,光的衍射是波动光学中的重要的一个现象。一般分为夫琅禾费衍射和菲涅尔衍射,而夫琅禾费衍射又分为狭缝衍射和圆孔衍射。本文以夫琅禾费单缝、双缝衍射为例,使用Python开展仿真研究。
夫琅禾费单缝衍射原理图如图1所示。平行入射光垂直入射到中间有一个窄缝的衍射屏上,通过透镜后,折射到像屏上。单缝宽度为b,衍射角为,入射光波长为。根据波动理论,相邻波带的点发出的次波到达 P点的光程差,当时,在像屏上得到明暗相间的图像,即为夫琅禾费单缝衍射条纹。特别的,衍射角时,中央明纹就在像屏的中心。
图1:夫琅禾费单缝衍射原理图
为了得到单缝衍射像屏上的衍射光强分布,根据波动理论,设单缝上某点发出的点光源到达P点的场强为相邻点平行光源到达P点的场强和为:
夫琅禾费双缝衍射原理图如图2所示。缝宽为a,b为双缝之间的宽度,缝距为衍射角,入射光波长为。根据波动理论,
图3:夫琅禾费双缝衍射原理图
首先引入第三方库文件
import matplotlib.pyplot as plt
import numpy as np
定义单缝衍射函数 single_slit_diffraction_intensity(slit_width,lamda,X)
定义双缝衍射函数double_slit_diffraction_intensity(slit_width,lamda,X,d)
图3:单缝衍射光强分布仿真图b=2.5×10-4m
图4:单缝衍射光强分布仿真图b=2.5×10-4m
图5:双缝衍射光强分布仿真图
通过Python,我们可以展现光学中的衍射、干涉等光学现象,并且能很详细的反映出衍射的特征。