2014-04-15 14 views
3

在使用SciPy的的scipy.special.ellipeincellipkinc,似乎有數值不穩定的一些島嶼。例如,的Bug scipy.special.ellipkinc - 不完整的橢圓積分

>>> 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

我建議你改變問題的標題做了一下更具體。 – NPE

+0

我創建了一個錯誤報告:https://github.com/scipy/scipy/issues/3550 –

回答

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])