求解一个简单的平流方程(1D)

时间:2015-06-07 09:08:43

标签: matlab

我正试图在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)

我的简单代码中的错误在哪里?

1 个答案:

答案 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