如何根据不是 SymPy 中表达式的自由符号的符号区分表达式?

How to differentiate a expression with respect to a symbol that is not a free symbol of the expression in SymPy?

我有如下等式,像这样:

y = 3x2 + x

然后,我想区分w.r.t 变量tsympy 的两边。我尝试在JupyterNotebook中的以下代码中实现它:

>>> import sympy as sp
>>> x, y, t = sp.symbols('x y t', real=True)
>>> eq = sp.Eq(y, 3 * x **2 + x)
>>>
>>> expr1 = eq.lhs
>>> expr1

>>> expr1.diff(t)
0
>>>
>>> expr2 = eq.rhs
>>> expr2
3^2+
>>> expr2.diff(t)
0

因此,sympy 会将符号 xy 视为常量。但是,我想要的理想结果应该和这样手动推导出的结果是一样的:

y = 3x2 + x

d/dt (y) = d/dt ( 3x2 + x)

dy/dt = 6 • x • dx/dt + 1 • dx/dt

dy/dt = (6x + 1) • dx/dt

如何对表达式中包含非自由符号的特定符号进行导数运算?

您应该将 xy 声明为函数而不是符号,例如:

In [8]: x, y = symbols('x, y', cls=Function)

In [9]: t = symbols('t')

In [10]: eq = Eq(y(t), 3*x(t)**2 + x(t))

In [11]: eq
Out[11]: 
          2          
y(t) = 3⋅x (t) + x(t)

In [12]: Eq(eq.lhs.diff(t), eq.rhs.diff(t))
Out[12]: 
d                 d          d       
──(y(t)) = 6⋅x(t)⋅──(x(t)) + ──(x(t))
dt                dt         dt  

https://docs.sympy.org/latest/modules/core.html#sympy.core.function.Function

或者,idiff 函数是为此目的而创建的,但它适用于像 f(x, y) 这样的表达式,并且可以 return dy/dx 的值。所以首先制作你的 Eq 和表达式,然后计算所需的导数:

>>> from sympy import idiff
>>> e = eq.rewrite(Add)
>>> dydx = idiff(e, y, x); dydx
6*x + 1

还要注意,即使在你的等式中(如果你根据 t 的函数明确地写它)你也不需要隔离 y(t) - 你可以微分和求解它:

>>> from sympy.abc import t
>>> x,y=map(Function,'xy')
>>> eq = x(t)*(y(t)**2 - y(t) + 1)
>>> yp=y(t).diff(t); Eq(yp, solve(eq.diff(t),yp)[0])
Eq(Derivative(y(t), t), (-y(t)**2 + y(t) - 1)*Derivative(x(t), t)/((2*y(t) - 1)*x(t)))