【问题标题】:How to test numerical analysis routines?如何测试数值分析程序?
【发布时间】:2010-09-06 04:43:41
【问题描述】:

有没有关于如何创建、维护和思考为数值分析代码编写测试例程的好的在线资源?

我可以看到测试矩阵乘法之类的限制之一是明显的测试(例如将一个矩阵作为单位)可能无法完全测试代码的功能。

此外,您通常还要处理大型数据结构。有没有人有一些关于如何解决这个问题的好主意,或者有指向好地方的指针?

【问题讨论】:

    标签: testing numerical


    【解决方案1】:

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

    1. 一些数值方法允许一些元思维。例如,可逆操作允许您设置测试用例以查看结果是否在原始可接受的错误范围内。例如,矩阵 M-inverse 乘以矩阵 M * 随机向量 V 应该再次导致 V,以在一些可接受的误差范围内。
      显然,这个例子练习了矩阵求逆、矩阵乘法和矩阵向量乘法。我喜欢这样的链,因为你可以生成相当多的随机测试用例并获得统计覆盖率,而这将是一个不得不手工编写的过程。不过,他们不会孤立地执行单一操作。

    2. 一些数值方法有一个错误的封闭式表达式。如果您可以使用已知解决方案设置情况,则可以比较解决方案和计算结果之间的差异,寻找超出这些已知范围的差异。

    从根本上说,这个问题说明了很好地测试复杂方法需要大量领域知识的问题。具体的参考资料需要关于您正在测试的内容的更具体的信息。我绝对建议您至少手头有Steve Yegge's recommended book list

    【讨论】:

      【解决方案2】:

      如果您要进行矩阵计算,请使用 LAPACK。这是经过良好测试的代码。几十年来,非常聪明的人一直在努力。他们深入思考了外行永远不会想到的问题。

      一般来说,我推荐两种测试:系统测试和随机测试。我所说的系统性是指探索边缘案例等。如果您可以阅读源代码,它会有所帮助。算法通常有分支点:以这种方式计算此范围内的数字,以另一种方式计算另一个范围内的数字,等等。靠近任一侧的分支点的测试值,因为那是近似误差通常最大的地方。

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

      【讨论】:

      • 如果你使用随机输入值,放置一个固定的种子是个好主意。这样,如果出现问题,您可以准确重现导致问题的值。
      【解决方案3】:

      查看David Gries 的一本书,名为The Science of Programming。这是关于证明程序的正确性。如果你想确保你的程序是正确的(以证明它们的正确性),这本书是一个很好的起点。

      可能不是您正在寻找的,但它是软件工程问题的计算机科学答案。

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 1970-01-01
        • 2022-08-08
        • 2017-11-24
        • 2022-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多