如何测试数值 ODE 求解器的实现?

计算科学
2021-12-01 20:43:47

我即将开始研究数值 ODE 求解器的软件库,并且我正在为如何为求解器实现制定测试而苦苦挣扎。我的目标是,该库最终将包含非刚性和刚性问题的求解器,以及至少一个隐式求解器(或多或少与Matlabode例程的功能相当),因此测试方法需要反映各种不同求解器的问题类型和标准。

我现在的问题是我不知道从哪里开始这个测试。我可以想出几种不同的方法来测试算法的输出:

  • 测试具有解析解的问题,并检查数值解是否在所有返回数据点的容差范围内。这需要了解一些分析问题的知识,这些问题展示了我希望不同求解器处理的所有属性(刚度、隐含问题等),这些我没有,至少我没有想到。

    此方法测试求解器方法的结果因此,不能保证求解器确实有效,只保证它适用于给定的测试问题因此,我怀疑需要大量测试问题才能自信地验证求解器是否有效。

  • 使用我打算实现的算法手动计算几个时间步的解,然后对求解器执行相同的操作并检查结果是否相同。这不需要知道问题的真正解决方案,但反过来需要大量的动手工作。

    另一方面,这种方法只测试算法,这对我来说很好 - 如果其他人已经证明 4Runge-Kutta 有效,我不觉得迫切需要这样做。但是,我确实担心制定测试用例会非常麻烦,因为我不知道生成测试数据的好方法(除了可能是手工,这将是很多工作......)。

就我目前的知识而言,上述两种方法都对我有严重的限制——我不知道第一个的一组好的测试问题,我也不知道为第二个生成测试数据的好方法。

还有其他方法可以验证数值 ODE 求解器吗?是否还有其他应该验证的实施标准?有没有关于测试 ODE 求解器的好的(免费)资源1

编辑:
由于这个问题非常广泛,我想澄清一点。我要创建的测试套件将满足两个主要目的:

  1. 验证求解器是否按预期工作,以解决他们要解决的问题。换句话说,非刚性问题的求解器可以在刚性问题上大放异彩,但在非刚性问题上应该表现良好。此外,如果库中有其他求解器可以提供更高的精度,则可能不需要强制执行非常准确的结果 - 只需“足够准确”即可。因此,我的部分问题是什么测试应该用于什么求解器;或者,至少,一个人应该如何做出决定。

  2. 安装库时的健全性测试。这些测试不需要(不应该)复杂或耗时;只是可以在 5 秒内运行的非常基础的东西,但是如果某些东西很奇怪,它会提醒用户。因此,我还需要一种方法来构建非常简单的测试,但仍然可以告诉我有关库状态的一些信息。


1是的,我一直在用谷歌搜索,但我发现的大部分内容都是带有非常琐碎示例的讲义,除了来自 Bari 的 CWI ODE 测试集,我不知道我是否或如何可以用于我的目的,因为它处理的求解器比我要测试的求解器要复杂得多……

3个回答

这是一个非常广泛的问题,我将给你一些思考的东西(有些已经包含在你的帖子中,但为了完整起见,它们在这里重复)。

问题范围

  • 您需要定义如何指定问题的接口。
  • 您是否要允许可以固定或可以针对解决方案变化的参数?
  • 您是否要允许扰动参数稍微扰动问题并查看它们在特定问题中是否仍然可以解决(例如,在任何地方定义的ϵ
  • 你要允许无限精度吗?
  • 您要测试速度和对数值精度的敏感度吗?
  • 您是否选择了两个(可能更多)已经存在的库来比较结果?
  • 您将如何选择停止标准,您会使用各种方法并让用户选择或定义自己的方法吗?
  • 您是否打算使用各种措施来衡量错误并允许用户打开和关闭这些措施?
  • 您是否查看过诸如计算机代数系统 (CAS) 之类的专业软件包并了解它们允许的所有选项?
  • 您是否允许显示结果和/或比较和/或绘图?

问题建议

  • 您需要编写一个测试规范,定义问题的根源、问题的测试范围、捕获结果和运行例程的指标。
  • 我当然会寻找已经存在的其他库来解决他们正在使用的问题(也许是测试文件)。
  • 我会去大学图书馆阅读有关 ODE 的书籍,然后找出所有类型的问题,包括已知的封闭形式或仅数字解决方案的问题。
  • 案例 1:我们想要尽可能多的封闭形式求解问题的变体,以便比较精确结果与数值结果。
  • 案例 2:我会翻阅每一本我能找到的数值分析书籍,捕捉并复制它们。我还会捕获问题集,特别是那些在大多数书中存在的一些病理学(对这种或那种类型的敏感性)。
  • 案例 3:我会去应用数学的不同分支,如物理学、生态学、生物学、经济学等。al 并从每个域中捕获问题,以验证您的问题规范语言是否允许此类示例。
  • 案例 4:我会研究包含最有用示例的论文/期刊,其中特定作者必须修改特定方法以解释某些病理、怪异或硬度。
  • 案例 5:在网上搜索更多示例。对于僵硬,请参阅此处的参考资料并仔细阅读它们以找出测试问题。这里有一些MATLAB示例供您仔细阅读。

这不是唯一的。如果您查看 Dennis 和 Schnabel 的书“Numerical Methods for Unconstrained Optimization and Nonlinear Equations”,附录 B,“测试问题”,您可以看到他们是如何做到的。在开发了我见过的最漂亮的算法集之一之后,他们抛出了一系列问题,这让我发疯了。你必须在这里和那里调整!它们包括五个非常不同的病态问题,这些问题使求解者的能力紧张。这告诉我,我们可以继续向算法抛出问题,而这些算法由于多种原因而无法处理。请注意,他们甚至从 More'、Garbow 和 Hillstrom 借用了这组问题(您也可以查找该参考资料,也许还有其他可以用作指导的参考资料)。

换句话说,这不是一项微不足道的任务。您需要 Known-Answer-test case 始终允许您测试更新的有效性并且不会破坏事情。也就是说,从低到高、从易到难、从可能到不可能的一组可重复且广泛的问题……您还需要一组您的求解器无法处理的问题,以便真正了解其局限性。

我对我的 ODE 求解器运行的一项健全性检查是通过精确计算系统矩阵的指数在较小的线性系统上简单地检查它。即给定

dudt=Au

检查错误

exp(tA)u0u^(t)

在哪里u^(t)是您计算的解决方案。这样你就不需要知道任何真正的解析解(假设你有一些等价的'expm'),但你仍然可以知道你的求解器是否在做它应该做的事情。

只是不要用你的时间步进器之一计算指数(即可疑的方法号 6 :) http://www.cs.cornell.edu/cv/researchpdf/19ways+.pdf

您可以尝试研究“制造解决方案方法”,这是一种用于测试解决 PDE 的代码实现的通用方法(它可用于查找数学和编码错误)。如果您的解决方案方法足够通用,我想它可以适用于解决 ODE。

http://prod.sandia.gov/techlib/access-control.cgi/2000/001444.pdf