【发布时间】:2013-08-14 16:41:52
【问题描述】:
我需要计算 mpmath 的“mpf”浮点大数形式的小值的反正弦函数。
我所说的“小”值例如是 e/4/(10**7) = 0.000000067957045711476130884...
这是在我的机器上使用 mpmath 的内置 asin 函数进行测试的结果:
import gmpy2
from mpmath import *
from time import time
mp.dps = 10**6
val=e/4/(10**7)
print "ready"
start=time()
temp=asin(val)
print "mpmath asin: "+str(time()-start)+" seconds"
>>> 155.108999968 seconds
这是一个特殊情况:我处理的数字有点小,所以我问自己是否有一种方法可以在 python 中计算它,在这种特殊情况下实际上优于 mpmath(= 对于小值)。
Taylor 级数在这里实际上是一个不错的选择,因为它们对于小参数的收敛速度非常快。但我仍然需要以某种方式进一步加快计算速度。
其实有一些问题:
1)二进制拆分在这里无效,因为只有当您可以将参数写成一小部分时它才会发光。这里给出了一个全精度浮点数。
2) arcsin 是一个非交替序列,因此 Van Wijngaarden 或 sumalt 变换也无效(除非我不知道有一种方法可以将它们推广到非交替序列)。
https://en.wikipedia.org/wiki/Van_Wijngaarden_transformation
我能想到的唯一加速度是切比雪夫多项式。切比雪夫多项式可以应用于 arcsin 函数吗?怎么做?
【问题讨论】:
-
对于这么小的值,
asin(x)非常接近x(泰勒级数的第一项)。这还不够精确吗? -
math.asin(0.000000067957045711476130884) -> 6.795704571147619e-08即只有最后一个数字不正确。10^-22顺序的错误对您来说重要吗? -
简短的回答是否定的。如果您使用 10^6 位数字,则需要许多其他泰勒术语:对于 e/4/10^7,您仍然需要大约 62500 个系列术语。 @Bakuriu 我用作示例的数字是 mpmath 打印的数字。我不认为这是错误的。
标签: python trigonometry bignum taylor-series mpmath