如何离散 Burger 方程?

计算科学 pde 有限差分 流体动力学 自适应网格细化
2021-12-16 11:14:56

我正在尝试解决非常简单的一维汉堡方程,即:

δUδt+δFδx=0

其中某个变量 U 的通量 F 定义为

F=U22

如果我考虑节点i周围的小控制体积,那么我应该将原始方程写为:

Uin+1UinΔt+Fi+0.5nFi0.5nΔx=0
我正在使用线性插值来计算控制体积边缘的F值。将节点i处的F定义为

F[i] = 0.5*0.5*(u[i] + u[i+1])*0.5*(u[i] + u[i+1]);

然后将函数的值修改为:

unew[i] = u[i] - (dt/dx)*(F[i] - F[i-1]);       //Final Equation//

然而,这种方法导致了不同的结果,我真的不明白为什么。

PS 我希望得到最终方程形式的离散方程,因为我还想使用自适应网格细化,如果离散方程是这种形式,它很容易应用。

2个回答

如果您想要最简单的适用于 Burger 方程且具有您建议的形式的数值方案,那么您应该更喜欢所谓的 Lax-Friedrichs 方法。

如果您有 LeVeque 关于双曲问题的有限体积方法的书,请寻找一个非常简单的公式 4.20(或稍微复杂一点的 4.21,但采用您建议的形式)。使用该方案,振荡将消失。

请注意,使用其他响应中提到的 Lax-Wendroff 方案,数值解中的振荡可以保留,因为它是所谓的二阶精确方法,通常无法避免振荡。Lax-Friedrichs 方法仅是一阶准确的。

如果简单性是您的第一标准,那么请注意,您仍然可以使用 Lax-Friedrichs 方法进行数值解的奇怪行为,即所谓的值聚类,参见 LeVeque 书中的图 12.3。

如果要避免这种聚类,请采用 Godunov 方案,参见公式 12.2,它也是一阶精确的,在数值解中没有振荡,也没有聚类。

如果你事先知道你的初始函数(你知道你需要知道U(x,0)) 处处为正,则方案 12.2 转向具有非常简单形式的所谓迎风方案

Fi0.5n=0.5(Ui1n)2,Fi+0.5n=0.5(Uin)2.

@Peter Frolkovic 的回答很好,但@Daniel Ruprecht 的评论也值得强调:您使用的方案(以空间为中心,在时间上向前)对于任何时间步长都是不稳定的如果您考虑平流方程并进行标准的冯诺依曼或线稳定性分析方法,则很容易看到这一点。这在大多数关于双曲 PDE 或有限差分方法的数值的介绍性书籍中都有介绍。

另一个学习解决这类方程的好方法的资源是我的HyperPython课程;特别是,第三课将带您超越@Peter Frolkovic 的回答中提到的一阶方法。