【发布时间】:2017-08-20 01:48:19
【问题描述】:
我正在尝试实现split-step fourier 方法来求解光学中的非线性薛定谔方程。它基本上将线性部分和非线性部分分开处理。通过傅立叶变换求解线性部分,时域求解非线性部分。
以下代码抄自一本书:
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假设输入/输出从零开始。你能发布一个简短但完整的例子吗? -
编辑了代码
标签: matlab fft numerical-methods ode ifft