我即将开始研究数值 ODE 求解器的软件库,并且我正在为如何为求解器实现制定测试而苦苦挣扎。我的目标是,该库最终将包含非刚性和刚性问题的求解器,以及至少一个隐式求解器(或多或少与Matlab中ode
例程的功能相当),因此测试方法需要反映各种不同求解器的问题类型和标准。
我现在的问题是我不知道从哪里开始这个测试。我可以想出几种不同的方法来测试算法的输出:
测试具有解析解的问题,并检查数值解是否在所有返回数据点的容差范围内。这需要了解一些分析问题的知识,这些问题展示了我希望不同求解器处理的所有属性(刚度、隐含问题等),这些我没有,至少我没有想到。
此方法测试求解器方法的结果。因此,不能保证求解器确实有效,只保证它适用于给定的测试问题。因此,我怀疑需要大量测试问题才能自信地验证求解器是否有效。
使用我打算实现的算法手动计算几个时间步的解,然后对求解器执行相同的操作并检查结果是否相同。这不需要知道问题的真正解决方案,但反过来需要大量的动手工作。
另一方面,这种方法只测试算法,这对我来说很好 - 如果其他人已经证明 4阶Runge-Kutta 有效,我不觉得迫切需要这样做。但是,我确实担心制定测试用例会非常麻烦,因为我不知道生成测试数据的好方法(除了可能是手工,这将是很多工作......)。
就我目前的知识而言,上述两种方法都对我有严重的限制——我不知道第一个的一组好的测试问题,我也不知道为第二个生成测试数据的好方法。
还有其他方法可以验证数值 ODE 求解器吗?是否还有其他应该验证的实施标准?有没有关于测试 ODE 求解器的好的(免费)资源1?
编辑:
由于这个问题非常广泛,我想澄清一点。我要创建的测试套件将满足两个主要目的:
验证求解器是否按预期工作,以解决他们要解决的问题。换句话说,非刚性问题的求解器可以在刚性问题上大放异彩,但在非刚性问题上应该表现良好。此外,如果库中有其他求解器可以提供更高的精度,则可能不需要强制执行非常准确的结果 - 只需“足够准确”即可。因此,我的部分问题是什么测试应该用于什么求解器;或者,至少,一个人应该如何做出决定。
安装库时的健全性测试。这些测试不需要(不应该)复杂或耗时;只是可以在 5 秒内运行的非常基础的东西,但是如果某些东西很奇怪,它会提醒用户。因此,我还需要一种方法来构建非常简单的测试,但仍然可以告诉我有关库状态的一些信息。
1是的,我一直在用谷歌搜索,但我发现的大部分内容都是带有非常琐碎示例的讲义,除了来自 Bari 的 CWI ODE 测试集,我不知道我是否或如何可以用于我的目的,因为它处理的求解器比我要测试的求解器要复杂得多……