2017-11-28 5 views
1

Hallo Ich habe eine Schwierigkeit mit dem Split-Schritt Fourier-Methode. Angenommen, ich eine Gaußsche im freien Raum verbreiten wollen, ich verwenden soll:Split-Schritt Fourier-Propagation - Beam Propagation-Methode

A(x,z) = F^-1 [exp((i*k^2*z)/(2*k_0))* F[A(x,0)]] 

wobei F die Fourier und F^-1 ist die inverse Fourier.

Was ich tun möchte, ist plotten I (x, z = 0), I (x, z = 3) und die Intensitätsverteilung in der x-z-Ebene.

Ich versuchte es numerisch tun (Plotten I (x, z = 0), I (x, z = 3)) mit dem folgenden Code:

lambda = 0.5*10^-6; 
k0 = 2*pi/lambda; 
w = 10*10^-6; 
N=500; 
a=0.4*10^-4; 
dx=a/N; 
x = -a/2:dx:a/2-dx; 
Dk_x = 2*pi*N/a; 
dk_x=2*pi/a; 
k_x=-Dk_x/2:dk_x:Dk_x/2-dk_x; 
N = (k_x.^2)/(2*k0); 
z = 0:(5*10^-3)/length(N):5*10^-3; 
z(end) = []; 
% A0 = A(x,z=0) 
A0 = exp(-x.^2/w^2); 
I_0 = A0.*conj(A0); 
% F_A0 is the fourier of A0 
F_A0 = fft(A0); 
% A3 = A(x,z=3) 
A3 = ifft(exp(1i*N*3).*F_A0); 
I_3 = A3.*conj(A3); 
figure 
plot(x,I_3,x,I_0) 

Allerdings ist I_3 nicht, was ich zu erwarten erhalten, die eine andere Gaußsche von geringerer Intensität ist.

Außerdem bin ich mir nicht sicher, wie ich die Intensitätsverteilung in der x-z-Ebene darstellen würde. Sie schlagen vor, mit der imagesc Funktion, die ich nehme an, ich mag es verwenden würde:

imagesc(x,z, abs(ifft(exp(1i*N.*z).*F_A0).^2) 

aber das dritte Argument, die angeblich eine Matrix sein, ist ein Vektor in dem, was ich geschrieben habe ..

Kann mir bitte jemand dabei helfen?

Vielen Dank im Voraus.

+0

die Ausbreitung entlang z, ist 1D die Gaußsche Sie übertragen möchten, muss der Split-Schritt eine for-Schleife, wo Sie propagiere jedes Mal mit einem kleinen dz ... – bla

+0

aber für I (x, z = 3), schaue ich nicht auf ein einzelnes z? – FlyGuy

+0

Ich glaube ich verstehe was du jetzt meinst. Ich werde es jetzt versuchen und aktualisieren. Danke! – FlyGuy

Antwort

0

hier ist ein Beispiel für einen Split Schritt frei Gaußschen Ausbreitungs:

N=2^9; % x grid points 
L=100; % box length 
dx=L/N; %position grid interval 
x=(-L/2+1/N):dx:L/2; %define position grid (centered around origin) 

dk=2*pi/L; %momentum grid interval 
k=(-N/2+1:1:N/2).*dk; %define momentum grid 

A_z=exp(-x.^2); % initial gaussian 
dz=0.01; % propagation step 
z=0:dz:3; % propagation vector 

% do the propagation using split step 
for n=1:numel(z) 
    A_z=ifft(fftshift( exp(1i*k.^2*dz).*fftshift(fft(A_z)) )); 
    I_z(n,:)=abs(A_z).^2; 
end 

imagesc(x,z,I_z) 
xlim([-20 20]); 
xlabel('x'); ylabel('z') 

enter image description here

+0

Das ist erstaunlich. Ich danke dir sehr. In dem, was ich jetzt versuchte, tat ich fast dasselbe, aber in meiner Schleife speicherte ich nur die letzte Iteration der Intensität und so erhielt ich einen Vektor von I (x, z = 3). Ich habe versucht, etwas damit zu tun Ihr Code und das Einstecken der Zahlen (Wellenlänge, k0, usw.) von meinem ursprünglichen Code oben und ich bekomme gerade einen grünen Schirm. Was könnte das Problem hier sein? – FlyGuy

+0

Sie müssen konsistente Einheiten verwenden (sagen Sie Mikron), ich weiß nicht, welche Zahlen Sie tatsächlich verwenden und warum, aber überprüfen Sie das sorgfältig. Ich würde damit anfangen zu überprüfen, dass das, was Sie eingeben, tatsächlich ein Vektor ungleich null ist. Wenn ich dein Beispiel sehe, habe ich ein Gefühl (und verzeihe mir, unverblümt zu sein), dass du nicht verstehst, was diese Parameter bedeuten. – bla

+0

Ich denke, ich habe es jetzt funktioniert. Vielen Dank für die Hilfe bla! – FlyGuy