我正在尝试编写一个程序来计算平流方程。
我对空间导数使用谱法以及时间导数的蛙跳法.
这将给出下一个时间步长的方程:
在哪里
,傅里叶变换, 傅里叶逆变换,=离散点的数量。
因为我需要两个初始值(向量),所以我使用 ode45 来计算解决方案有时并且已经有了解决方案在我们可以使用这两个向量来启动算法。
我得到错误的结果,但我看不出我做错了什么。这是一个情节
也许有人可以看到我做错了什么。
代码:
w = 0.2;
A = 1;
n = 2^8;
deltat = 2*A/n;
h = 2*A/n; %step size for N
x = -A:h:A-h; %Discretization of N
tm = 0:deltat:2;
u = @(x) exp(-(x/w).^2);
N = -n/2:n/2-1;
sol = zeros(length(tm),length(x)); % rows are space / columns are time;
u0 = u(x); % initial condition at t = 0
[t, ksol] = ode45(@f,[0 deltat], u0);
u1 = ksol(end,:);
sol(2,:) = u1;
sol(1,:) = u0;
for k = 3:length(tm)+1
f_hat = fft(sol(k-1,:),n); % fft transform
umiddle = deltat/n * ifft(1i * pi * N * f_hat); %% inverse fft
sol(k,:) = sol(k-2,:) - umiddle;
end
mesh(abs(real(sol(2:end,:))))
功能:
function sol = f(~,u)
n = 2^8;
N = -n/2:n/2-1;
D = diag(1i*N*pi); % diagonal matrix (* each u0 element)
sol = -ifft(D*fft(u,n));
end
