我的模拟需要实现

np.log(np.cosh(x))

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

NumPy中是否有解决方案,例如在本质上类似于np.log1p()函数?

提供更多信息:我知道使用SymPy可能的解决方案可能是象征性的
https://github.com/sympy/sympy/issues/12671
但是,仿真应该很快,并且符号计算AFAIK可能会大大降低它的速度。

最佳答案

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的参数具有非正实数部分,我们可以通过使用-x来实现,否则使用real(x) > 0x来实现。

关于python - 避免日志溢出(cosh(x)),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57785222/

10-12 21:10