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


26

我将开始研究数字ODE求解器软件库,并且正在为如何为求解器实现制定测试而苦苦挣扎。我的目标是,库,最终将包括两个非刚性和刚性问题解决者,以及至少一个隐式求解(或多或少看齐的能力ode在Matlab程序),所以测试方法需要反映各问题类型和针对不同求解器的条件。

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

  • 测试具有解析解的问题,并检查数值解是否在所有返回的数据点的公差范围内。这需要了解许多分析问题,这些问题具有我想要不同求解器使用的所有属性(刚度,隐式问题等),而我却没有,至少没有超出我的头脑。

    此方法测试求解器方法的结果。因此,不能保证求解器实际上是有效的,只是不能解决给定的测试问题。因此,我怀疑需要大量测试问题才能放心地验证求解器是否正常工作。

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

    这种方法,在另一方面,只测试算法由我来说,这是很好的-如果别人已经证明,4 阶龙格库塔的作品,我不觉得一个迫切需要。但是,我确实担心制定测试用例会非常麻烦,因为我不知道一种生成测试数据的好方法(除了可能需要手工,否则很多工作……)。

根据我目前的知识,上述两种方法都对我造成严重的限制-我不了解第一个方法的一系列好的测试问题,也不了​​解第二个方法的良好生成方法。

还有其他方法可以验证数值ODE求解器吗?在实现方面还有其他标准需要验证吗?有没有很好的(免费)资源可以测试ODE求解器1

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

  1. 验证求解器是否可以按预期工作,以解决他们要解决的问题。换句话说,非刚性问题的求解器可以解决刚性问题,但应在非刚性问题上表现出色。同样,如果库中还有其他提供更高准确性的求解器,则可能不必强制执行非常准确的结果-只需“足够准确”即可。因此,我的问题的一部分是对哪些求解程序应使用哪些测试;或至少应该如何决定这一点。

  2. 安装磁带库后进行完整性测试。这些测试不必(不应)详尽或费时;只是可以在5秒钟内运行的最基础知识,但是如果有些东西太奇怪了,这将提醒用户。因此,我还需要一种构造测试的方法,该方法非常简单,但是仍然可以告诉我有关库状态的信息。


1是的,我一直在搜寻我的眼睛,但是我发现的大部分内容都是带有非常琐碎示例的讲义,但值得注意的是Bari的CWI ODE测试集例外,我不知道我是否或如何做。可以用于我的目的,因为它比我要测试的解决方案更复杂。


2
@ user75064:绝对!我什至不知道该站点甚至存在=)任何mod,请随时将我迁移到那里。
Tomas Aschan

Math Stack Exchange上的此答案中有指向其他测试集的链接。
Geoff Oxberry

@GeoffOxberry:我之前已经找到了其中几个。它们中的大多数都是在FORTRAN中实现的,并且假定读者希望使用相同的语言来测试求解器,这增加了另一个错误源...但是,事实证明,一对夫妇(DETEST套件中的文章)确实有用。非常感谢!
Tomas Aschan

Answers:


12

这是一个非常广泛的问题,我将为您提供一些要考虑的事情(您的帖子中已经包含了一些内容,但是为了完整起见,在此重复它们)。

问题范围

  • 您需要定义如何指定问题的接口。
  • 您是否要允许固定的参数或因解决方案而异的参数?
  • ϵ
  • 您要允许无限精度吗?
  • 您要测试速度和对数值精度的敏感性吗?
  • 您是否已经选择了两个(也许更多)库来比较结果?
  • 您将如何选择停止标准,将使用各种方法并让用户选择或定义自己的方法?
  • 您是否打算使用各种措施来测量错误并允许用户打开和关闭这些错误?
  • 您是否看过像计算机代数系统(CAS)这样的专业软件包,并了解它们允许的所有选项?
  • 您是否要允许显示结果和/或比较和/或绘图?

问题建议

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

这不是唯一的。如果您看一下Dennis和Schnabel所著的“无约束优化和非线性方程的数值方法”,附录B,“测试问题”,您会发现它们是如何做到的。在开发出我所见过的最精美的一组算法文章之后,他们提出了一系列问题,这些问题使事情变得一发不可收拾。您必须在这里和那里进行调整!它们包括五个非常不同的病理性问题,这些问题使求解器的功能紧张。这告诉我,我们可以继续针对由于多种原因而无法处理的算法提出问题。注意,他们甚至从More',Garbow和Hillstrom借用了这组问题(您也可以查找该参考文献,也许还有其他参考文献可以用作参考)。

换句话说,这不是一件容易的事。您需要一个已知答案测试用例,该用例始终可以让您测试更新的有效性,并且不会破坏事物。也就是说,从低到高,从容易到困难,从可能到不可能等一系列可重复且广泛的问题。您还需要求解器无法处理的一系列问题,才能真正理解其局限性。


2

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

dudt=Au

检查中的错误

exp(tA)u0u^(t)

u^(t)

只是不要用您的时间步长之一来计算指数(即方法6令人怀​​疑):http : //www.cs.cornell.edu/cv/researchpdf/19ways+.pdf


只需说明一下:DE集成商被认为是“可疑的”,因为与缩放+平方相比,它们效率低下,并非由于准确性。
JM

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.