Search code examples
sympycomplex-numberslambdify

Sympy Complex Expression To Python Function


I found documentation for lambdify on the sympy website here: http://docs.sympy.org/dev/modules/utilities/lambdify.html

Trying examples with complex numbers seems to fall apart:

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)

Did I do something stupid or is this a Bug?


Solution

  • NumPy's log function requires complex dtype for negative real values, or else it returns nan. From the documentation:

    For real-valued input data types, log always returns real output. For each value that cannot be expressed as a real number or infinity, it yields nan and sets the invalid floating point error flag.

    To get what you want, either pass in a numpy array with dtype=complex, or pass in 0j, i.e., an explicitly complex typed 0. For other real values, pass in, for instance, 1.0+0j instead of 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)