注意到之前的代码中,都设置了光波长lambda的值,且是一个定值。
但我们生活包括实验中用到的光源,几乎不可能是完全的单色光。
以太阳光为例,白光就是混合了多种颜色光的光源,可以在MATLAB中用工具包找到白光波长和颜色的关系:
sRGB = spectrumRGB(400:0.5:700);
figure
imshow(repmat(sRGB,[100 1 1]))
结果:
可以看出在白光中(我们设置的)400-700nm光的颜色和波长的对应关系。
仿真工具包下载网址:
https://ww2.mathworks.cn/matlabcentral/fileexchange/7021-spectral-and-xyz-color-functions
幸运的是,我们可以把混合的光分成不同波长的光束,分别计算并求和。
以白光的双缝干涉为例,以下是程序代码:
clear
d = 0.08e-3;
L = 1;
H = 0.1;
ScreenX = 1048;
ScreenY = 350;
lambda = 400:700;%波长不再是单一的
sRGB = spectrumRGB(lambda);%波长对应了一个RGB的数值
lambda = lambda*1e-9;
x01 = d/2;
x02 = -x01;
x = linspace(-H/2,H/2,ScreenX);
R1 = sqrt((x-x01).^2+L^2);%和之前单色光的计算是一样的
R2 = sqrt((x-x02).^2+L^2);
Irgb = zeros(ScreenY,ScreenX,3);%光屏上的结果
Iw = zeros(ScreenY,ScreenX,3);%每一轮计算得到的单色光对应结果
for k = 1:length(lambda)
A1 = exp(i*2*pi/lambda(k)*R1);
A2 = exp(i*2*pi/lambda(k)*R2);
I = (A1+A2).*conj(A1+A2);
%得到该波长对应的双缝干涉光强分布
Iw(:,:,1) = repmat(I*sRGB(1,k,1),[ScreenY 1 1]);
Iw(:,:,2) = repmat(I*sRGB(1,k,2),[ScreenY 1 1]);
Iw(:,:,3) = repmat(I*sRGB(1,k,3),[ScreenY 1 1]);
%分解成RGB的红绿蓝三色光
%这是一个三维的矩阵,第三个维度代表RGB
Irgb = Irgb+Iw;
Iw = [];
end
II = Irgb/max(max(max(Irgb)));
figure
subplot(2,1,1)
imshow(II)
Igray = rgb2gray(II);
Igray = Igray/max(max(Igray));
subplot(2,1,2)
plot(x,Igray(1,:))
ylabel('相对光强')
xlabel('x/m')
结果:
可以看出,不同颜色的光在经过双缝后在光屏上形成不同位置的条纹,这是因为不同波长光的明纹位置不同,类似于我们常说的色散现象。
同时,在中心位置的光强分布图中可以得出结论,在白光的双缝干涉仿真结果中,没有哪一个位置的光强度为0。
单色光双缝干涉时光强为0的位置,是因为在该位置光干涉相消,但是对另一波长的光,干涉相消不再存在。
整体的光强分布图类似于以x=0为对称轴的震荡
对于白光单缝衍射,我们可以用同样的方法进行分析:
d = 0.05e-3;
L = 1;
H = 0.1;
ScreenX = 1048;
ScreenY = 350;
lambda = 400:700;
sRGB = spectrumRGB(lambda);%和上方一样,波长对应了一个RGB的数值
lambda = lambda*1e-9;
x = linspace(-H/2,H/2,ScreenX);
theta = atan(x/L);
Irgb = zeros(1,ScreenX,3);%光屏上的结果
Iw = zeros(1,ScreenX,3);%每一轮计算得到的单色光对应结果
for k = 1:length(lambda)
I = (sin(d*pi*sin(theta)./lambda(k))./(d*pi*sin(theta)./lambda(k))).^2;
%得到该波长对应的双缝干涉光强分布
Iw(1,:,1) = I*sRGB(1,k,1);
Iw(1,:,2) = I*sRGB(1,k,2);
Iw(1,:,3) = I*sRGB(1,k,3);
%分解成RGB的红绿蓝三色光
%这是一个三维的矩阵,第三个维度代表RGB
Irgb = Irgb+Iw;
Iw = [];
end
II = repmat(Irgb,[ScreenY 1 1])/max(max(max(Irgb)));
figure
subplot(2,1,1)
imshow(II)
Igray = rgb2gray(II);
subplot(2,1,2)
plot(x,Igray(1,:));
ylabel('相对光强');
xlabel('x/m')
结果:
注意,白光单缝衍射的第一极小值不为0。
来源:《高等光学仿真——光波导、激光》