2016-06-01 26 views
2

ich Dokumentation für lambdify hier auf der sympy Website: http://docs.sympy.org/dev/modules/utilities/lambdify.htmlSympy Complex Ausdruck Python Funktion

Der Versuch, Beispiele mit komplexen Zahlen scheint auseinander zu fallen:

SympyExpression = sympy.parsing.sympy_parser.parse_expr('0.2*exp(1.6*I*pi*x)*log(x - 1.5)') 
print "\nSympyExpression.subs(sympy.Symbol('x'), 0.0):" 
print SympyExpression.subs(sympy.Symbol('x'), 0.0) 

PythonFunction = sympy.lambdify((sympy.Symbol('x')), SympyExpression, "numpy") 
print "\nPythonFunction(0.0):" 
print PythonFunction(0.0) 

>>>> SympyExpression.subs(sympy.Symbol('x'), 0.0): 
>>>> 0.0810930216216329 + 0.2*I*pi 

>>>> PythonFunction(0.0): 
>>>> /usr/lib/python2.7/dist-packages/numpy/__init__.py:1: RuntimeWarning: invalid value encountered in log 
>>>> """ 
>>>> (nan+nan*j) 

Habe ich etwas Dummes zu tun oder ist das ein Bug?

+0

Ich beendete das Wrapping und Casting der .subs Ergebnis auf eine native 'komplexe' Nummer mit komplexen() -> es ist langsam, aber es funktioniert –

Antwort

3

Die Protokollfunktion von NumPy erfordert komplexe dtype für negative reelle Werte, andernfalls gibt sie nan zurück. Von der documentation:

Für reellwertige Eingabedatentypen gibt log immer echte Ausgabe zurück. Für jeden Wert, der nicht als reelle Zahl oder Unendlichkeit ausgedrückt werden kann, ergibt er nan und setzt das ungültige Gleitkommafehler-Flag.

Zu bekommen, was Sie wollen, entweder mit dtype=complex in einem numpy Array übergeben, oder in 0j passieren, das heißt, ein explizit complex 0. Für andere reale Werte eingegeben hat, in übergeben, zum Beispiel, 1.0+0j statt 1.0.

In [36]: lambdify(x, 0.2*exp(1.6*I*pi*x)*log(x - 1.5), 'numpy')(0.0j) 
Out[36]: (0.081093021621632885+0.62831853071795862j)