数值解应该通过网格细化来改进,但事实并非如此。我应该如何解释这些结果?
不幸的是,人们只能说这意味着出了点问题。
减少应该会减少误差(与解析解相比)。这是因为数值估计导数的技术使用更小的会变得更准确。如果您的代码完全正确,那么唯一的错误就是这个数字错误(即由于网格和时间步长没有无限好导致的错误)。但是因为你的结果并没有以这种方式通过更精细的网格得到改善,它表明存在“其他一些问题”。ΔxΔx
您可以分析验证给定的解析解确实是控制微分方程的解(即将解代入控制方程,并计算出导数,然后您可以确认您最终得到了那些给定的源项)。可能需要一个符号计算器,例如sympy(对于 python)。
所以,你的程序有问题 - 一个错误。它可以是任何东西,从 cfd 代码(例如,您如何离散化)到程序中的拼写错误。
除了标准调试、代码审查等,缩小范围的一种方法是通过删除一些术语来简化控制方程。然后,将之前给定的相同解析解代入控制方程——这应该会产生不同的源项。(因为解和以前一样,所以初始条件和边界条件保持不变)。现在,像以前一样做,但使用新的源项:运行模拟,并将结果与解析解进行比较。每次优化网格大小(即减少)时,误差应该会减少。通过查看哪些简化的控制方程的行为正确或不正确,您可以缩小导致问题的项,从而缩小代码和/或程序的哪些部分是错误的。Δx
的减少而减少多少- 它应该是,其中是估计技术的阶数 (例如有限差分“前欧拉”是一阶,;中心差分是二阶,)。ΔxO((Δx)p)pp=1p=2
因为程序通常有错误,所以这种行为不太可能不是由错误引起的。但是,如果代码和您的程序 100% 没有错误,那么对于这个特定问题,这个方案和/或这个求解器可能是一个更深层次的问题。但这几乎可以肯定是一个错误。所以先调查一下。