我正在尝试使用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
发生这种情况是因为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)