Python SciPy抛物柱面D与复变元

Python SciPy抛物柱面D与复变元,python,numpy,math,scipy,Python,Numpy,Math,Scipy,我试图使用SciPy的抛物线柱面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 -

我试图使用SciPy的抛物线柱面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''
看起来函数的定义并不是为了处理复杂的参数。其他scipy函数(如Bessel函数jv)明确表示它们接受复杂参数,因此我认为我对错误的理解没有错

我的后续问题:python中是否有接受复杂参数的抛物线柱面D函数的实现?我试着用它来构造我自己的,但我似乎无法使它与Mathematica相一致。如有建议,将不胜感激。我的谷歌技能没有发现任何东西

编辑:
.

我仍然不明白为什么函数的scipy实现不接受复杂参数,所有的函数都接受复杂参数

我设法在working中定义了函数。我不确定我以前的尝试有什么问题。我确信有更好的方法来编写函数,但下面是我在python中使用抛物线柱面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。它的速度足够快,可以满足我的需要。

FWIW:
mpmath
有几种抛物线柱面函数,包括
pcfd(n,z)
,它接受复数
z
。虽然速度很慢,但由于它是mpmath的一部分,您可以将精度提高到您喜欢的程度(或者有足够的耐心)。如果没有其他问题,您可以使用它来检查您的实现。