我写了一个简短的 matlab 脚本文件,假设运行菲涅耳的传播(衍射),这样给定某个输入字段 U0,它会告诉您该字段在距离 z0 后的样子。我将结果与教科书的结果进行了比较,看来我的程序运行良好。问题是如果我尝试采取两个传播步骤而不是一个。即,我没有对程序进行一次迭代来传播距离 z0,而是对程序进行两次迭代来传播距离 z0/2。然后我完全胡说八道,我无法弄清楚问题出在哪里。任何建议都将被非常感激地接受。这是代码:
function U = fresnel_advance (U0, dx, dy, z, lambda)
% The function receives a field U0 at wavelength lambda
% and returns the field U after distance z, using the Fresnel
% approximation. dx, dy, are spatial resolution.
k=2*pi/lambda;
[ny, nx] = size(U0);
Lx = dx * nx;
Ly = dy * ny;
dfx = 1./Lx;
dfy = 1./Ly;
u = ones(nx,1)*((1:nx)-nx/2)*dfx;
v = ((1:ny)-ny/2)'*ones(1,ny)*dfy;
O = fftshift(fft2(U0));
H = exp(1i*k*z).*exp(-1i*pi*lambda*z*(u.^2+v.^2));
U = ifft2(O.*H);