数值模拟结果不对,求修改

matlab程序。用拉盖尔高斯光束和平面波干涉的干涉条纹做光栅,发生菲涅尔衍射,得到拉盖尔高斯光束。现程序无报错,但结果和推导不符。


```bash
clc
close all

N = 1024*3;            % 取样点数
lambda = 632.8e-9;   % 波长632.8nm
k = 2*pi/lambda;     % 波数
w0 = 5e-2;
x = linspace(-5e-6, 5e-6, N); y = x;
[X, Y] = meshgrid(x, y);
[theta, r] = cart2pol(X, Y);
p = 0;                 % 径向指数
Z_R = pi*w0^2/lambda;  % 瑞利长度
z = 0;
w_z = w0*sqrt(1 + (z/Z_R)^2);  % 光束在z位置的半径
L=1;

% 计算光束的复振幅
E1 = sqrt(2*factorial(p)/pi/(p+factorial(abs(L))))*(1/w_z)*(sqrt(2)*r/w_z).^abs(L)...
        .*exp(-r.^2/w_z^2).*laguerre(p, abs(L), 2*r.^2/w_z^2).*exp(-1i*L*theta).*exp(-1i*k*z)...
        .*exp(-1i*k*r.^2*z/2/(z^2+Z_R^2))*exp(-1i*(2*p+abs(L)+1)*atan(z/Z_R));
E2 = exp(-1i*k*X);       % 平面波
C1 = E1 + E2;           % 干涉场的复振幅

% 计算干涉图样的强度分布
I = C1.*conj(C1);
% 菲涅尔衍射
z = 4e-3 ;  % 菲涅尔衍射距离
T = fftshift(fft2(I));% 光栅的频域表示
H = exp(1i*k*z)*exp(-1i*pi*lambda*z*(X.^2 + Y.^2));  % 菲涅尔传播函数
U = H.*T;  % 菲涅尔衍射
u = ifftshift(ifft2(U));
uu= u.*conj(u);
% 显示衍射图像
figure ;
imagesc(x, y, uu);
axis square;
colormap gray;
title('Fresnel Diffraction');
xlabel('x');
ylabel('y');
%拉盖尔多项式
function result = laguerre(p,L,x)
result = 0;
if p == 0    
    result = 1;
elseif p == 1    
result = 1+abs(L)-x;
else   
  result = (1/p)*((2*p+L-1-x).*laguerre(p-1,abs(L),x)-(p+L-1)*laguerre(p-2,abs(L),x));
end
end


```

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7509232
  • 这篇博客你也可以参考下:Matlab:涡旋光束与平面光波、球面光波干涉
  • 除此之外, 这篇博客: 利用MATLAB绘制箱线图—箱线图在高光谱图像处理中的应用中的 一、箱线图在高光谱图像处理中的应用 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    箱线图也称箱须图、箱形图、盒图,用于反映一组或多组连续型定量数据分布的中心位置和散布范围。箱形图包含数学统计量,不仅能够分析不同类别数据各层次水平差异,还能揭示数据间离散程度、异常值、分布差异等等。

    目前已经在异常检测,目标探测,红外小目标检测、分类等多个方向上有广泛的应用,具体箱线图的含义,读者可以百度,或者查看第三部分的相关参考文献,此处不再赘述。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

我感觉在计算干涉场复振幅时,使用的是拉盖尔高斯光束函数,但是在计算干涉光场的复振幅时,没有考虑到光栅的周期结构,也就是说没有进行衍射方程所需要的反射相位调制。这可能导致计算结果与理论推导不符。
另外,在进行干涉计算前,应该先将光栅的频域表示转换为对应的时域表示,否则进行菲涅尔传播函数的计算会出现问题。
建议加入相应的光栅反射相位调制部分,并在计算前将光栅的频域表示转换为时域表示,以获得更加准确的结果。
按照上述理解,修改了一下代码:

clc
close all

N = 10243;            % 取样点数
lambda = 632.8e-9;   % 波长632.8nm
k = 2pi/lambda;     % 波数
w0 = 5e-2;
x = linspace(-5e-6, 5e-6, N); y = x;
[X, Y] = meshgrid(x, y);
[theta, r] = cart2pol(X, Y);
p = 0;                 % 径向指数
Z_R = piw0^2/lambda;  % 瑞利长度
z = 0;
w_z = w0sqrt(1 + (z/Z_R)^2);  % 光束在z位置的半径
L=1;
period = 10e-6; % 光栅周期
d = period/2;   % 光栅刻线宽度
theta_i = 0;    % 光栅入射角
n_glass = 1.5;  % 光栅玻璃介质折射率

% 计算光束的复振幅
E1 = sqrt(2factorial(p)/pi/(p+factorial(abs(L))))(1/w_z)(sqrt(2)r/w_z).^abs(L)...
.exp(-r.^2/w_z^2).laguerre(p, abs(L), 2r.^2/w_z^2).exp(-1iLtheta).exp(-1ikz)...
.exp(-1ikr.^2z/2/(z^2+Z_R^2))exp(-1i(2p+abs(L)+1)atan(z/Z_R));
E2 = exp(-1ik*X);       % 平面波

% 计算光栅反射相位调制
delta_phi = 2pin_glassd/lambdasin(theta_i);
grating = exp(1idelta_phi(-1).^floor(X/period));

%C1 = E1 + E2;      % 不考虑光栅的情况
C1 = E1.*grating + E2;   % 考虑光栅的情况

