对于我的一个项目,我需要反复评估涉及一般超几何函数的表达式。虽然SciPy不支持通用的HypGeo功能,但MPMath可以。但是,使用mp.hyper(..)
非常耗时。所以我决定使用他们的快速精确库函数fp.hyper(..)
。不幸的是,这种行为似乎完全不同。我的例子如下:
from mpmath import mp, fp
from math import sin, cos, pi
H = 0.2
k = 2
A = 4 * sqrt(H) / (1 + 2 * H)
B = 4 * pi / (3 + 2 * H)
C = H/2 + 3/4
f_high = lambda t: (B * k * t * sin(pi * k) *
mp.hyper([1], [C+1/2, C+1], -(k*pi*t)**2) +
cos(pi * k) * mp.hyper([1], [C, C + 1/2],
-(k*pi*t)**2)) * A * t**(H + 1/2)
f_low = lambda t: (B * k * t * sin(pi * k) *
fp.hyper([1], [C+1/2, C+1], -(k*pi*t)**2) +
cos(pi * k) * fp.hyper([1], [C, C + 1/2],
-(k*pi*t)**2)) * A * t**(H + 1/2)
第一个图显示fp.plot(f_high,[0,1])
,第二个图显示fp.plot(f_low,[0,1])
。如果有人想知道:这些功能看起来很难看,但是一个是另一个的副本,只有mp
被fp
取代,所以他们没有任何其他方式的区别。
我也将它绘制在Mathematica中,图片更像是上面的(高精度)。
看起来fp.hyper
功能的执行有误,对吗?
答案 0 :(得分:1)
fp
的{{3}}表示(强调添加):
由于中间舍入和消除误差,使用fp算法计算的结果可能比使用等效精度(mp.prec = 53)使用mp计算的结果精确得多,因为后者通常使用增加的内部精度。准确性高度依赖于问题:对于某些函数,fp几乎总是给出14-15个正确的数字;对于其他人来说,结果可以精确到只有2-3位甚至完全错误。因此,fp的推荐用途是加速大规模计算,其中可以预先在输入集的子集上验证准确性,或者可以在之后验证结果。
如果fp
只是mp
的替代品,计算速度更快且没有缺点,那么mp
就没有理由存在。在这种情况下,似乎fp
不适合您的任务,因此您必须使用mp
。