光的幹涉實驗仿真模擬首先是依據光幹涉的光強分布的理論公式及實驗參數建立光強數據矩陣,然後運用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);