我在做超透镜仿真,算法优化超透镜时每次迭代用lumericalFDTD软件计算,特别耗时。想转用matlab计算试试看,应该会更省时间,但是我在写代码时遇到了困难。入射振幅1的初始相位为0的平面光,以标准的双曲相位为调制,采用菲涅尔衍射公式计算,并没有聚焦的光强分布,结果如下

这是我的代码
%% --------------------------------------------------------------------------%%
%% 清除空间
clc;
clear ;
%%
%%以双曲相位为例的相位屏
f=100e-6;
lambda=1.064*1e-6;
M=50;
resolution=M;
p=0.5e-6;
r=(p*1e6*M/2)*1e-6;
x0=linspace(-r+p/2,r-p/2,M);
y0=linspace(-r+p/2,r-p/2,M);
[X0,Y0]=meshgrid(x0, y0);
k0=2*pi*(1/lambda);
nt=1;
phase_contour = -k0*nt*(sqrt(X0.^2+Y0.^2+f^2)-f);
phase_contour=wrapTo2Pi(phase_contour);
%细化相位屏
new_size = 100;
[X1, Y1] = meshgrid(linspace(1, 50, new_size), linspace(1, 50, new_size));
smoothed_phase_contour = interp2(phase_contour, X1, Y1, 'spline');
figure;
subplot(1, 2, 1);
imagesc(phase_contour);
title('原始相位轮廓');
subplot(1, 2, 2);
imagesc(smoothed_phase_contour);
title('插值后的相位轮廓');
%%
%%计算传输
phase = smoothed_phase_contour;%
E1=exp(1i* phase );%振幅为1初始相位为0的平面光穿过相位屏幕后的复振幅
z_f =f;%要观察的远场位置
E2=zeros(new_size,new_size);%远场光强
e2=zeros(new_size,new_size);%计算的一部分
x1=linspace(-r+p/2,r-p/2,new_size);
y1=linspace(-r+p/2,r-p/2,new_size);
[X1, Y1] = meshgrid(x1, y1);
e1=exp(1i*k0*z_f)/(1i*lambda*z_f);
for a=1:new_size
for b=1:new_size
e2=1i*k0*(X1(a)-X1).^2/2/z_f+1i*k0*(Y1(b)-Y1).^2/2/z_f;
e3=sum(sum(E1.*exp(e2)));
E2(a,b)=e1*e3;
end
end
intensity=E2.*conj(E2);
figure;
imagesc(x0,y0, intensity);
title('远场光强分布');
这是菲涅尔衍射公式
