我試圖實現split-step fourier方法來求解光學中的非線性薛定諤方程。它基本上分別對待線性部分和非線性部分。它利用傅里葉變換和時域非線性部分解決了線性部分。matlab中fft,ifft和fftshift的使用
下面的代碼從一本書複製:
alpha = 0
beta_2 = 1
gamma = 1
T = linspace(-5,5,2^13);
delta_T = T(2)-T(1);
L = max(size(A));
delta_omega = 1/L/delta_T*2*pi;
omega = (-L/2:1:L/2-1)*delta_omega;
A = 2*sech(T);
A_t = A;
step_num = 1000;
h = 0.5*pi/step_num;
results = zeros(L,step_num);
A_f = fftshift(fft(A_t));
for n=1:step_num
A_f = A_f.*exp(-alpha*(h/2)-1i*beta_2/2*omega.^2*(h/2));
A_t = ifft(A_f);
A_t = A_t.*exp(1i*gamma*(abs(A_t).^2*h));
A_f = fft(A_t);
A_f = A_f.*exp(-alpha*(h/2)-1i*beta_2/2*omega.^2*(h/2));
A_t = ifft(A_f);
results(:,n) = abs(A_t);
end
其中A_t
是脈衝(函數要解決)。我不明白的是,它在開始時使用fftshift
將零頻移到中心,但後來在循環中沒有fftshift
。我嘗試在主循環中添加fftshift
,或者在開始時刪除它。兩者都給出了錯誤的結果,爲什麼呢?一般來說,我應該什麼時候使用fftshift
和ifftshift
,特別是當我試圖求解這種情況下的微分方程時?
感謝
我們需要看到什麼'omega'是,通常你需要用'fftshift'等。當你假設你的頻率是以零爲中心的,因爲'fft'和'ifft'假定輸入/輸出爲零開始。你能發佈一個簡短但完整的例子嗎? –
編輯代碼 – Physicist