7

我的模拟需要实现

np.log(np.cosh(x))

这会溢出 large x,即我收到RuntimeWarning: overflow encountered in cosh警告。原则上,随着对数减少所讨论的数字,在 的某个范围内xcosh应该溢出而不应该溢出log(cosh())

NumPy 中是否有任何解决方案,例如在精神上与np.log1p()函数相似?

提供更多信息:我知道使用 SymPy https://github.com/sympy/sympy/issues/12671的可能解决方案可能是符号 的,但是模拟应该很快,并且符号计算 AFAIK 可能会显着减慢它。

4

1 回答 1

8

的以下实现log(cosh(x))应该是数值稳定的:

import numpy as np

def logcosh(x):
    # s always has real part >= 0
    s = np.sign(x) * x
    p = np.exp(-2 * s)
    return s + np.log1p(p) - np.log(2)

解释:

对于实际值,您可以使用以下标识:

log(cosh(x)) = logaddexp(x, -x) - log(2)
             = abs(x) + log1p(exp(-2 * abs(x))) - log(2)

这在数值上是稳定的,因为参数exp总是非正数。对于复数,我们要求参数exp具有非正实部,我们通过使用-xwhenreal(x) > 0xelse 来实现。

于 2019-09-04T10:13:15.017 回答