在Python中,如何使用数值稳定性评估xe^x/(e^x-1)?

在Python中,如何使用数值稳定性评估xe^x/(e^x-1)?,python,numerical-stability,Python,Numerical Stability,当x是非常正的还是非常负的时候,我如何评估数值稳定性在零附近的xe^x/(e^x-1)?我可以访问numpy和scipy中的所有常用数学函数 def f(x): if abs(x) > 0.1: return x*exp(x)/(exp(x)-1) else: return 1/(1.-x/2.+x**2/6.-x**3/24.) 如果需要更高的精度,最后一行中的扩展可以以明显的方式扩展,并且可以通过重新措辞来加快扩展速度。目前,它的错误高达1e-6。刚刚找到了scipy.spe

当x是非常正的还是非常负的时候,我如何评估数值稳定性在零附近的xe^x/(e^x-1)?我可以访问
numpy
scipy
中的所有常用数学函数

def f(x):
  if abs(x) > 0.1: return x*exp(x)/(exp(x)-1)
  else: return 1/(1.-x/2.+x**2/6.-x**3/24.)

如果需要更高的精度,最后一行中的扩展可以以明显的方式扩展,并且可以通过重新措辞来加快扩展速度。目前,它的错误高达1e-6。

刚刚找到了scipy.special.exprel,这将起作用。我还需要让我的代码处理Ano或tensorflow,所以一个更基本的解决方案会更好。令人沮丧的是,
np.expm1
似乎给出了
nan
,而不是
inf
。这使得
if
where
之类的事情更难避免。这似乎是一个,仍然是开放的。有一个不太大的值
z
,因此对于
x>z
表达式
x*exp(x)/(exp(x)-1)
的实际值非常接近
x
,然而,直接计算它会导致溢出和nan。这一点很好,@Leon。为了处理这种可能性,应分别处理
x>0.1
x<-0.1
的情况。如果
x>0.1
,则返回
x/(1-exp(-x))
;如果
x<-0.1
,则返回
x*exp(x)/(exp(x)-1)
;否则使用多项式近似。