2016-07-28 15 views
1

Ich versuche, die Parabolic Zylinder D Funktion von SciPy zu verwenden und habe Probleme mit komplexen Argumenten. Beispielcode, den Fehler zu erzeugen ist:SciPy Parabolic Zylinder D und komplexe Argumente

#!/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 

Der Fehler, den ich bekommen ist:

---> 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 sieht es aus wie die Funktion einfach nicht mit komplexen Argumenten arbeiten definiert. Andere scipy-Funktionen (wie die Bessel-Funktion jv) geben ausdrücklich an, dass sie komplexe Argumente akzeptieren, daher glaube ich nicht, dass ich falsch liege, wenn ich den Fehler lese.

Meine Follow-up-Frage: Gibt es eine Implementierung der parabolischen Zylinder-D-Funktion in Python, die komplexe Argumente akzeptiert? Ich habe versucht, mein eigenes aus Abramowitz and Stegun zu konstruieren, aber ich kann nicht scheinen, es mit Mathematica zu vereinbaren. Vorschläge würden geschätzt werden. Meine Google-Fähigkeiten haben nichts aufgedeckt.

Bearbeiten: Question is similar to the question here.

+0

FWIW: 'mpmath' hat mehrere Varianten parabolischer Zylinderfunktionen, einschließlich' pcfd (n, z) ', die komplexes' z' akzeptiert. Es ist ziemlich langsam, aber da es Teil von 'mpmath' ist, können Sie die Präzision erhöhen, um so hoch zu sein, wie Sie möchten (oder die Geduld haben). Wenn nichts anderes, könnten Sie es verwenden, um Ihre Implementierung zu überprüfen. –

Antwort

1

Ich verstehe immer noch nicht, warum die scipy Implementierung der Funktion komplexe Argumente nicht akzeptiert, alle Funktionen unter der Haube akzeptieren komplexe Argumente.

Ich habe es geschafft, die in Abramowitz and Stegun definierte Funktion zu erhalten. Ich bin nicht sicher, was mit meinen früheren Versuchen falsch war. Ich bin sicher, es gibt einen besseren Weg, um die Funktion zu schreiben, aber hier ist meine Umsetzung der Parabolic Zylinder D-Funktion in Python für komplexe Werte für die Verwendung:

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) 

Edit: Das funktioniert nicht, wenn der Index negativ ist . Keine Ahnung warum. Ich habe zu Warrens Vorschlag von MPmath oben gewechselt. Es ist schnell genug für meine Bedürfnisse.