使用sympy解析字符串时出现意外行为

问题描述 投票:2回答:2

我正在尝试使用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
python python-3.x math sympy symbolic-math
2个回答
0
投票

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

parse_expr

如果确实需要使用特定的字符串,则可以使用>>> f = 'sin(x1) + x1^2' >>> diff(f, x1) 2*x1 + cos(x1)

eval()

0
投票

如果要以这种方式编写它,请确保使用实际的SymPy对象名称(大写)。我使用>>> f = 'add(sin(x1), mul(x1, x1))' >>> diff(eval(f), x1) 2*x1 + cos(x1) 来解释表达式,这与任何函数都可以做到这一点:

S(...)

但是您也可以使用数学运算符>>> S('Add(sin(x1), Mul(x1, x1))') x1**2 + sin(x1) +

*
© www.soinside.com 2019 - 2024. All rights reserved.