我正在编写一个涉及变分微积分问题的一些近似值的库。每当我实施例程来评估动作函数的导数或 Hessian,我写了一个测试来检查这些是否正常工作。为此,我评估了使用动作的一阶和二阶导数计算目标函数的局部二次逼近的误差:
并检查不为对于一些足够大的.
这适用于中等大小(最多 16 个左右),但对于太大,截断误差开始占主导地位,近似误差变得更糟。
面对截断误差,测试导数近似的好方法是什么?
在我看来,我只有不好的选择:
- 编写打印近似误差的测试的初始版本,找到截断错误接管,然后使用这个作为单元测试最终版本的截止点。
- 有某种方法可以自动诊断截断错误接管的位置,然后丢弃所有结果。
- 不要让我的单元测试返回失败,除非它真的很明显。绘制结果并让用户决定。
- 通过分析确定可能发生截断错误的位置。
我不喜欢选项 1,因为这感觉就像是在挑选我的测试以便它们通过。我不喜欢选项 2,因为真正失败的实现的固有数学错误可能会被错误地评估为截断错误,因此自动回归测试会错过该错误。以这种速度,我必须手动检查结果,在这种情况下,我不妨选择选项 3。但我不喜欢选项 3,因为我想要自动化测试。我认为选项 4 对于单个变量的函数是实用的——评估其中是机器 epsilon 为您提供了一个很好的上限 - 但对于未知数是具有数千个变量的字段的大型 PDE 问题,不是那么多。