温馨提示:本文翻译自stackoverflow.com,查看原文请点击:python - Unexpected behaviour when parsing string with sympy

python - 使用sympy解析字符串时发生意外行为

发布于 2020-03-31 23:16:48

我正在尝试使用sympy执行方程的导数,但是,如果我手动编写方程,则导数是正确的;当我将方程式作为字符串传递时,输出错误。谁能解释我如何解决这个问题?我正在使用python 3.6和sympy 1.5.1。

>>>from sympy import *

>>>from operator import *

>>> x1 = symbols('x1')

>>> f = add(sin(x1), mul(x1, x1))

>>> diff(f, x1)

2*x1 + cos(x1)   ## Correct output

>>>> f = 'add(sin(x1), mul(x1, x1))'  ## Equation provided as string

>>>> diff(f, x1)

(Subs(Derivative(mul(_xi_1, x1), _xi_1), _xi_1, x1) + Subs(Derivative(mul(x1, _xi_2), _xi_2), _xi_2, x1))*Subs(Derivative(add(sin(x1), _xi_2), _xi_2), _xi_2, mul(x1, x1)) + cos(x1)*Subs(Derivative(add(_xi_1, mul(x1, x1)), _xi_1), _xi_1, sin(x1))  ## Wrong output

查看更多

提问者
Francesco
被浏览
36
CDJB 2020-01-31 20:09

发生这种情况是因为f = 'add(sin(x1), mul(x1, x1))'不是可以通过解析的有效数学方程parse_expr此函数旨在解析以数学语法(而不是Sympy函数)编写的方程式。为了使此函数特别正确地进行解析,您需要使用例如:

>>> f = 'sin(x1) +  x1^2'
>>> diff(f, x1)
2*x1 + cos(x1)

如果您确实需要使用该特定字符串,则可以使用eval()

>>> f = 'add(sin(x1), mul(x1, x1))'
>>> diff(eval(f), x1)
2*x1 + cos(x1)