为什么 Godunov 的方案(对于平流方程)是扩散的?

计算科学 matlab pde
2021-12-08 12:51:18

我正在尝试使用一阶 Godunov 方案以数值因此我写其中如果否则。

mt+(αm)x=0
m(0,)=m0
mji+1=mjidtdx(mj+1/2iαj+1/2imj1/2iαj1/2i)
mj+1/2i=mj+1iαj+1/2i<0mji

这是一个到处都有的 Matlab 代码:α=1/2

%% parameters
N=99; M=99; 

%Allocate memory
x=linspace(0,1,M+1); 
mk=zeros(N+1,M+1); a_ph=ones(N,M)*0.5; 

%% Set initial conditions
sigma=0.08;
mk(1,:)=1/sqrt(2*pi*sigma^2)*exp(-(x-0.5).^2/(2*sigma^2));

q=dt/h;

for i=1:N
    ai=ak_ph(i,2:M); aim=a_ph(i,1:M-1); %local var
    B=diag([0,ai.*(ai>=0),0]) + diag([0,ai.*(ai<0)],1) ...
       - diag([0,aim.*(aim<0),0]) - diag([aim.*(aim>=0),0],-1);
    mk(i+1,:)=(eye(M+1)-q*B)*mk(i,:)';
end

[X1,X2]=meshgrid(x1,x2);
surf(X1,X2,mk','FaceColor','interp','EdgeColor','none')

当我计算解决方案时,这就是我得到的:

在此处输入图像描述

我期望波以均匀的速度传播,但同时振幅变小,这很奇怪。波峰处也有涟漪。有人有建议吗?

1个回答

Godunov 方案是一个棘手的方案,它根据波的传播方向选择模板由于方程的双曲线特性,我们知道在平流问题中,如果波速为正,信息应该从左到右传播,反之,如果波速为负。Godunov 的方案用您在表达式中编写的数学表达式描述了这个技巧,例如 " if否则"。如果符号颠倒,将导致非物理振荡!mj+1/2i=mj+1iαj+1/2i<0mji

为什么这个方案是扩散的以及如何摆脱它

为简单起见,我假设波速 =1;那么这个问题的精确解,可以写成α

min+1=mi1n

对于正,有限差分方程可以写为 这里 CFL= Courant–Friedrichs–Lewy数 = 如果我们做Von-Newman对该问题的稳定性分析,它将限制我们的数量小于 1。α

min+1=minCFL(minmi1n)
mIn+1=CFLmi1n+min(1CFL)
αδtδxCFL

我们的离散结果仍然与精确结果不匹配。 = 1,然后结果将与精确结果匹配。第二项称为数值粘度,即扩散结果的项。您会注意到该术语随着数量的减少而增加。这意味着人工粘度正在增加,会降低信号幅度(您已经在代码中观察到了这一点)。CFLmin(1CFL)CFL

请尝试更改编号并分析您的结果,您将清楚地理解它。如果您想查看网格间距的效果,那么您应该尝试一些更高阶的TVD方案或具有不同初始条件的ENO 。CFL

请注意,我在这里讨论的分析仅对前向欧拉时间离散化有效,可能对其他时间离散化无效。为此,我们应该为该方案绘制相速度图和数值扩散系数图。根据经验,我们可以说奇数阶方案是扩散的,偶数阶方案是分散的。在大多数好的数值方案中,这种扩散和分散可以通过改变CFL单元雷诺数和网格大小来控制。