迈克尔逊干涉仪作为19世纪最重要的光学实验装置之一,至今仍是大学物理实验课的标配设备。但传统实验受限于机械振动、环境温度波动等因素,往往难以获得理想的干涉图样。这次我们用MATLAB完整复现这个经典实验,不仅能规避物理限制,还能自由调节各项参数观察现象变化——比如把移动镜速度调到光速的1/10会怎样?空气折射率突变时条纹如何变化?这些在真实实验室里难以实现的"疯狂实验",在代码世界里都能轻松实现。
采用复数表示法建立光波模型:
matlab复制E1 = E0 * exp(1i*(k*x1 - w*t)); % 参考臂光波
E2 = E0 * exp(1i*(k*x2 - w*t + pi)); % 测量臂光波(含半波损失)
其中关键参数包括:
合成光强遵循叠加原理:
matlab复制I_total = abs(E1 + E2).^2; % 干涉场强度分布
展开后得到经典公式:
I = 2I₀(1 + cos(2πΔL/λ))
这个简洁的公式蕴含着干涉的所有秘密——条纹间距、对比度、位移灵敏度等特征都由此决定。
通过时间变量t控制移动镜位移:
matlab复制x2 = x2_initial + v*t; % 线性位移模型
delta_L = 2*(x2 - x1); % 往返光程差(系数2)
注意:实际物理实验中移动速度v通常小于1μm/s,但在仿真中可以尝试0.1c这样的极端值观察相对论效应(虽然这已超出经典干涉理论范畴)
matlab复制lambda = 632.8e-9; % He-Ne激光波长(m)
L = 0.5; % 初始臂长(m)
mirror_speed = 1e-6; % 移动镜速度(m/s)
t = linspace(0,10,1000); % 时间序列(s)
matlab复制% 空间坐标网格
[x,y] = meshgrid(linspace(-0.1,0.1,512));
% 动态干涉图样计算
for n = 1:length(t)
delta_L = 2*mirror_speed*t(n);
phase = 2*pi*delta_L/lambda;
I = 2*(1 + cos(phase + 2*pi*(x.^2+y.^2)/(lambda*L)));
imagesc(I); colormap gray; title(sprintf('t=%.2fs',t(n)));
pause(0.01);
end
这段代码实现了:
白光干涉模拟:
matlab复制lambda_range = 400:10:700; % 可见光波段(nm)
I_white = zeros(size(x));
for lambda = lambda_range
I_white = I_white + 2*(1 + cos(2*pi*delta_L/(lambda*1e-9)));
end
通过多波长叠加实现彩色干涉效果,中央零级条纹呈现白色特征。
当仿真出现低对比度条纹时,检查:
常见报错及解决方案:
| 错误现象 | 可能原因 | 解决方法 |
|---|---|---|
| 条纹闪烁跳变 | 相位计算超过2π | 增加phase = mod(phase,2*pi) |
| 图像卡顿 | 循环计算量过大 | 改用movie函数预生成帧 |
| 出现锯齿状条纹 | 空间采样不足 | 增大meshgrid分辨率 |
模拟引力波引起的时空畸变:
matlab复制h = 1e-21; % 应变幅度(类似LIGO量级)
delta_L = L*h*sin(2*pi*f_gw*t); % 引力波调制项
虽然极度简化,但能直观展示如何通过干涉测量亚原子尺度的距离变化。
加入随机相位扰动:
matlab复制phase_noise = 0.1*randn(size(x)); % 高斯随机相位
I = 2*(1 + cos(phase + phase_noise));
这可以模拟真实环境中空气抖动对干涉条纹的影响。
将两镜系统改为Fabry-Perot干涉仪:
matlab复制% 考虑多次反射的叠加
E_total = E0;
for n = 1:5
E_total = E_total + E0*r^n*exp(1i*n*phase);
end
其中r为反射率,此时会观察到锐利的干涉极大值。
通过这个项目,我们不仅复现了经典光学实验,更打开了数值仿真的大门——那些在物理实验室里受限于经费、安全等因素无法尝试的实验方案,现在都可以在代码世界里自由探索。这种"计算光学"的研究范式,正在成为现代光学实验教学的新标准。