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)
我在 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)