激光原理课程设计平行平面腔自再现模FoxLi数值迭代解法及MATLAB实现Word文档格式.docx
《激光原理课程设计平行平面腔自再现模FoxLi数值迭代解法及MATLAB实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《激光原理课程设计平行平面腔自再现模FoxLi数值迭代解法及MATLAB实现Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
二、设计要求和设计指标
在matlab用Fox-Li平行平面腔的迭代解法求得激光器腔镜面上的光场分布。
求出距离镜面中点为x处的光场的振幅A和相位P,并作出二维图像。
在得出的一维图像的基础上作出镜面上光强的二维分布。
三、设计内容
3.1Fox-Li平行平面腔的迭代解法
谐振腔是激光器必备条件之一,它使激光反复通过增益物质,从而实现光的自激振荡。
在激光的发展史上最早提出的是平行平面腔,又称为F—P腔,它由两块平行平面反射镜组成,第一台红宝石激光器的谐振腔就是用它来做成的。
对于开放式光腔,镜面上稳态场分布的形成可以看成是光在两个界面间往返传播的结果。
因此,两个界面上的场必然是互相关联的:
一个镜面上的场可以视为由另一个镜面上的场所产生,于是求解镜面上稳态场的分布问题就归结为求解一个积分方程。
考虑在开腔中往返传播的一列波。
设初始时刻在镜
上有某一个场分布
,则当波在腔中经第一次渡越而到达镜
时,将在镜
上形成一个新的场分布
,场
经第二次渡越后又将在镜
。
每次渡越时,波都将因为衍射损失一部分能量,并引起能量分布变化,如此重复下去……由于衍射主要是发生在镜的边缘附近,因此在传播过程中,镜边缘附近的场将衰落得更快,经多次衍射后所形成的场分布,其边缘振幅往往都很小(与中心处比较),具有这种特征的场分布受衍射的影响也将比较小。
可以预期:
在经过足够多次渡越之后,能形成这样一种稳态场:
分布不再受衍射的影响,在腔内往返一次后能够“再现”出发时的场分布,即实现了模的“自再现”,具体过程图1所示:
图1开腔中自再现模的形成
光学中的惠更斯—菲涅尔原理是从理论上分析衍射问题的基础,该原理的严格数学表示是菲涅尔—基尔霍夫衍射积分。
设已知空间任意曲面S上光波场地振幅和相位分布函数为
由它所要考察的空间任一点P处场分布为
,二者之间有以下关系式:
式中,
为
与
连线的长度,θ为S面上点
处的法线和上述连线之间的夹角,
为S面上的面积元,k为波矢的模。
而对于方形镜平行平面镜
将
按
,
的幂级数展开,当满足
和
时
从而得到
将上式分离变量。
令
得到
方形镜中
3.2matlab实现
3.2.1迭代解法的过程
本文采用Fox—Li数值迭代法得到了了镜面上自再现模在x方向的分布并推广到整个镜面,最终动态显示每次渡越镜面上光场分布。
虽然是复数积分,但其和实数积分实现方法相同,即取一定步长,用矩形面积的和代替函数的定积分。
下面是程序框图:
3.2.2程序实现
源程序:
clear,clc
globalstepsLka
lamda=input('
波长lamda='
);
L=input('
腔长L='
a=input('
镜长a='
N=input('
渡越次数N='
k=2*pi/lamda;
%波失
steps=500;
%步长
x=linspace(-a,a,steps);
u_=ones(1,steps);
form=1:
N
formm=1:
steps
u0(mm)=QU(x(mm),u_);
end;
u_=u0/max(abs(u0));
end
subplot(2,1,1)
plot(x,abs(u0)/abs(u0(steps/2)))
xlabel('
x'
ylabel('
相对振幅'
angle_u0=angle(u0)/pi*180;
angle_u0=angle_u0-angle_u0(steps/2);
subplot(2,1,2)
plot(x,angle_u0)
相对相位'
functiony=QU(x,u)
x_=linspace(-a,a,steps);
step_length=2*a/(steps-1);
y=sqrt(1i/L*exp(-1i*k*L))*sum(exp(-1i*k/2/L*(-x_+x).^2).*u)*step_length;
在菲涅耳数为6.25,渡越次数为1的时候做出下图:
3.2.3自再现模形成的判断
画出每次渡越在x=0.5a处的相对振幅(N>
80),如下图:
图中连续的30个点中纵坐标最大值和纵坐标最小值的差可以作为自再现模是否形成的标志,认为x=a/2处振幅大小基本不变了就是自再现了。
由此可以写判据判断自再现模在第几次渡越形成,并以此作为循环结束的标志。
下面程序中写了的判据:
在x=a/2处连续的30次渡越振幅最大值与最小值之差小于eps_u=0.01。
用该判据得到渡越188次后可认为是自再现模。
实现方法是这样的:
设一次积分将计算steps个点,先迭代30次,用个30*steps的矩阵把这30次的结果储存下来,取出该矩阵的第steps/4列(对应x=-a/2处),判断该列最大值与最小值之差是否小于0.01,是则结束判断,第30次就自再现了,否则,计算第31次的振幅,用31次的结果去覆盖矩阵中的第一行数据,再取出该矩阵的第steps/4列,判断该列最大值与最小值之差是否小于0.01,是则结束判断,第31次就自再现了,否则,计算第32次的振幅……
程序:
eps_u=input('
精度='
30
u30(m,:
)=u0;
flag=1;
%自再现标志位
u30_flag=1;
%判据矩阵维数标记为
N=30;
while(flag==1)
ifmax(abs(u30(:
steps/4)))-min(abs(u30(:
steps/4)))<
eps_u%steps/4为x=-a/2处,判据为连续30次渡越中最大振幅减去最小振幅小于eps_u
flag=0;
else
N=N+1;
ifu30_flag==31
u30_flag=1;
end
u30(u30_flag,:
u30_flag=u30_flag+1;
3.3GUI界面的制作
由于制作了多种图像显示方式,为了方便使用,设计了如下图的GUI界面:
在GUI中可以动态地显示振幅和相位在x方向以及在镜面上相对分布。
程序见附录。
四、本设计改进建议
由于时间有限,只讨论了方形镜平行平面腔。
而且在计算积分的时候运用了循环的嵌套,使得计算效率比较低。
相位分布图像由于matlab函数问题有一段会变得很大(略小于360,其实应该为0)。
五、设计感想
通过这个课程设计收获主要有两点:
一是练习了matlab软件的使用,学会了一些用matlab做光学仿真的方法;
二是更深入理解了激光谐振腔在激光器中的地位和作用,巩固了课本上的知识。
六、主要参考文献
[1] 周炳琨.激光原理(第六版)[M].北京:
国防工业出版社,2009.
[2]A.GFox,TingyeLi.ResonantModesinaMaserInterferometer.[J].BellSystemTechnology,1961,40:
453-488.
附录
GUI程序:
functionvarargout=Laser_GUI(varargin)
%LASER_GUIM-fileforLaser_GUI.fig
%LASER_GUI,byitself,createsanewLASER_GUIorraisestheexisting
%singleton*.
%
%H=LASER_GUIreturnsthehandletoanewLASER_GUIorthehandleto
%theexistingsingleton*.
%LASER_GUI('
CALLBACK'
hObject,eventData,handles,...)callsthelocal
%functionnamedCALLBACKinLASER_GUI.Mwiththegiveninputarguments.
Property'
'
Value'
...)createsanewLASER_GUIorraisesthe
%existingsingleton*.Startingfromtheleft,propertyvaluepairsare
%appliedtotheGUIbeforeLaser_GUI_OpeningFcngetscalled.An
%unrecognizedpropertynameorinvalidvaluemakespropertyapplication
%stop.AllinputsarepassedtoLaser_GUI_OpeningFcnviavarargin.
%*SeeGUIOptionsonGUIDE'
sToolsmenu.Choose"
GUIallowsonlyone
%instancetorun(singleton)"
.
%Seealso:
GUIDE,GUIDATA,GUIHANDLES
%EdittheabovetexttomodifytheresponsetohelpLaser_GUI
%LastModifiedbyGUIDEv2.521-Apr-201216:
07:
57
%Begininitializationcode-DONOTEDIT
gui_Singleton=1;
gui_State=struct('
gui_Name'
mfilename,...
'
gui_Singleton'
gui_Singleton,...
gui_OpeningFcn'
@Laser_GUI_OpeningFcn,...
gui_OutputFcn'
@Laser_GUI_OutputFcn,...
gui_LayoutFcn'
[],...
gui_Callback'
[]);
ifnargin&
&
ischar(varargin{1})
gui_State.gui_Callback=str2func(varargin{1});
ifnargout
[varargout{1:
nargout}]=gui_mainfcn(gui_State,varargin{:
});
else
gui_mainfcn(gui_State,varargin{:
%Endinitializationcode-DONOTEDIT
%---ExecutesjustbeforeLaser_GUIismadevisible.
functionLaser_GUI_OpeningFcn(hObject,eventdata,handles,varargin)
%Thisfunctionhasnooutputargs,seeOutputFcn.
%hObjecthandletofigure
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%varargincommandlineargumentstoLaser_GUI(seeVARARGIN)
%ChoosedefaultcommandlineoutputforLaser_GUI
handles.output=hObject;
%Updatehandlesstructure
guidata(hObject,handles);
%UIWAITmakesLaser_GUIwaitforuserresponse(seeUIRESUME)
%uiwait(handles.figure1);
axes(handles.axes3)
LOGO=imread('
hit.jpg'
imshow(LOGO)
%---Outputsfromthisfunctionarereturnedtothecommandline.
functionvarargout=Laser_GUI_OutputFcn(hObject,eventdata,handles)
%varargoutcellarrayforreturningoutputargs(seeVARARGOUT);
%Getdefaultcommandlineoutputfromhandlesstructure
varargout{1}=handles.output;
functionwavelength_Callback(hObject,eventdata,handles)
%hObjecthandletowavelength(seeGCBO)
%Hints:
get(hObject,'
String'
)returnscontentsofwavelengthastext
%str2double(get(hObject,'
))returnscontentsofwavelengthasadouble
%---Executesduringobjectcreation,aftersettingallproperties.
functionwavelength_CreateFcn(hObject,eventdata,handles)
%handlesempty-handlesnotcreateduntilafterallCreateFcnscalled
%Hint:
editcontrolsusuallyhaveawhitebackgroundonWindows.
%SeeISPCandCOMPUTER.
ifispc&
isequal(get(hObject,'
BackgroundColor'
),get(0,'
defaultUicontrolBackgroundColor'
))
set(hObject,'
white'
functionLength_Callback(hObject,eventdata,handles)
%hObjecthandletoLength(seeGCBO)
)returnscontentsofLengthastext
))returnscontentsofLengthasadouble
functionLength_CreateFcn(hObject,eventdata,handles)
functionarea_Callback(hObject,eventdata,handles)
%hObjecthandletoarea(seeGCBO)
)returnscontentsofareaastext
))returnscontentsofareaasadouble
functionarea_CreateFcn(hObject,eventdata,handles)
functiontimes_Callback(hObject,eventdata,handles)
%hObjecthandletotimes(seeGCBO)
%handlesstructurewithhandlesanduserdata(seeGUIDAT