干涉与衍射是光学的主要内容,也是计算机仿真的热点。与单色光相比,白光干涉与衍射的计算机仿真是个难点。本文依据七色光可合成为白光的原理,基于Matlab 仿真白光干涉与衍射实验。首先基于Matlab 编写白光光栅衍射仿真程序,然后通过改变输入参数而达到利用一个程序同时仿真白光干涉与衍射实验的目的,仿真结果与实际的白光干涉与衍射实验一致。最后编写操作性很强的人机交互界面,可以实现脱离matlab环境单独运行的效果,具有很强的实践性。

基于Matlab 的七色光仿真白光干涉与衍射实验, 其算法主要包括以下几个步骤:

①设置固定参数并赋值,设置可调参数并赋默认值;

②设置仿真光屏参数(即仿真结果RGB 值图像矩阵大小);

③计算各色光干涉或衍射的光强及其对应的RGB值矩阵数据;

④依据红绿蓝三基色加性混合法则,把各色光的RGB 值矩阵数据计入仿真结果RGB 值图像矩阵中;

⑤显示仿真结果(即显示仿真结果RGB 值图像矩阵)。

%基于matlab仿真白光光栅衍射实验程序

clear

clf

%设置固定参数

lamda=[600 610 570 550 460 440 410]*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/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;%光栅衍射的相对光强

%计算与各色光衍射光强对应的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矩阵蓝维度

end

%计算白光光栅衍射RGB值图形矩阵数据

Irgb=Irgb+Iw; %把各色光衍射的RGB值矩阵计入仿真结果RGB值图形矩阵中

Iw=[];

end

%显示白光光栅衍射实验仿真结果

Br=1/max(max(max(Irgb))); %调整Irgb矩阵元素的最大值为1的系数

II=Irgb*Br*Bright; %调节仿真图像亮度

imshow(II) %显示仿真结果

% title('白光光栅衍射仿真结果')

% title('白光单缝衍射仿真结果')

title('白光双光束干涉仿真结果')

%%%%%%%%%%%GUI制作

参数设置栏 有用户根据自己的需要设置

function varargout = guanglabcopy(varargin)

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 仿真光学实验,可以弥补实际实验的不足。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