scipy.special.ellipkinc中的错误 - 不完整的椭圆积分

时间:2014-04-15 12:43:48

标签: python scipy numerical-methods

在使用SciPy的scipy.special.ellipeincellipkinc时,似乎存在一些数值不稳定的岛屿。例如,

>>> from scipy.special import ellipkinc
>>> ellipkinc(0.9272952180016123, 0.68359375000000011)
nan
>>> ellipkinc(0.9272952180016123, 0.6835937500000002)
2.0518660200390668
>>> ellipkinc(0.9272952180016123, 0.68359375)
1.0259330100195332
>>> ellipkinc(0.9272952180016123, 0.68359374)
1.0259330081166262

这发生在k ^ 2.sin ^ 2(phi)接近0.3的情况下,但这里的椭圆积分本身并没有什么异常,所以可能它是一个数值的东西。我不太了解这个算法的内部工作原理来说明错误,那么我最好的选择是什么?我想到了: round(0.68359375000000011,8) 说,但这肯定会减慢我的代码?

1 个答案:

答案 0 :(得分:1)

(这是对问题的扩展评论,而不是对如何解决问题的答案。)

这看起来像ellipkinc中的错误。我得到一个浮点值,其中函数返回nan,以及四个相邻浮点值,其中函数返回两次"正确"值:

In [91]: phi = 0.9272952180016123

In [92]: mbad = 0.68359375000000011

In [93]: m = np.nextafter(mbad, 0)

In [94]: mvals = []

In [95]: for j in range(10):
   ....:     mvals.append(m)
   ....:     m = np.nextafter(m, 1)
   ....:     

In [96]: mvals
Out[96]: 
[0.68359375,
 0.68359375000000011,
 0.68359375000000022,
 0.68359375000000033,
 0.68359375000000044,
 0.68359375000000056,
 0.68359375000000067,
 0.68359375000000078,
 0.68359375000000089,
 0.683593750000001]

In [97]: ellipkinc(phi, mvals)
Out[97]: 
array([ 1.02593301,         nan,  2.05186602,  2.05186602,  2.05186602,
        2.05186602,  1.02593301,  1.02593301,  1.02593301,  1.02593301])