干涉和衍射是光学的主要内容,也是计算机模拟的热点。 白光干涉和衍射的计算机模拟与单色光相比是难点。 本文基于七色光可合成白光的原理,基于Matlab模拟了白光干涉和衍射实验。 首先基于Matlab编制了白光衍射光栅的衍射模拟程序,然后通过改变输入参数实现了一个程序同时模拟白光干涉和衍射实验的目的,模拟结果与实际白光干涉和衍射实验相一致最后通过创建操作性强的人机交互界面,可以达到脱离matlab环境单独运行的效果,实践性强。
模拟了基于Matlab的七色光白光干涉和衍射实验,该算法主要包括以下几个步骤:
设置固定参数赋值,设置可变参数赋值默认值;
设定模拟光屏的参数(即模拟结果的RGB值图像矩阵的尺寸);
计算各色光干涉或衍射的光强及其相应的RGB值矩阵数据;
根据红绿蓝三原色加性混合规律,将各色光的RGB值矩阵数据纳入模拟结果的RGB值图像矩阵;
显示模拟结果(即显示模拟结果的RGB值图像矩阵)。
基于matlab模拟白光衍射实验程序
清除器
clf
%固定参数的设定
lamda=[ 600610570550460440410 ] * 1e-9; %七色光波长,单位m
RGB=[ 1,0,0; 1,0.5,0; 1,1,0; 0,1,0; 0,1,1; 0,0,1; 0.67,0,1 ); %七色光的RGB值
d=4e-5; 设定%晶格常数
%设置可调参数
白光衍射光栅衍射参数
% b=8e-6;
% N=18; %光透过狭缝宽度及光栅单元数
% Bright=80; %亮度调整系统
白光单缝衍射参量
% b=8e-6;
% N=1; %光透过狭缝宽度及光栅单元数
% Bright=20; %亮度调整系数
%白色双光束干涉
b=8e-6;
N=2; %光透过狭缝宽度及光栅单元数
Bright=1; %亮度调整系数
%设置模拟光屏参数
irgb=zeros (150,1048,3 ); %模拟光屏矩阵
iw=zeros (150,1048,3; 用于记录%各色光衍射结果的RGB值的矩阵
计算与%白色光光栅衍射光强度对应的RGB值矩阵数据
计算%切光光栅衍射光强度分布
for k=1:7
theta=(-0.015 * pi.03 * pi/1048:03 * pi/104833600.015 * pi ); %衍射角度变化范围
phi=2*pi*d*sin(Theta )/lamda(k ) k );
阿尔法=pi*b*sin(Theta )/lamda(k ) k;
IDF=(Sinc )阿尔法).^2; %单缝衍射的相对光强
IDGS=(sin(n*phi/2 )./sin (phi/2 ) ).^2; %多光束干涉的相对光强
I=Idf.*Idgs; %光栅衍射的相对光强
计算与%各色光衍射光强度对应的RGB值矩阵数据
for i=1:150
iw(I,1 )=I*RGB(k,1 ); %将红色基本颜色代码计入Iw矩阵的红色维中
iw(I,2 )=I*RGB(k,2 ); %将红色基本颜色代码计入Iw矩阵的绿色维度
iw(I,3 )=I*RGB(k,3 ); %将红色基本颜色代码计入Iw矩阵的蓝色维中
结束
计算%白色光光栅衍射RGB值图案矩阵数据
Irgb=Irgb Iw; 在%模拟结果的RGB值模式矩阵中加入各色光衍射的RGB值模式矩阵
Iw=[];
结束
%表示白色光光栅衍射实验模拟结果
br=1/max(max ) max (irgb ); 调整Irgb矩阵元素最大值为1的系数
II=Irgb*Br*Bright; %调节模拟图像的亮度
imshow(ii ) %表示模拟结果
% title (('白光衍射模拟结果) ) ) ) ) ) ) )。
% title (“白光单缝衍射模拟结果”)
title (《白色双光束干涉模拟结果》)
% % %创建GUI
在参数设定栏中,用户根据需要进行设定
function varargout=guanglabcopy (vararg in )
gui_Singleton=1;
GUI_state=struct(GUI_name ),mfilename,
' gui_Singleton ',gui_Singleton,
' gui_OpeningFcn ',@guanglabcopy_OpeningFcn,
' gui_OutputFcn ',@guanglabcopy_OutputFcn,
' gui_LayoutFcn ',[],
'gui_Callback', []);if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
handles.output = hObject;
set(handles.b_edit,'string',8e-6); %初始化各个参数
set(handles.N_edit,'string',18);
set(handles.Bright_edit,'string',80);
guidata(hObject, handles);
function varargout = guanglabcopy_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
function N_edit_Callback(hObject, eventdata, handles)
function N_edit_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function Bright_edit_Callback(hObject, eventdata, handles)
function Bright_edit_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function b_edit_Callback(hObject, eventdata, handles)
function b_edit_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function OK_button_Callback(hObject, eventdata, handles)
b=str2num(get(handles.b_edit,'string')); %更新参数,取用户输入的数值
N=str2num(get(handles.N_edit,'string'));
Bright=str2num(get(handles.Bright_edit,'string'));
switch N %选择相应的标头
case 1
set(handles.title_text,'string','白光单缝衍射仿真结果')
case 2
set(handles.title_text,'string','白光双光束干涉仿真结果')
otherwise
set(handles.title_text,'string','白光光栅衍射仿真结果')
end
lamda=[600 610 570 550 460 440 410]*1e-9;
RGB=[1,0,0;1,0.5,0;1,1,0;0,1,0;0,1,1;0,0,1;0.67,0,1];
d=4e-5;
Irgb=zeros(150,1048,3);
Iw=zeros(150,1048,3);
for k=1:7
theta=(-0.015*pi+.03*pi/1048:.03*pi/1048:0.015*pi);
phi=2*pi*d*sin(theta)/lamda(k);
alpha=pi*b*sin(theta)/lamda(k);
Idf=(sinc(alpha)).^2;
Idgs=(sin(N*phi/2)./sin(phi/2)).^2;
I=Idf.*Idgs;
for i=1:150
Iw(i,:,1)=I*RGB(k,1);
Iw(i,:,2)=I*RGB(k,2);
Iw(i,:,3)=I*RGB(k,3);
end
Irgb=Irgb+Iw;
Iw=[];
end
Br=1/max(max(max(Irgb)));
II=Irgb*Br*Bright;
imshow(II)
function close_button_Callback(hObject, eventdata, handles)
selection = questdlg(['Close ' get(handles.figure1,'Name') '?'],...
['Close ' get(handles.figure1,'Name') '...'],...
'Yes','No','Yes');
if strcmp(selection,'No')
return;
end
delete(handles.figure1)
function file_menu_Callback(hObject, eventdata, handles)
function update_menu_Callback(hObject, eventdata, handles) %菜单项目“更新”
OK_button_Callback(hObject, eventdata, handles)
function close_menu_Callback(hObject, eventdata, handles) %菜单项目“关闭”
close_button_Callback(hObject, eventdata, handles)
光栅衍射的特例还有夫琅和费多缝衍射及多光束干涉等,利用本文的程序,在GUI中通过改变可调参数也可对它们进行仿真。在实际的干涉实验中,透光缝宽不可能做到无限窄,而利用Matlab进行仿真,则不受此条件的限制,可观察到不受衍射因子影响的干涉现象。因此,利用Matlab 仿真光学实验,可以弥补实际实验的不足。