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

我正在尝试使用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),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,x1))*Subs(Derivative(add(sin(x1),x1)) + cos(x1)*Subs(Derivative(add(_xi_1,x1)),sin(x1))  ## Wrong output
GlacierZ 回答:使用sympy解析字符串时发生意外行为

之所以发生这种情况,是因为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),x1))'
>>> diff(eval(f),x1)
2*x1 + cos(x1)
,

如果要以这种方式编写它,请确保使用实际的SymPy对象名称(大写)。我用S(...)来解释表达式,这与任何函数都可以做的一样:

>>> S('Add(sin(x1),Mul(x1,x1))')
x1**2 + sin(x1)

但是您也可以使用数学运算符+*

>>> S('sin(x1) + x1*x1')
x1**2 + sin(x1)
,

您不应该将字符串直接传递给SymPy函数。相反,首先使用sympify解析它们(与S相同)。如果要将sympify之类的非标准名称映射到现有的SymPy名称(如

),则可以将名称词典作为add的第二个参数传递
sympify('add(x,y)',{'add': Add}) # Gives x + y

否则sympify将假定所有未知函数都是未定义的函数,例如f(x)。

本文链接:https://www.f2er.com/2678138.html

大家都在问