我正在尝试实现split-step fourier方法来解决光学中的非线性schrodinger方程。它基本上将线性部分和非线性部分分开对待。它通过使用傅立叶变换求解线性部分,并在时域中求解非线性部分。
以下代码是从书中复制的:
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
,尤其是在这种情况下尝试求解微分方程时?谢谢
最佳答案
您可以通过将信号绘制为图像并注意到明显的差异来部分澄清您的疑问,就像我尝试相同时所做的那样。
首先,是否使用fftshift和ifftshift取决于您正在处理的信号类型。
以0为中心。
好,为了使事情变得简单,请遵循以下切换案例-
切换(信号):
{
大小写为(信号同时具有-ve和+ ve部分,以零为中心):
大小写为(信号已经无序):
情况(同时应用fft和ifft):
}
关于matlab - 在MATLAB中使用fft,ifft和fftshift,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45777764/