我需要计算数量
1/tanh(x) - 1/x
对于x> 0,其中x可以非常小而且非常大.
渐渐地对于小x,我们有
1/tanh(x) - 1/x -> x / 3
对于大x
1/tanh(x) - 1/x -> 1
无论如何,在计算表达式时,已经从10 ^ -7和更小的舍入误差导致表达式被评估为0:
import numpy
import matplotlib.pyplot as plt
x = numpy.array([2**k for k in range(-30, 30)])
y = 1.0 / numpy.tanh(x) - 1.0 / x
plt.loglog(x, y)
plt.show()
最佳答案 对于非常小的x,可以使用
the Taylor expansion of 1/tanh(x) - 1/x
around 0
,
y = x/3.0 - x**3 / 45.0 + 2.0/945.0 * x**5
误差为O(x ** 7),因此如果选择10 ^ -5作为断点,相对和绝对误差将远低于机器精度.
import numpy
import matplotlib.pyplot as plt
x = numpy.array([2**k for k in range(-50, 30)])
y0 = 1.0 / numpy.tanh(x) - 1.0 / x
y1 = x/3.0 - x**3 / 45.0 + 2.0/945.0 * x**5
y = numpy.where(x > 1.0e-5, y0, y1)
plt.loglog(x, y)
plt.show()