2016-06-01 93 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)