首页 > 解决方案 > numpy 的 allclose 函数中的 rtol 是什么?

问题描述

其中numpy.allclose()有两个容差因素用于确定两个阵列是否足够接近以计为相同。有相对容差rtol和绝对容差atol。从文档

numpy.allclose(a, b, rtol=1e-05, atol=1e-08)

同样来自文档:

如果以下等式按元素为 True,则 allclose 返回 True。
绝对(a - b)<=(atol + rtol * 绝对(b))

数学上我理解这一点,但我对rtol. 为什么不只使用一个公差值tol,如果|a-b| < tol,则返回False?显然,按照上面的等式,我可以通过设置rtol为零来手动执行此操作,从而使所有内容都对称。对称破坏rtol因子的意义何在?

相关问题
allclose() 如何工作?

标签: pythonnumpy

解决方案


令人困惑的部分是该等式显示了同时使用的两个参数。改为这样看:

  • 用例 1:绝对公差 ( atol)absolute(a - b) <= atol
  • 用例 2:相对容差 ( rtol)absolute(a - b) <= rtol * absolute(b)

使用单个公差参数实现两者的另一种方法是添加一个标志,该标志确定公差是相对的还是绝对的。在数组值既可以大又可以为零的用例中,像这样分离用例会被破坏。如果只有一个数组可以有零,则制作该数组a并使用不对称方程对您有利,而无需atol. 如果其中任何一个都可以有零,只需将rtol大元素设置为某个可接受的值,然后设置atol为您想要用于零的值。

您通常希望使用rtol: 由于数字和计算的精度非常有限,因此较大的数字几乎总是不如较小的数字精确,并且差异呈线性比例(再次,通常)。您唯一使用atol的是非常接近零的数字,以至于舍入误差可能大于数字本身。

另一种看待它的方法是atol比较固定小数位,同时rtol比较有效数字。


推荐阅读