如果数值解对于不同的网格大小保持不变,这意味着什么?

计算科学 流体动力学 有限体积 数值建模
2021-12-17 11:46:22

我正在测试一个有限体积方案,Godunov 型求解器,使用解析解的问题。我无法重现包含源术语的解决方案。我尝试了不同的网格尺寸,得到了相同的结果,但这不是我应该得到的。

因为我向我的一位教授建议,也许代码实际上无法重现这个问题,正如论文所说,所以他让我尝试不同的网格尺寸,他说如果这是一个数值问题,数值解应该通过网格细化得到改进,但事实并非如此。我应该如何解释这些结果?

这是我正在使用的论文: http ://www.sciencedirect.com/science/article/pii/S0021999112003464

2个回答

如果没有更多关于您的结果“错误”的细节,我会说以下内容:数值实现不提供“验证”结果。换句话说,您的实现没有正确求解离散化方程(例如代码中的错误)或您的方法的理论基础不正确(例如离散化与方程不一致)。

数值解应该通过网格细化来改进,但事实并非如此。我应该如何解释这些结果?

不幸的是,人们只能说这意味着出了点问题。

减少应该会减少误差(与解析解相比)。这是因为数值估计导数的技术使用更小的会变得更准确。如果您的代码完全正确,那么唯一的错误就是这个数字错误(即由于网格和时间步长没有无限好导致的错误)。但是因为你的结果并没有以这种方式通过更精细的网格得到改善,它表明存在“其他一些问题”。ΔxΔx

您可以分析验证给定的解析解确实是控制微分方程的解(即将解代入控制方程,并计算出导数,然后您可以确认您最终得到了那些给定的源项)。可能需要一个符号计算器,例如sympy(对于 python)。

所以,你的程序有问题 - 一个错误。它可以是任何东西,从 cfd 代码(例如,您如何离散化)到程序中的拼写错误。

除了标准调试、代码审查等,缩小范围的一种方法是通过删除一些术语来简化控制方程。然后,将之前给定的相同解析解代入控制方程——这应该会产生不同的源项。(因为解和以前一样,所以初始条件和边界条件保持不变)。现在,像以前一样做,但使用新的源项:运行模拟,并将结果与​​解析解进行比较。每次优化网格大小(即减少)时,误差应该会减少。通过查看哪些简化的控制方程的行为正确或不正确,您可以缩小导致问题的项,从而缩小代码和/或程序的哪些部分是错误的。Δx

的减少而减少多少- 它应该是,其中是估计技术的阶数 (例如有限差分“前欧拉”是一阶,;中心差分是二阶,)。ΔxO((Δx)p)pp=1p=2

因为程序通常有错误,所以这种行为不太可能不是由错误引起的。但是,如果代码和您的程序 100% 没有错误,那么对于这个特定问题,这个方案和/或这个求解器可能是一个更深层次的问题。但这几乎可以肯定是一个错误。所以先调查一下。