用非常接近 1 的数字计算 atanh

Calculate atanh with numbers very close to 1

提问人:Tomaz 提问时间:3/26/2023 最后编辑:MvGTomaz 更新时间:4/2/2023 访问量:117

问:

我需要非常精确地计算反双曲正切。所讨论的等式是 where 应该在 240 的量级,并返回近似值 -276.65。-atanh(1/ (1 + 10**-x))x

我尝试了 python 提供的一些库,例如 numpy、math 和 mpmath,但是,我可以使用的最大“x”值是 17。对于大于 17 的“x”,我收到 -inf 或域错误。

Python 数学 精度

评论

2赞 cards 3/26/2023
你能提供一些代码吗?
0赞 Code-Apprentice 3/26/2023
当我尝试 和 时,我收到一个错误 (-inf'.x = 240-atanh(1/ (1 + 10**-x))ValueError: math domain error), not
1赞 chepner 3/26/2023
10**-240小于 ,这意味着您的分母将是 1。sys.float_info.epsilon
3赞 ProfDFrancis 3/26/2023
从定义函数开始。你的意思是 A) 弧余切吗?即反共切,cot^-1,B)反正切?即 atan 或 tan-1,C) atanh,反双曲正切,这是您的公式使用的。请完整地写出来,举一个明确的例子,说明(x的值是合理的,例如4),你期望什么值。然后,人们将能够检查他们对您所问内容的理解。

答:

2赞 MvG 3/26/2023 #1

您所需要的只是 https://en.wikipedia.org/wiki/Hyperbolic_functions

你有但是.所以代替你可以写.tanh(x) = sinh(x)/cosh(x)coth(x) = cosh(x)/sinh(x)artanh(1/(1+ε))arcoth(1+ε)

然后你可以用对数来表示。在维基百科上,您可以找到.所以成为.arcoth(x) = ½ ln((x+1)/(x-1))arcoth(1+ε)½ ln((2+ε)/ε)

这是你可以输入到 Python 中的东西。记住你在整个表达式前面有一个负号,你可以把它写成

eps = 10**(-x)  # e.g. eps = 1e-240
res = -0.5 * math.log((2 + eps)/eps)

如果 eps 和你指示的一样小,分子将四舍五入,但分母应该有足够的精度来使整个事情正常工作。它适用于您的示例:我得到了正确的结果更像(在 Sage 中使用计算以获得数字误差的保证),因此我们从双精度算术中获得的所有数字都几乎是正确的。2-276.6567847495655-276.65678474956545473686759RealIntervalField(1024)