一、光的衍射理论概述
1. 近场衍射(菲涅尔衍射)
近场衍射是指当观察屏与衍射物体(如狭缝)之间的距离较近时发生的衍射现象。此时,衍射图样不仅与衍射物体的形状有关,还与观察距离有关。菲涅尔衍射需要考虑光波在空间中的传播路径,通常使用菲涅尔-基尔霍夫衍射公式进行计算。
2. 远场衍射(夫琅禾费衍射)
远场衍射是指当观察屏远离衍射物体时的衍射现象。在这种情况下,衍射图样与观察距离无关,仅由衍射物体的结构决定。夫琅禾费衍射可以通过对衍射物体的孔径函数进行傅里叶变换得到。
二、最小二乘法简介
最小二乘法是一种用于数据拟合的统计方法,通过最小化观测值与拟合函数之间的误差平方和,找到最优的参数估计。在光学实验中,最小二乘法常用于拟合光强分布曲线,从而提取物理参数。
三、MATLAB仿真光的衍射
1. 仿真思路
- 建立衍射模型:根据衍射理论,建立光在通过狭缝或孔径后的光场分布模型。
- 计算光强分布:利用菲涅尔或夫琅禾费衍射公式,计算不同位置处的光强分布。
- 绘制衍射图样:使用MATLAB绘制光强分布图,展示衍射图样。
- 数据分析与比较:将仿真结果与实验数据进行比较,使用最小二乘法进行数据拟合和分析。
% 清空环境变量
clear; clc; close all;
% 光源参数
lambda = 632.8e-9; % 波长(红光He-Ne激光器),单位:米
% 单缝参数
a = 100e-6; % 单缝宽度,单位:米
% 空间坐标
x_range = linspace(-0.01, 0.01, 10000); % 观察屏横向坐标,单位:米
% 观察距离
z_near = 0.1; % 近场距离,单位:米
z_far = 10; % 远场距离,单位:米
% 波数
k = 2 * pi / lambda;
%% 近场衍射计算(菲涅尔衍射)
U_near = zeros(size(x_range)); % 初始化近场光场
for idx = 1:length(x_range)
x = x_range(idx);
% 单缝积分变量
xi = linspace(-a/2, a/2, 1000); % 单缝范围
integrand = exp(1i * k / (2 * z_near) * (x - xi).^2);
U_near(idx) = trapz(xi, integrand); % 数值积分计算光场
end
% 光强分布
I_near = abs(U_near).^2;
%% 远场衍射计算(夫琅禾费衍射)
theta = atan(x_range / z_far); % 观察角度
beta = pi * a * sin(theta) / lambda; % 无量纲参数
I_far = (sin(beta) ./ beta).^2; % 光强分布公式
I_far(isnan(I_far)) = 1; % 处理 beta = 0 的情况
%% 模拟实验数据
% 假设实验数据为带噪声的近场数据
exp_x = x_range; % 实验横向坐标
exp_I = I_near + 0.05 * max(I_near) * randn(size(I_near)); % 加入噪声
exp_I_norm = exp_I / max(exp_I); % 归一化实验光强
%% 绘制结果
% 近场衍射图样
figure;
subplot(2,1,1);
plot(x_range * 1e3, I_near / max(I_near), 'r', 'LineWidth', 1.5);
xlabel('位置 x (mm)');
ylabel('归一化光强');
title('近场(菲涅尔)衍射图样');
grid on;
% 远场衍射图样
subplot(2,1,2);
plot(x_range * 1e3, I_far / max(I_far), 'b', 'LineWidth', 1.5);
xlabel('位置 x (mm)');
ylabel('归一化光强');
title('远场(夫琅禾费)衍射图样');
grid on;
% 实验数据与仿真比较
figure;
plot(exp_x * 1e3, exp_I_norm, 'k', 'LineWidth', 1.5); hold on;
plot(x_range * 1e3, I_near / max(I_near), 'r--', 'LineWidth', 1.5);
plot(x_range * 1e3, I_far / max(I_far), 'b--', 'LineWidth', 1.5);
xlabel('位置 x (mm)');
ylabel('归一化光强');
legend('实验数据', '近场仿真', '远场仿真');
title('实验数据与仿真结果比较');
grid on;
%% 最小二乘法拟合
% 定义误差函数
error_func = @(params) sum((exp_I_norm - simulate_near_field(params(1), params(2))).^2);
% 模拟近场衍射模型函数
simulate_near_field = @(a_param, z_param) simulate_fresnel(x_range, a_param, lambda, z_param);
% 优化参数(单缝宽度和近场距离)
initial_params = [a, z_near]; % 初始猜测值
opt_params = fminsearch(error_func, initial_params);
% 使用优化后的参数计算仿真结果
I_opt = simulate_near_field(opt_params(1), opt_params(2));
% 绘制拟合结果
figure;
plot(exp_x * 1e3, exp_I_norm, 'k', 'LineWidth', 1.5); hold on;
plot(x_range * 1e3, I_opt / max(I_opt), 'g--', 'LineWidth', 1.5);
xlabel('位置 x (mm)');
ylabel('归一化光强');
legend('实验数据', '拟合仿真结果');
title('实验数据与拟合仿真结果比较');
grid on;
%% 菲涅尔衍射辅助函数
function I_near_sim = simulate_fresnel(x_range, a, lambda, z)
% 计算菲涅尔衍射的光强分布
k = 2 * pi / lambda; % 波数
U_near_sim = zeros(size(x_range)); % 初始化光场
for idx = 1:length(x_range)
x = x_range(idx);
xi = linspace(-a/2, a/2, 1000); % 单缝积分范围
integrand = exp(1i * k / (2 * z) * (x - xi).^2);
U_near_sim(idx) = trapz(xi, integrand);
end
I_near_sim = abs(U_near_sim).^2; % 返回光强分布
end
代码说明
- 光源与单缝参数定义:波长和单缝宽度等参数均可以调节。
- 近场衍射仿真:基于菲涅尔公式,通过数值积分计算光强分布。
- 远场衍射仿真:利用夫琅禾费公式计算光强分布。
- 模拟实验数据:通过在仿真数据中加入噪声,模拟实验数据。
- 最小二乘法拟合:通过优化单缝宽度和距离参数,使仿真结果与实验数据最匹配。
- 绘图展示:分别展示近场、远场衍射图样,以及实验数据与仿真结果的比较。
输出结果
- 近场与远场的归一化光强分布图。
- 实验数据与仿真结果的比较图。
- 最小二乘法拟合后的仿真结果与实验数据的拟合对比图。
3. 代码详解
- 参数设置:设置光的波长、单缝宽度、观察屏坐标范围以及观察距离。
- 菲涅尔衍射计算:
- 计算菲涅尔数以判断是否满足近场条件。
- 使用菲涅尔-基尔霍夫衍射公式,通过数值积分计算光场。
- 夫琅禾费衍射计算:
- 使用夫琅禾费衍射公式,计算远场衍射的光强分布。
- 注意处理
beta=0
时的未定义情况。
- 结果绘制:将计算得到的光强分布进行归一化处理,并绘制在同一图中以便比较。
四、实验数据的采集与处理
1. 使用CCD采集光强度图样
在实际实验中,可以使用CCD相机采集单缝衍射的光强度分布。需要注意以下几点:
- 校准:在采集数据前,对CCD进行校准,确保其响应线性。
- 数据获取:记录CCD获取的灰度值,并转换为光强度值。
- 背景扣除:去除环境光和暗电流的影响,获得净光强分布。
2. 数据分析与比较
将实验数据导入MATLAB,与仿真结果进行比较
3. 使用最小二乘法进行拟合
为了量化实验数据与仿真结果的差异,可以使用最小二乘法对参数进行拟合。例如,可以调整单缝宽度a
或观察距离z
,使得仿真结果与实验数据最匹配。
% 清空环境
clear; clc;
% 光源参数
lambda = 632.8e-9; % 波长,单位:米
% 单缝参数
a = 100e-6; % 单缝宽度,单位:米
% 空间坐标
x_range = linspace(-0.01, 0.01, 10000); % 观察屏坐标,单位:米
% 观察距离
z_near = 0.1; % 近场距离,单位:米
z_far = 10; % 远场距离,单位:米
% 计算近场衍射(菲涅尔)
k = 2 * pi / lambda; % 波数
U_near = zeros(size(x_range));
for idx = 1:length(x_range)
x = x_range(idx);
xi = linspace(-a/2, a/2, 1000);
integrand = exp(1i * k / (2 * z_near) * (x - xi).^2);
U_near(idx) = trapz(xi, integrand);
end
I_near = abs(U_near).^2;
% 计算远场衍射(夫琅禾费)
theta = atan(x_range / z_far);
beta = pi * a * sin(theta) / lambda;
I_far = (sin(beta)./beta).^2;
I_far(isnan(I_far)) = 1;
% 绘制结果
figure;
subplot(2,1,1);
plot(x_range * 1e3, I_near / max(I_near), 'r');
xlabel('位置 x (mm)');
ylabel('归一化光强');
title('近场(菲涅尔)衍射图样');
grid on;
subplot(2,1,2);
plot(x_range * 1e3, I_far / max(I_far), 'b');
xlabel('位置 x (mm)');
ylabel('归一化光强');
title('远场(夫琅禾费)衍射图样');
grid on;
% 假设已导入实验数据exp_x和exp_I
% 这里使用仿真数据加噪声模拟实验数据
exp_x = x_range;
exp_I = I_near + 0.05 * max(I_near) * randn(size(I_near));
exp_I_norm = exp_I / max(exp_I);
% 绘制实验数据与仿真结果的比较
figure;
plot(exp_x * 1e3, exp_I_norm, 'k', 'LineWidth', 1);
hold on;
plot(x_range * 1e3, I_near / max(I_near), 'r--', 'LineWidth', 1);
plot(x_range * 1e3, I_far / max(I_far), 'b--', 'LineWidth', 1);
xlabel('位置 x (mm)');
ylabel('归一化光强');
legend('实验数据', '近场仿真', '远场仿真');
title('实验数据与仿真结果比较');
grid on;
- 参数优化:利用最小二乘法对更多参数进行优化,例如光源波长、狭缝形状等。
- 多缝衍射:扩展到双缝或多缝衍射,探讨干涉与衍射的结合效应。
- 二维衍射:研究圆孔或光栅的衍射,仿真二维的衍射图样。
分步详解
以下以单缝衍射为例,分别仿真近场和远场的衍射图样。
(1)定义参数
% 清空环境
clear; clc;
% 光源参数
lambda = 632.8e-9; % 波长(红光He-Ne激光器),单位:米
% 单缝参数
a = 100e-6; % 单缝宽度,单位:米
% 空间坐标
x_range = linspace(-0.01, 0.01, 10000); % 观察屏上横向坐标,单位:米
% 观察距离
z_near = 0.1; % 近场距离,单位:米
z_far = 10; % 远场距离,单位:米
(2)菲涅尔衍射计算(近场)
% 菲涅尔数
F_near = a^2 / (lambda * z_near);
% 计算菲涅尔积分
k = 2 * pi / lambda; % 波数
% 菲涅尔积分函数
U_near = zeros(size(x_range));
for idx = 1:length(x_range)
x = x_range(idx);
% 积分变量
xi = linspace(-a/2, a/2, 1000);
integrand = exp(1i * k / (2 * z_near) * (x - xi).^2);
U_near(idx) = trapz(xi, integrand);
end
% 光强分布
I_near = abs(U_near).^2;
(3)夫琅禾费衍射计算(远场)
% 角度坐标
theta = atan(x_range / z_far);
% 夫琅禾费衍射公式
beta = pi * a * sin(theta) / lambda;
I_far = (sin(beta)./beta).^2;
% 处理beta为零的情况
I_far(isnan(I_far)) = 1;
(4)绘制结果
% 绘制近场衍射图样
figure;
subplot(2,1,1);
plot(x_range * 1e3, I_near / max(I_near), 'r');
xlabel('位置 x (mm)');
ylabel('归一化光强');
title('近场(菲涅尔)衍射图样');
grid on;
% 绘制远场衍射图样
subplot(2,1,2);
plot(x_range * 1e3, I_far / max(I_far), 'b');
xlabel('位置 x (mm)');
ylabel('归一化光强');
title('远场(夫琅禾费)衍射图样');
grid on;
- 参数设置:设置光的波长、单缝宽度、观察屏坐标范围以及观察距离。
- 菲涅尔衍射计算:
- 计算菲涅尔数以判断是否满足近场条件。
- 使用菲涅尔-基尔霍夫衍射公式,通过数值积分计算光场。
- 夫琅禾费衍射计算:
- 使用夫琅禾费衍射公式,计算远场衍射的光强分布。
- 注意处理
beta=0
时的未定义情况。
- 结果绘制:将计算得到的光强分布进行归一化处理,并绘制在同一图中以便比较。