如何测试数值分析程序?

时间:2020-03-05 18:40:46  来源:igfitidea点击:

是否有良好的在线资源可供我们创建,维护和考虑编写用于数值分析代码的测试例程?

我可以看到诸如测试矩阵乘法之类的局限性之一是显而易见的测试(例如以一个矩阵为标识)可能无法完全测试代码的功能。

同样,我们通常也要处理大型数据结构。有没有人对解决这个问题有一些好的想法,或者有指向好地方的指针?

解决方案

回答

查阅David Gries所著的《编程科学》一书。这是关于证明程序的正确性。如果我们想确保自己的程序是正确的(证明其正确性),那么这本书是一个很好的起点。

可能不完全是我们要找的东西,但这是计算机科学对软件工程问题的解答。

回答

听起来好像我们需要考虑至少以两种不同的方式进行测试:

  • 一些数值方法可以进行一些元思考。例如,可逆操作使我们可以设置测试用例,以查看结果是否在原始误差范围之内。例如,矩阵M乘以矩阵M *随机向量V的时间应再次导致V处于一定可接受的误差范围内。显然,该示例执行矩阵求逆,矩阵乘法和矩阵矢量乘法。我喜欢这样的链,因为我们可以生成很多随机的测试用例,并获得统计覆盖率,这是必须手动编写的口号。但是,它们不会孤立地执行单个操作。
  • 某些数值方法具有其错误的闭式表达式。如果可以使用已知解决方案设置情况,则可以比较解决方案和计算结果之间的差异,以寻找超出这些已知界限的差异。

从根本上讲,这个问题说明了很好地测试复杂方法需要大量领域知识的问题。特定参考文献将需要有关我们所测试内容的更多特定信息。我绝对建议我们至少手头有史蒂夫·耶格(Steve Yegge)的推荐书单。

回答

如果要进行矩阵计算,请使用LAPACK。这是经过很好测试的代码。数十年来,非常聪明的人一直在为此工作。他们对那些初学者永远不会想到的问题进行了深思。

通常,我建议两种测试:系统测试和随机测试。我所说的系统性是指探索极端情况等。如果我们能阅读源代码,这会有所帮助。通常,算法都有分支点:对于该范围内的数字,此方法进行计算,对于另一个范围内的数字,则进行其他方法计算,等等。测试值靠近任一侧的分支点,因为这是近似误差最大的地方。

随机输入值也很重要。如果我们合理地选择所有测试用例,则可以系统地避免一些我们没有意识到的问题。有时,即使我们没有要测试的确切值,我们也可以充分利用随机输入值。例如,如果我们有用于计算函数及其反函数的代码,则可以生成1000个随机值,并查看应用函数及其反函数是否使我们回到开始的位置。