Sympy 复杂表达式到 Python 函数

Sympy Complex Expression To Python Function

我在 sympy 网站上找到了 lambdify 的文档: http://docs.sympy.org/dev/modules/utilities/lambdify.html

尝试复数的例子似乎失败了:

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)

我是不是做了什么傻事,或者这是一个错误?

NumPy 的 log 函数需要复杂的 dtype 来表示负实数值,否则它 returns nan。来自 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.

要得到你想要的,要么传入带有 dtype=complex 的 numpy 数组,要么传入 0j,即显式键入 0 的 complex。对于其他实数值,例如,传入 1.0+0j 而不是 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)