我正试图在Matlab中解决一维平流方程,如paper,方程式(55) - (57)所述。我正在利用equaton的中心差异(59)。
我最终希望在论文中得到类似图(2)的东西,这是求解平流速度e(1-k)的平流方程的结果,其中k = 1,即驻波。但是,我的代码仍然存在分歧。以下是我到目前为止的情况:
%initial parameters
e = 1.0;
k = 0.5;
N = 120;
lx = 120;
%initialization of sine
for x=1:lx
if(x<3*lx/4+1 && x>lx/4+1)
phi(x) = sin(2*pi*(x-1-lx/4)/lx);
else
phi(x) = 0.0;
end
end
%advection loop
for t=1:N
gradPhi = 0.5*(+circshift(phi, [0,-1]) - circshift(phi, [0,+1]));
phiBar = phi + 0.5*k*e*gradPhi;
phiOutbar = circshift(phiBar, [0,-1]);
gradPhi = 0.5*(+circshift(phiOutbar, [0,-1]) - circshift(phiOutbar, [0,+1]));
phi = phiOutbar + 0.5*k*e*gradPhi;
end
plot(phi)
我的简单代码中的错误在哪里?
答案 0 :(得分:2)
您尚未在更新等式中包含时间步长dt。等式(55)中的项表示k * e * dt / 2。 这使您的更新非常不稳定并导致分歧。为了稳定性,您需要CFL为1,而您的当前大约为120.尝试以这种方式更新代码:
dt = 1/120;
%advection loop
for t=1:N/dt
gradPhi = 0.5*(+circshift(phi, [0,-1]) - circshift(phi, [0,+1]));
phiBar = phi + 0.5*dt*k*e*gradPhi;
phiOutbar = circshift(phiBar, [0,-1]);
gradPhi = 0.5*(+circshift(phiOutbar, [0,-1]) - circshift(phiOutbar, [0,+1]));
phi = phiOutbar + 0.5*dt*k*e*gradPhi;
end