gpt4 book ai didi

python - 何时使用 python 函数 expm1 而不是 exp-1

转载 作者:太空宇宙 更新时间:2023-11-04 02:36:44 26 4
gpt4 key购买 nike

expm1“函数避免了直接评估小 x 的 exp(x)-1 时涉及的精度损失。”

关于什么是小,是否有经验法则? 1e-1、1e-10、1e-100 ?(side Q:有没有性能或其他原因不总是使用expm1?)

np.info(np.expm1)
Examples
--------
The true value of ``exp(1e-10) - 1`` is ``1.00000000005e-10`` to
about 32 significant digits. This example shows the superiority of
expm1 in this case.

>>> np.expm1(1e-10)
1.00000000005e-10
>>> np.exp(1e-10) - 1
1.000000082740371e-10

最佳答案

简答

如果 6 位有效的小数位对您来说足够了,exp(x)-1 就可以了,直到 x 为 1e-10。通常,当 x 约为 10**(-N) 时,您将失去 N 位小数的精度。我们从大约 16 位 double 字开始。

为什么不总是使用expm1?因为 expm1(x) + 1exp(x) 相比绝对没有优势,无论 x 有多小。只有当您的计算实际上需要类似 exp(x) - 1 的东西时,才有意义使用 expm1。必须考虑更广泛的计算上下文。

长答案

这并不是关于 x 有多小,而是关于如何在您的计算中使用 exp(x)expm1 的目的应该在更广泛的 Loss of significance 上下文中理解.有些公式在某些参数范围内可能会失去意义;必须分析公式以查看它是否以及何时发生。如果在某个范围内可能失去显着性,请将公式重新编写为代数等价但数值稳定的东西。维基百科用二次方程的例子很好地解释了这一点。

如果您的目标是计算 exp(x)3*exp(x) + 4 等,您应该使用 exp。这里没有失去意义,将 expm1 放在这样的公式中也没有任何好处,无论 x 有多小。写 expm1(x) + 1 而不是 exp(x) 是完全没有意义的。

如果您的公式是 exp(x) - 1exp(x) - cos(x),那么小的 可能会失去意义x。这并不总是重写的理由;如果您只打算在 x 等于或大于 1 时使用此公式,则没有问题。如果您可以接受处于机器 epsilon 级别(1e-16 左右)的绝对错误,并且不太关心相对 错误,则没有问题。

当发生重要性损失时,由信息的最终用户决定可以接受多少损失。通常,获得 6 位有效数字对于实际用途来说已经足够了,因此失去 double 精度的 10 位十进制数字可能是可以接受的。在此上下文中,当 x 小于 1e-10 时,公式 exp(x) - 1 会导致 Not Acceptable 精度损失。事实上,exp(x) - 1 的值接近于 xexp(x) 看起来像 1.00000000... 有 10 个数字点为0后;所以 x 本身只剩下 6 位数字。

以数字上更安全的形式重写函数需要一些人工努力,以计算出所需的任何代数或三角恒等式。这种重写的例子:

f = lambda x: np.exp(x) - np.cos(x)
g = lambda x: np.sqrt(x**2 + 1) - 1

上面的数字更安全的形式:

f_safe = lambda x: np.expm1(x) + 2*np.sin(x/2)**2 
g_safe = lambda x: x / (np.sqrt(x**2 + 1) + 1)

重写 np.exp(x) - np.cos(x)np.expmp(x) - np.cos(x) + 1 没有完全受益;必须仔细考虑整个计算,以消除几乎相等数字的减法。

关于python - 何时使用 python 函数 expm1 而不是 exp-1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47725508/

26 4 0