我正在尝试使用 SciPy 中的 Parabolic Cylinder D 函数,但在处理复杂的参数时遇到了问题。产生错误的示例代码是:
#!/usr/bin/env python
import numpy
import scipy.special as special
# test real numbers
test = 0.735759
A = test - special.pbdv(1,2)[0]
print A
# test complex numbers.
test = 9.43487e-16+1j*5.1361
A = test - special.pbdv(3,-1j)[0]
print A
我得到的错误是:
---> 19 A = test - special.pbdv(3,-1j)[0]
20 print A
21
TypeError: ufunc 'pbdv' not supported for the input types, and the inputs could not be
safely coerced to any supported types according to the casting rule ''safe''
From the documentation看起来该函数根本没有定义为使用复杂的参数。其他 scipy 函数(如 Bessel 函数 jv)明确声明它们接受复杂的参数,因此我认为我对错误的理解没有错误。
我的后续问题:Python 中是否有接受复杂参数的抛物线圆柱 D 函数的实现?我尝试从 Abramowitz and Stegun 构建自己的但我似乎无法让它与 Mathematica 一致。如有建议,我们将不胜感激。我的谷歌技能没有发现任何东西。
编辑: Question is similar to the question here .
我仍然不明白为什么该函数的 scipy 实现不接受复杂参数,而幕后的所有函数都接受复杂参数。
我设法获得 Abramowitz and Stegun 中定义的函数在职的。我不确定我之前的尝试出了什么问题。我确信有更好的方法来编写该函数,但这是我在 python 中使用 Parabolic Cylinder D 函数处理复数值的实现:
import numpy
import scipy.special as special
PI = numpy.pi
def y1(a,z):
return numpy.exp(-0.25*(z**2.0))*special.hyp1f1(0.5*a+0.25,0.5,0.5*(z**2.0))
def y2(a,z):
return z*numpy.exp(-0.25*(z**2.0))*special.hyp1f1(0.5*a+0.75,1.5,0.5*(z**2.0))
def U(a,z):
zeta = 0.5*a+0.25
return (1/numpy.sqrt(PI))*(1/(2.0**zeta))*(numpy.cos(PI*zeta)*special.gamma(0.5-zeta)*y1(a,z) \
-numpy.sqrt(2)*numpy.sin(PI*zeta)*special.gamma(1-zeta)*y2(a,z))
def ParabolicCylinderD(v,z):
b = -v-0.5
return U(b,z)
编辑:如果索引为负,则此方法不起作用。不知道为什么。我已经转向上面沃伦对 MPmath 的建议。它的速度足以满足我的需求。
我是一名优秀的程序员,十分优秀!