题
对于如何创建、维护和思考编写数值分析代码的测试例程,是否有任何好的在线资源?
我看到的测试矩阵乘法之类的限制之一是,明显的测试(例如用一个矩阵作为恒等式)可能无法完全测试代码的功能。
此外,事实上您通常也会处理大型数据结构。有没有人对解决此问题的方法有一些好主意,或者有一些值得一看的好地方?
解决方案
听起来好像您需要考虑至少以两种不同的方式进行测试:
一些数值方法允许进行一些元思考。例如,可逆运算允许您设置测试用例以查看结果是否在原始结果的可接受的误差范围内。例如,矩阵 M逆 乘以矩阵 中号 * 随机向量 V 应该导致 V 再次,在一些可接受的误差范围内。
显然,这个例子练习了矩阵求逆、矩阵乘法和矩阵向量乘法。我喜欢这样的链,因为您可以生成相当多的随机测试用例并获得统计覆盖率,而这对于手动编写来说将是一个艰难的过程。不过,他们并不孤立地执行单一操作。一些数值方法有其误差的封闭式表达式。如果您可以使用已知解决方案设置情况,则可以比较解决方案与计算结果之间的差异,寻找超出这些已知界限的差异。
从根本上来说,这个问题说明了一个问题:良好地测试复杂方法需要相当多的领域知识。具体参考需要有关您正在测试的内容的更具体的信息。我肯定会建议你至少有 Steve Yegge 推荐书籍清单 手上。
其他提示
如果您要进行矩阵计算,请使用 LAPACK。这是经过充分测试的代码。非常聪明的人们已经为此努力了几十年。他们对外行人永远不会想到的问题进行了深入的思考。
一般来说,我建议两种测试:系统性和随机性。我所说的系统化是指探索边缘情况等。如果您可以阅读源代码,将会有所帮助。算法通常有分支点:对于该范围内的数字以这种方式计算,对于另一个范围内的数字以另一种方式计算,等等。测试靠近两侧分支点的值,因为那里的近似误差通常最大。
随机输入值也很重要。如果您理性地选择所有测试用例,您可以系统地避免一些您没有意识到的问题。有时,即使您没有要测试的确切值,也可以充分利用随机输入值。例如,如果您有计算函数及其反函数的代码,则可以生成 1000 个随机值,并查看应用该函数及其反函数是否能让您回到接近开始的位置。