分步傅里叶算法的MATLAB程序实现

时间:2022-11-25 10:21:21 作者:壹号 字数:3040字

分步傅里叶算法的MATLAB程序实现举例

模型:

线性部分: 非线性部分:

2i?U1?U?z?2?x2?nU?02?2

n?U?x,z??d?z?n?x2其中:

d?z??exp??z?或d?z??exp???z?

2

?U?z=i?U2?x2

两边同时对x变量作傅里叶变换

~?U?z=i2?i??2~U

两边积分

?x?h21~dU=x?h2ix~U?x2?i??2dz

~lnU?x?h/2?~=iU?x?2?i??2*h2

最后有

~~U?x?h/2?=U?x?exp?i2h???i??*?22?

?再对x变量作作傅里叶逆变换

U?x?h/2?=FFT-1??FFT??i2h???U?x???exp?2?i??*??2????

?U?z?inU

两边积分

?x?h1?hxUdU=?xxindz

当h?0时

lnU?x?h?U?x??inh

最后有

U?x?h??U?x?exp?inh?

2折射率部分: n?U?x,?z?两边同时对x变量作傅里叶变换

n=FFT?U?~~2?nd??z2

?x2??d?z?*?i??n ?2~2FFT?U???n= 21??d?z?再对x变量作作傅里叶逆变换

?FFT?U2?????-1?n=FFT?? 2?1??d?z????MATLAB程序实现:

clear all

delta=1; x0=1;

%%------------------- n=2048; hx=0.06;

x=(-n/2:n/2-1)*hx; hw=2*pi/(n*hx);

w=fftshift((-n/2:n/2-1)*hw); %%-------------------

q=exp(-1*(x-x0).^2/2)+ exp(-1*(x+x0).^2/2); % q=sech(x);

u1(:,1)=(abs(q).^2)'; %------------------- L=500; nm=L*100; h=L/nm;

%------------------- for j=1:nm

j;

Dz=exp(delta*j*h)

D=exp(i*((i*w).^2/2)*h/2); qstep1=ifft(D.*fft(q));

n_index=ifft(fft(abs(qstep1).^2)./(Dz*w.^2+1)); N=exp(i*n_index*h); qstep2=N.*qstep1; q=ifft(D.*fft(qstep2)); u=abs(q);

r=floor(2+(j-1)/L); u1(:,r)=u'; end

z=0:L*h:L; figure(1)

mesh(x,z,u1'); view(0,90) figure(2)

plot(x,u1(:,end),'r',x,V,'b')

虚时间变换:

作虚时间变换:

z??iz

2得到

??U?z?1?U2?x2?nU?pR(x)U?0?n?x22

n?U?x,z??d2MATLAB程序实现:

线性部分:

?U?z=1?U2?x22

两边同时傅里叶变换

~?U?z=12?i??2~U

两边积分

?即

x?h2x1~~UdU=?x?h2x12?i??2dz

lnU?x?h/2?U?x?~~=12?i??2*h2

最后有

h?2?1U?x?h/2?=U?x?exp??i??*?

2??2~~再作傅里叶逆变换

h??2?1-1?U?x?h/2?=FFT?FFT?Uxexpi?*?????? ???2?2????非线性部分:

两边积分

?U?z1U?nU?pR(x)U

?当h?0时

x?hxdU=?x?hx?n?pR(x)?dz

lnU?x?h?U?x????n?pR?x???*h

最后有

U?x?h??U?x?exp???n?pR?*h??

clear all

Lh=0; p=1;

omega=1; Dz=0;

%%------------------- n=2048; hx=0.06;

x=(-n/2:n/2-1)*hx; hw=2*pi/(n*hx);

w=fftshift((-n/2:n/2-1)*hw); %%------------------- q=exp(-1*(x).^2/2); % q=sech(x);

intensity=2;

u1(:,1)=(abs(q).^2)'; %-------------------

V=p*(cos(omega*x)).^2.*(1+Lh*exp(-x.^8/128)); %-------------------- L=500; nm=L*100; h=L/nm;

%------------------- for j=1:nm j;

D=exp(((i*w).^2/2)*h/2); qstep1=ifft(D.*fft(q));

n_index=ifft(fft(abs(qstep1).^2)./(Dz*w.^2+1)); N=exp((V+n_index)*h); qstep2=N.*qstep1; q=ifft(D.*fft(qstep2));

q=sqrt(intensity)*q/sqrt(sum(abs(q).^2)*hx); u=abs(q);

…… 此处隐藏0字 ……

r=floor(2+(j-1)/L); u1(:,r)=u'; end

kin=-sum((q(3:end)-q(1:end-2)).^2)/4/hx;

p_i=sum(2*q.^2.*(abs(q).^2+V+n_index))*hx; b=(kin+p_i)/2/intensity z=0:L*h:L; figure(1)

mesh(x,z,u1'); view(0,90) figure(2)

plot(x,u1(:,end),'r',x,V,'b')