2014-06-16 99 views
3
>>> import scipy.special 
>>> scipy.special.hankel1(0, 10**8) 
(3.2060295340412074e-05+7.3063911655217044e-05j) 
>>> scipy.special.hankel1(0, 10**9) 
(2.4687471886269185e-05-5.2104226538976152e-06j) 
>>> scipy.special.hankel1(0, 10**10) 
(nan+nan*j) 

我認爲這些例子將與Mathematica或MATLAB一起使用。但是我無法從scipy得到正確的結果。我不知道爲什麼,可能我犯了一些錯誤?爲什麼scipy.special.hankel1(0,10 ** 10)返回`nan`?

+1

您可將函數的計算期間運行到浮點限制。該代碼是一個FORTRAN算法,列在[here](https://github.com/scipy/scipy/blob/master/scipy/special/amos/zbesh.f)(至少,我認爲這是使用的算法) ,這確實提到了一些限制(儘管沒有適合你的)。也許用[scipy](https://github.com/scipy/scipy/issues?state=open)提出問題。請注意,我仍然可以這樣計算:'np.complex(jv(0,1e10),yv(0,1e10))'。 – Evert

+0

@Evert如何?-3621592938.02?用你的方法返回(6.210109276541645e-06 + nanj) – fronthem

+1

那麼,我沒有說我建議的是整體解決方案;這只是1e10案例中的解決方法。在使用新號碼時,可能'yv'與'hankel1'有類似的問題。我會接受scipy的人。 Mathematica和matlab可能運行的是比scipy使用的更新的代碼版本。 – Evert

回答

0

我不會認爲這是一個錯誤,而是一個功能。

你應該執行

scipy.special.errprint(1) 

然後你會發現啓用錯誤報告功能:

In : scipy.special.hankel1(0, 10**4) 
Out: (-0.0070961603533888007+0.0036478055589866053j) 

In : scipy.special.hankel1(0, 10**9) 
/usr/bin/ipython:1: SpecialFunctionWarning: scipy.special/hankel1:: loss of precision 
    #!/usr/bin/python3 
Out: (2.4687471886269192e-05-5.2104226538976127e-06j) 

In : scipy.special.hankel1(0, 10**10) 
/usr/bin/ipython:1: SpecialFunctionWarning: scipy.special/hankel1:: no result obtained 
    #!/usr/bin/python3 
Out: (nan+nan*j)