2014-06-16 101 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)