刘志成,张君霞,黄 蕊
(华北电力大学科技学院,河北保定 071003)
Matlab是Matrix Laboratory(矩阵实验室)的简称[1],是美国Math Works公司出品的商业数学软件,不仅具有数据分析、科学计算和图像处理等功能,还具有创建交互式图形用户界面等功能,在最新版本中也加入了对C、FORTRAN、C++、Java的支持,可以直接调用。其基本数据单元是矩阵,指令表达式与数学中常用的形式十分相似。语法简单方便,数值计算高效,图形功能完备,所以Matlab在物理现象演示、作图、数据处理优化和模拟仿真方面应用非常广泛。
本文基于Matlab GUI设计,以光电效应实验为例,建立了数据处理界面;对光栅衍射结果进行了可视化;对任意形状狭缝的衍射模拟仿真。
Matlab中设计GUI程序的界面有两种方式.一种是全命令行的M文件编程,就是通过低级句柄图形对象创建函数,设置GUI界面下各个交互组件的属性。另一种是使用Matlab图形用户界面开发环境(简称GUIDE)。GUIDE是一个界面设计工具集。Matlab将所有GUI支持的用户控件集中起来,同时提供界面外观、属性和行为回调函数(Callback)的设置方法。
在光电效应实验中,截止电压是入射光频率的线性函数,eU0=hν-A.直线斜率k=h/e,只要用实验方法得出不同频率对应的截止电压,求出直线斜率,就可以算出普朗克常数h。在Matlab GUI编辑界面编排相应控件,为“计算”控件的回调函数添加如下代码:
V(1)=str2num(get(handles.T61,'String'));V(2)=str2num(get(handles.T62,'String'));
V(3)=str2num(get(handles.T63,'String'));V(4)=str2num(get(handles.T64,'String'));
V(5)=str2num(get(handles.T65,'String'));
X=[8.214 7.408 6.879 5.490 5.196];
P=polyfit(X,V,1);axes(handles.axes1);
XX=4:0.1:8.5;plot(X,V,'+ ',XX,polyval(P,XX),'R');
legend('实验数据','拟合直线','Location','North');
axis([4 8.5 0 2]);
K=P(1)*10;set(handles.T71,'String',num2str(K));
e=str2num(get(handles.e,'String'));
h=e*K;set(handles.T72,'String',num2str(h));
h0=str2num(get(handles.h0,'String'));
E=abs((h-h0))/h0*100;set(handles.T73,'String',num2str(E));
P1=polyfit(V,X,1);JZ=polyval(P1,0);
set(handles.T74,'String',num2str(JZ));
代码中注意与控件名字(Tag)对应 .输入原 始数据后,运行效果见图1:
图1 光电效应数据处理界面
设光栅有N条缝,透光缝宽为a,光栅常数为d,入射波长为λ。根据衍射积分计算,接受屏上光强分布为。其中。式中第一项来源于单缝衍射,是整个衍射图样的轮廓,叫单缝衍射因子。第二项叫做缝间干涉因子[2]。在Matlab GUI编辑界面编排相应控件,根据光栅衍射光强分布公式,为“运行”控件的回调函数添加如下代码:
n=str2num(get(handles.N,'String '));d=str2num(get(handles.edit4,'String'));a=str2num(get(handles.edit5,'String'));
m=5;t=-m:0.001:m;t(t==0)=eps;u=pi*a*sin(t*pi/180);v=d*u;i1=(sin(u)./u).^2;i2=(sin(n*v)./(n*sin(v))).^2;
axes(handles.axes1);
plot(t,i1);axis([-m,m,0,1.2]);grid on
axes(handles.axes3);
plot(t,i2);axis([-m,m,0,1.2]);grid on
axes(handles.axes2);
plot(t,i1.*i2,t,i1,'--');axis([-m m 0 1.2]);grid on
axes(handles.axes4);
c=linspace(0,1,64)';image(i1.*i2*1000)
ColorMap([c,c*0,c*0])
axis off
运行效果见图2:
图2 光栅衍射界面
在界面上可以任意改变缝数,缝间距与缝宽比值和缝宽与波长比值三个参数.我们选择N=1,5,20,35。光栅光谱如图 3 所示.N=1 时就是单缝衍射图案。当N很大时,次级大很小,主极大又细又亮。
图3 N=1,5,20,35 时 光栅光谱
当狭缝形状不规则时,很难再用衍射积分计算出接受屏上的光强分布。在傅里叶光学中我们知道夫琅禾费衍射场的强度分布就等于屏函数的功率谱。因此我们可以直接将光屏进行傅里叶变换,再处理得到衍射图样。Matlab实现过程为[3]:先确定光屏图样,可以由矩阵生成,也可以用画图软件生成,然后用imread函数读入,再利用fft2函数进行二位离散傅里叶变化,得到图像的频谱,然后利用 abs和 fftshift函数进行取模和频谱位移[4-5],最后用imshow函数显示衍射图像。图4分别展示了三种狭缝的衍射图像和光强分布。
图4 不同形状狭缝衍射效果
通过上述讨论,可见Matlab在大学物理作用很多。基于Matlab GUI设计的数据处理界面和光栅衍射界面,将代码隐藏在后台/即使不懂Matlab的人也可以直接使用。结果非常直观,方便修改原始数据和条件。对任意形状狭缝的衍射模拟仿真,更能够完成实际光学实验难以实现的操作。
[1]蔡旭辉,刘卫国,蔡立燕.MATLAB基础与应用教程[M].北京:人民邮电出版社,2009,1-18.
[2]姚启钧.光学教程[M].北京:高等教育出版社,2004,125-135.
[3]徐慧梁,何振江,杨冠琳,等.基于MATLAB的傅里叶光学实验的计算机模拟[J].物理教育,2004:298-301.
[4]刘涛然.利用光栅测半导体激光波长[J].大学物理实验,2013(6):12-14.
[5]王元章,王传坤,张曼.测量光波波长的实验研究[J].大学物理实验,2014(3):50-52.