我正在运行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)`
答案 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版本。