scipy.special中的准确性警告

时间:2016-10-13 09:52:18

标签: python-2.7 scipy

我正在运行MCMC采样器,需要使用scipy.special.hyp2f1()计算每一步的超几何函数。

在我的网格上的某些点(我不关心),超几何函数的解决方案非常不稳定,SciPy会打印警告:

Warning! You should check the accuracy

这很烦人,超过1000个样本可能会减慢我的日常工作。

我尝试使用special.errprint(0)但没有运气,并且使用warnings模块和-W ignore标志禁用Python中的所有警告。

违规功能(从另一个文件调用)位于

之下
from numpy import pi, hypot, real, imag
import scipy.special as special

def deflection_angle(p, (x1, x2)):

    # Find the normalisation constant
    norm = (p.f * p.m * (p.r0 ** (t - 2.0)) / pi) ** (1.0 / t)

    # Define the complex plane
    z = x1 + 1j * x2

    # Define the radial coordinates
    r = hypot(x1, x2)

    # Truncate the radial coordinates
    r_ = r * (r < p.r0).astype('float') + p.r0 * (r >= p.r0).astype('float')

    # Calculate the radial part
    radial = (norm ** 2 / (p.f * z)) * ((norm / r_) ** (t - 2))

    # Calculate the angular part
    h1, h2, h3 = 0.5, 1.0 - t / 2.0, 2.0 - t / 2.0
    h4 = ((1 - p.f ** 2) / p.f ** 2) * (r_ / z) ** 2
    special.errprint(0)
    angular = special.hyp2f1(h1, h2, h3, h4)

    # Assemble the deflection angle
    alpha = (- radial * angular).conjugate()

    # Separate real and imaginary parts
    return real(alpha), imag(alpha)`

1 个答案:

答案 0 :(得分:0)

不幸的是,在参数空间的某些非平凡区域上,很难计算出hyp2f1。许多实现都会产生不准确或极其错误的结果。 Scipy.special努力至少监控收敛。另一种选择可以是任意精确实现,例如mpmath。但这些肯定会慢得多,所以MCMC用户要小心。

编辑:好的,这似乎与scipy版本有关。我在scipy 0.13.3上尝试了@ wrwrwr的例子,并且它再现了你看到的内容:“警告!你应该检查准确性”,无论errprint状态如何都会打印出来。但是,对开发版本做同样的事情,我得到了

In [12]: errprint(True)
Out[12]: 0

In [13]: hyp2f1(0.5, 2/3., 1.5, 0.09j+0.75j)
/home/br/virtualenvs/scipy_py27/bin/ipython:1: SpecialFunctionWarning: scipy.special/chyp2f1: loss of precision
  #!/home/br/virtualenvs/scipy_py27/bin/python
Out[13]: (0.93934867949609357+0.15593972567482395j)

In [14]: errprint(False)
Out[14]: 1

In [15]: hyp2f1(0.5, 2/3., 1.5, 0.09j+0.75j)
Out[15]: (0.93934867949609357+0.15593972567482395j)

所以,显然它在2013年到现在之间的某个时刻得到了修复。您可能希望升级scipy版本。