【问题标题】:Sympy Complex Expression To Python FunctionSympy 复杂表达式到 Python 函数
【发布时间】:2016-06-01 00:34:40
【问题描述】:

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

我做了什么愚蠢的事情还是这是一个错误?

【问题讨论】:

  • 我结束了使用 complex() 将 .subs 结果包装并转换为本机“复杂”数字 -> 它很慢但可以工作

标签: sympy complex-numbers lambdify


【解决方案1】:

NumPy 的 log 函数要求负实数值的复杂 dtype,否则它返回 nan。来自documentation

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

为了得到你想要的,要么传入一个带有dtype=complex的numpy数组,要么传入0j,即明确的complex键入0。对于其他实数值,传入,例如@987654325 @ 而不是 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多