繁体   English   中英

Mpmath 超几何函数对高精度和低精度表现出不同的行为

[英]Mpmath hypergeometric function shows different behaviour for high & low precision

对于我的一个项目,我需要反复计算一个涉及一般超几何函数的表达式。 虽然 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,5

通过 fp.plot(f_low,[0,5

第一个图显示fp.plot(f_high,[0,1]) ,第二个图fp.plot(f_low,[0,1]) 如果有人想知道:这些函数看起来很丑,但一个是另一个的副本,只是mp替换为fp ,因此它们不可能有任何其他区别。

我也在 Mathematica 中绘制了它,图片更像上面的(高精度)。

貌似fp.hyper函数的实现有问题吧?

fp文档说(强调):

由于中间舍入和抵消误差,使用 fp 算术计算的结果可能比使用等效精度 (mp.prec = 53) 使用 mp 计算的结果准确得多,因为后者通常使用更高的内部精度。 准确性与问题高度相关:对于某些函数,fp 几乎总是给出 14-15 个正确的数字; 对于其他人,结果可能准确到只有 2-3 位数,甚至完全错误 因此,fp 的推荐用途是加速大规模计算,其中可以提前在输入集的子集上验证准确性,或者可以在之后验证结果。

如果fp只是一个简易替换为mp具有更快的计算,没有缺点,就没有理由mp存在。 在这种情况下, fp似乎不适合您的任务,因此您必须使用mp

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM