你如何调试数字代码,这个振荡错误的来源是什么?

计算科学 数值分析 平流扩散
2021-12-09 12:28:00

从经验中可以获得很多见解,我只是想知道是否有人以前见过类似的东西。该图显示了对流-扩散方程的初始条件(绿色),然后是迭代 200(蓝色)和迭代 400(红色)的解。

振荡误差

对流-扩散方程的解在几次迭代后就爆炸了。佩克莱数μ0.07,并且满足 CFL 条件,C0.0015,所以方程应该是稳定的。我预计我在数字代码中有一个错误。

背景。离散化是平流项和扩散项的中心差异。我相信这是对流的一阶和扩散的二阶。我已经使用有限体积方法(第一次)实现了这一点,其中细胞表面的系数(速度和扩散系数)值是通过细胞平均值的线性插值来找到的。我在左右表面上应用 Robin 边界条件,并将边界处的通量设置为零。

你如何调试你的数字代码?以前有没有人遇到过这样的场景,哪里是开始寻找的好地方?

更新

更新

解决方案再简单不过了!我刚刚在扩散项上犯了一个符号错误。很奇怪,我确定我没有发布这个我不会发现错误!如果有人想分享他们如何调试数字代码的技巧,我仍然很感兴趣。我没有方法,有点碰运气,我一直在尝试寻找线索,但这个过程可能需要数周(有时)。

证明它有效(注意,使用有限体积法计算面积所需要做的就是宽度的总和×所有单元格的高度,如果您使用诸如 numpy.trapz 之类的积分方法,您的结果包括梯形方法的数值误差)。这里发生了什么?存在恒定的速度和扩散系数,但具有封闭的边界条件。因此,在边界处,我们看到向右推的速度场和向左推的扩散之间的平衡。

通过有限体积法具有封闭边界条件的对流扩散方程。

1个回答

我在这里收集了一些调试数字代码的经验:deal.II FAQ:调试我不知道在这种特殊情况下这是否会对您有所帮助,但在其他情况下可能会有所帮助。