% 计算干涉图样的强度分布
I = C1.*conj(C1);

% 菲涅尔衍射
z = 4e-3 ;  % 菲涅尔衍射距离
T = fftshift(fft2(I));    % 光栅的频域表示
H = exp(1ikz)exp(-1ipilambdaz*(X.^2 + Y.^2));  % 菲涅尔传播函数
U = H.*T;  % 菲涅尔衍射
u = ifftshift(ifft2(U));
uu= u.*conj(u);

% 显示衍射图像
figure;
imagesc(x, y, uu);
axis square;
colormap gray;
title('Fresnel Diffraction');
xlabel('x');
ylabel('y');

%拉盖尔多项式
function result = laguerre(p,L,x)
result = 0;
if p == 0

result = 1;
elseif p == 1

result = 1+abs(L)-x;
else

result = (1/p)((2p+L-1-x).*laguerre(p-1,abs(L),x)-(p+L-1)*laguerre(p-2,abs(L),x));
end
end

我理解你的问题是在 MATLAB 中使用拉盖尔高斯光束和平面波干涉的光栅进行菲涅尔衍射,但发现程序得到的结果与推导的结果不符。

菲涅尔衍射是光的波动性质的表现,它的推导过程比较复杂,因此需要仔细进行程序编写,再与理论推导进行比对才能找到问题所在,以下是可能的解决方案:

  1. 基于系统的调试:检查程序中的参数、单位和变量是否符合要求。例如,检查步长和采样率是否足够小,检查物体和光源的位置和参数是否正确,检查计算中是否存在单位问题等。

  2. 比较理论公式与结果:将程序结果与理论公式和预期结果进行比较。例如,在菲涅尔衍射模型中,检查成像点和成像平面与干涉板之间的距离是否即为物体到干涉板的距离,检查干涉版上投影区域内的光程差是否被正确计算等。

  3. 参照文献:最好查找相关文献,以确保程序中使用的公式和参数是正确的。如果某些参数和公式已经经过验证,并在数学工具包中提供,则使用这些公式和参数。

  4. 调整程序算法:重新审视算法。有时会发现问题是算法所导致的,即使用了错误的模型或计算方法。您可以浏览 MATLAB 的菲涅尔衍射相关文档,并与您的算法进行比较,看是否选用了正确的算法。

希望这些提示对您有所帮助,如果您有更多问题,请提供更多信息。

根据您提供的程序,我发现其中存在一些问题,可能是导致结果和推导不符的原因。具体来说,以下是可能存在问题的部分:

光束在计算复振幅时,关于相位的指数项有多个,例如:exp(-1iLtheta)、exp(-1ikz)等。这些项的顺序和位置需要严格按照菲涅尔衍射公式中的定义,否则会影响到计算结果。

计算干涉场的复振幅时,对于平面波的处理可能存在问题。实际上,平面波可以看作是拉格uerre高斯光束在无限远处的极限情况,因此不应该直接加到复振幅中。如果需要考虑平面波对干涉条纹的影响,应该将其作为参考波处理。

菲涅尔衍射计算中,传播函数 H 中的因子 exp(1ikz) 可能应该移动到傅里叶变换 T 中去,即:T = exp(1ikz)*fftshift(fft2(I)),这样才能得到正确的结果。

基于上述分析,您可以尝试重新修改程序,使其更加符合理论推导,从而得到更加准确的结果。另外,建议您在修改程序之前先对理论推导进行仔细的分析,确保程序中各个参数和公式的设置都是正确的。

代码中菲涅尔衍射的距离设置为4e-3,这个距离有点小,可能导致出现不符合预期的结果。建议适当增加距离,以增强干涉条纹的分辨率试试


clc;
clear;
close all;
%% 参数设置
wavelength = 632.8e-9; % 波长
k = 2 * pi / wavelength; % 波数
z = 1; % 菲涅尔距离
d = 10e-6; % 光栅周期
N = 1000; % 光栅点数
a = 50e-6; % 拉盖尔高斯光束参数
w0 = 5e-6; % 拉盖尔高斯光束参数
m = 1; % 光栅级数
%% 计算光栅
y = linspace(-d/2, d/2, N); % 光栅坐标
grating = exp(1i * m * k * y); % 光栅相位
%% 计算光束
[X,Y] = meshgrid(y,y);
R = sqrt(X.^2 + Y.^2);
theta = atan2(Y,X);
G = a * exp(-(R/w0).^2) .* exp(1i * m * theta); % 拉盖尔高斯光束
U0 = exp(1i * k * X); % 平面波
%% 计算干涉场
U = G .* U0 .* grating; % 干涉场
I = abs(U).^2; % 干涉场强度
%% 计算菲涅尔衍射
Uf = fftshift(fft2(U)); % 菲涅尔衍射
If = abs(Uf).^2; % 菲涅尔衍射强度
%% 显示结果
figure;
subplot(2,2,1);
imagesc(y,y,abs(G).^2);
axis equal tight;
colormap('gray');
title('拉盖尔高斯光束');
subplot(2,2,2);
imagesc(y,y,abs(U0).^2);
axis equal tight;
colormap('gray');
title('平面波');
subplot(2,2,3);
imagesc(y,y,I);
axis equal tight;
colormap('gray');
title('干涉条纹');
subplot(2,2,4);
imagesc(y,y,If);
axis equal tight;
colormap('gray');
title('菲涅尔衍射');

img