光的衍射特性分析及MATLAB仿真详解

一、光的衍射理论概述

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

 

代码说明

  1. 光源与单缝参数定义:波长和单缝宽度等参数均可以调节。
  2. 近场衍射仿真:基于菲涅尔公式,通过数值积分计算光强分布。
  3. 远场衍射仿真:利用夫琅禾费公式计算光强分布。
  4. 模拟实验数据:通过在仿真数据中加入噪声,模拟实验数据。
  5. 最小二乘法拟合:通过优化单缝宽度和距离参数,使仿真结果与实验数据最匹配。
  6. 绘图展示:分别展示近场、远场衍射图样,以及实验数据与仿真结果的比较。

输出结果

  • 近场与远场的归一化光强分布图
  • 实验数据与仿真结果的比较图
  • 最小二乘法拟合后的仿真结果与实验数据的拟合对比图

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时的未定义情况。
  • 结果绘制:将计算得到的光强分布进行归一化处理,并绘制在同一图中以便比较。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值