2016-06-01 155 views
2

我发现文档中的sympy网站这里lambdify: http://docs.sympy.org/dev/modules/utilities/lambdify.htmlSympy复杂表达式到Python功能

与复数试图例子似乎分崩离析:

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) 

难道我做一些愚蠢或者是这是一个错误?

+0

我最终包装和铸造.subs导致到本机的“复杂”号使用复杂() - >它缓慢,但它的工作原理 –

回答

3

NumPy的日志函数需要复数的dtype表示负实数,否则返回nan。来自documentation

对于实值输入数据类型,日志始终返回实际输出。对于不能表示为实数或无穷的每个值,它将产生nan并设置无效浮点错误标志。

为了得到你想要的东西,无论是在numpy的数组传递与dtype=complex,或通过在0j,即一个明确complex键入0。对于其他的实际值,传递,例如,中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)