劉志成,張君霞,黃 蕊
(華北電力大學(xué)科技學(xué)院,河北保定 071003)
Matlab是Matrix Laboratory(矩陣實(shí)驗(yàn)室)的簡(jiǎn)稱[1],是美國(guó)Math Works公司出品的商業(yè)數(shù)學(xué)軟件,不僅具有數(shù)據(jù)分析、科學(xué)計(jì)算和圖像處理等功能,還具有創(chuàng)建交互式圖形用戶界面等功能,在最新版本中也加入了對(duì)C、FORTRAN、C++、Java的支持,可以直接調(diào)用。其基本數(shù)據(jù)單元是矩陣,指令表達(dá)式與數(shù)學(xué)中常用的形式十分相似。語法簡(jiǎn)單方便,數(shù)值計(jì)算高效,圖形功能完備,所以Matlab在物理現(xiàn)象演示、作圖、數(shù)據(jù)處理優(yōu)化和模擬仿真方面應(yīng)用非常廣泛。
本文基于Matlab GUI設(shè)計(jì),以光電效應(yīng)實(shí)驗(yàn)為例,建立了數(shù)據(jù)處理界面;對(duì)光柵衍射結(jié)果進(jìn)行了可視化;對(duì)任意形狀狹縫的衍射模擬仿真。
Matlab中設(shè)計(jì)GUI程序的界面有兩種方式.一種是全命令行的M文件編程,就是通過低級(jí)句柄圖形對(duì)象創(chuàng)建函數(shù),設(shè)置GUI界面下各個(gè)交互組件的屬性。另一種是使用Matlab圖形用戶界面開發(fā)環(huán)境(簡(jiǎn)稱GUIDE)。GUIDE是一個(gè)界面設(shè)計(jì)工具集。Matlab將所有GUI支持的用戶控件集中起來,同時(shí)提供界面外觀、屬性和行為回調(diào)函數(shù)(Callback)的設(shè)置方法。
在光電效應(yīng)實(shí)驗(yàn)中,截止電壓是入射光頻率的線性函數(shù),eU0=hν-A.直線斜率k=h/e,只要用實(shí)驗(yàn)方法得出不同頻率對(duì)應(yīng)的截止電壓,求出直線斜率,就可以算出普朗克常數(shù)h。在Matlab GUI編輯界面編排相應(yīng)控件,為“計(jì)算”控件的回調(diào)函數(shù)添加如下代碼:
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('實(shí)驗(yàn)數(shù)據(jù)','擬合直線','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)對(duì)應(yīng) .輸入原 始數(shù)據(jù)后,運(yùn)行效果見圖1:
圖1 光電效應(yīng)數(shù)據(jù)處理界面
設(shè)光柵有N條縫,透光縫寬為a,光柵常數(shù)為d,入射波長(zhǎng)為λ。根據(jù)衍射積分計(jì)算,接受屏上光強(qiáng)分布為。其中。式中第一項(xiàng)來源于單縫衍射,是整個(gè)衍射圖樣的輪廓,叫單縫衍射因子。第二項(xiàng)叫做縫間干涉因子[2]。在Matlab GUI編輯界面編排相應(yīng)控件,根據(jù)光柵衍射光強(qiáng)分布公式,為“運(yùn)行”控件的回調(diào)函數(shù)添加如下代碼:
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
運(yùn)行效果見圖2:
圖2 光柵衍射界面
在界面上可以任意改變縫數(shù),縫間距與縫寬比值和縫寬與波長(zhǎng)比值三個(gè)參數(shù).我們選擇N=1,5,20,35。光柵光譜如圖 3 所示.N=1 時(shí)就是單縫衍射圖案。當(dāng)N很大時(shí),次級(jí)大很小,主極大又細(xì)又亮。
圖3 N=1,5,20,35 時(shí) 光柵光譜
當(dāng)狹縫形狀不規(guī)則時(shí),很難再用衍射積分計(jì)算出接受屏上的光強(qiáng)分布。在傅里葉光學(xué)中我們知道夫瑯禾費(fèi)衍射場(chǎng)的強(qiáng)度分布就等于屏函數(shù)的功率譜。因此我們可以直接將光屏進(jìn)行傅里葉變換,再處理得到衍射圖樣。Matlab實(shí)現(xiàn)過程為[3]:先確定光屏圖樣,可以由矩陣生成,也可以用畫圖軟件生成,然后用imread函數(shù)讀入,再利用fft2函數(shù)進(jìn)行二位離散傅里葉變化,得到圖像的頻譜,然后利用 abs和 fftshift函數(shù)進(jìn)行取模和頻譜位移[4-5],最后用imshow函數(shù)顯示衍射圖像。圖4分別展示了三種狹縫的衍射圖像和光強(qiáng)分布。
圖4 不同形狀狹縫衍射效果
通過上述討論,可見Matlab在大學(xué)物理作用很多?;贛atlab GUI設(shè)計(jì)的數(shù)據(jù)處理界面和光柵衍射界面,將代碼隱藏在后臺(tái)/即使不懂Matlab的人也可以直接使用。結(jié)果非常直觀,方便修改原始數(shù)據(jù)和條件。對(duì)任意形狀狹縫的衍射模擬仿真,更能夠完成實(shí)際光學(xué)實(shí)驗(yàn)難以實(shí)現(xiàn)的操作。
[1]蔡旭輝,劉衛(wèi)國(guó),蔡立燕.MATLAB基礎(chǔ)與應(yīng)用教程[M].北京:人民郵電出版社,2009,1-18.
[2]姚啟鈞.光學(xué)教程[M].北京:高等教育出版社,2004,125-135.
[3]徐慧梁,何振江,楊冠琳,等.基于MATLAB的傅里葉光學(xué)實(shí)驗(yàn)的計(jì)算機(jī)模擬[J].物理教育,2004:298-301.
[4]劉濤然.利用光柵測(cè)半導(dǎo)體激光波長(zhǎng)[J].大學(xué)物理實(shí)驗(yàn),2013(6):12-14.
[5]王元章,王傳坤,張曼.測(cè)量光波波長(zhǎng)的實(shí)驗(yàn)研究[J].大學(xué)物理實(shí)驗(yàn),2014(3):50-52.