光的干涉实验仿真模拟首先是依据光干涉的光强分布的理论公式及实验参数建立光强数据矩阵,然后运用Matlab的Image命令绘制干涉图像,运用Plot命令绘制光强分布曲线.本虚拟实验室主要模拟杨氏双缝干涉,牛顿环和迈克尔逊干涉仪的等倾干涉.
用Matlab计算杨氏双缝干涉光强为(完整程序见附件一):
L1=sqrt((xs(i)-d/2).^2+z.^2);
L2=sqrt((xs(i)+d/2).^2+z.^2);
Phi=2*pi*(L2-L1)/Lambda; %相位差
I(i)=sum(4*cos(Phi/2).^2); %光强
输入网页yanshisuangfeng.html部分代码
<!--M
文件名-->
<input type="hidden" name="mlmfile" value="yanshisuangfeng"/>
<input type="text" name="d" /><!--
双缝的间隔-->
<input type="text" name="Lambda" /><!--
波长-->
<input type="text" name="z" /><!--
屏幕到双狭缝平面的距离-->
<input type="text" name="Ny" /> <!--
条纹清晰度-->
其中:d为双缝的间隔,z为屏幕到双狭缝平面的距离,Lambda为波长,本实验参数选取为d=1.5mm,z=2m,Lambda=0.0000006 mm,运行结果如图3所示:
图3仿真模拟杨氏双缝干涉图样与光强分布曲线
4.2牛顿环
牛顿环属于分振幅干涉,它是一种等厚干涉条纹.根据光波的迭加原理,可得出牛顿环干涉光强分布为:
迈克尔逊干涉仪
迈克尔逊干涉仪的干涉也属于分振幅干涉,调整迈克尔逊干涉仪的M2使得M1和M2之间角度发生变化可以分别得到等倾干涉和等厚干涉条纹。本文讨论等倾干涉条纹.
function rs = niutunhuan(h)
% 得到唯一ID ,用于图片名字
mlid = getfield(h, 'mlid');
% 设置当前目录,以便储藏文件(图片)
cd(h.mldir);
% 清理一小时前的图片.
wscleanup('niutunhuan*.jpeg', 1);
%得到数据
Lambda = str2double(h.Lambda)*10^(-6); %Lamada 表示波长
R = str2double(h.R)*10^3; %R为透镜的曲率半径,
range = str2double(h.range);
n = str2double(h.n);
if(~isfinite(Lambda)|~Lambda)
error('请输入波长.');
end
if(~isfinite(R)|~R)
error('请输入透镜的曲率半径.');
end
if(~isfinite(range)|~range)
error('请输入取值坐标.');
end
if(~isfinite(n)|n<5|n>1000)
error('请输入正确条纹清晰度(50-1000).');
end
% 开始创画板
Fig = figure('visible','off');
x=linspace(-range,range,n);
y=x;
[X,Y]=meshgrid(x,y);
I=4*cos(pi/Lambda*((X.^2+Y.^2)/R+Lambda/2)).^2; %等厚干涉的光强
NCLevels=255;
Ir=(I/4.0)*NCLevels;
image(x,y,Ir);
colormap(gray(NCLevels));
title('牛顿环(等厚干涉)计算机模拟');
%读写图片 到文件.
drawnow;
s.GraphFileName = sprintf('niutunhuan%s.jpeg', mlid);
wsprintjpeg(Fig, s.GraphFileName);
s.GraphFileName = sprintf('/icons/niutunhuan%s.jpeg', mlid);
close all;
% 写入到网页中.
templatefile = which('showpicture.html');
rs = htmlrep(s, templatefile);
附件三:(用MATLAB语言对迈克尔逊干涉仪模拟M文件)
function rs = maikexunganshe(h)
%等倾干涉的光强分布为:
% 得到唯一ID ,用于图片名字
mlid = getfield(h, 'mlid');
% 设置当前目录,以便储藏文件(图片)
cd(h.mldir);
% 清理一小时前的图片.
wscleanup('maikexunganshe*.jpeg', 1);
%得到数据
Lambda = str2double(h.Lambda)*10^(-6); %Lamada 表示波长
f = str2double(h.f); %f 屏幕前透镜的焦距
d = str2double(h.d); %d 由分光板分束,经相互垂直的两平面反射镜反射的二相干光束的光程差的一半
range = str2double(h.range);
n = str2double(h.n);
if(~isfinite(Lambda)|~Lambda)
error('请输入波长.');
end
if(~isfinite(d)|~d)
error('请输入光程差的一半.');
end
if(~isfinite(f)|~f)
error('请输入屏幕前透镜的焦距.');
end
if(~isfinite(range)|~range)
error('请输入请输入取值坐标.');
end
if(~isfinite(n)|n<5|n>1000)
error('请输入正确条纹清晰度(50-1000).');
end
% 开始创画板
Fig = figure('visible','off');
x=linspace(-range,range,n);
y=x;
[X,Y]=meshgrid(x,y);
r=sqrt(X.^2+Y.^2);
I=4*cos(pi*2*d*cos(atan(r/f)/Lambda)).^2;
NClevels=255;
Ir=(I/4.0)*NClevels;
image(x,y,Ir);
colormap(gray(NClevels));
title('克尔逊干涉仪(等倾干涉)计算机模拟');
%读写图片 到文件.
drawnow;
s.GraphFileName = sprintf('maikexunganshe%s.jpeg', mlid);
wsprintjpeg(Fig, s.GraphFileName);
s.GraphFileName = sprintf('/icons/maikexunganshe%s.jpeg', mlid);
close all;
% 写入到网页中.
templatefile = which('showpicture.html');
rs = htmlrep(s, templatefile);