如何根据不是 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 变量t
和sympy
的两边。我尝试在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
会将符号 x
和 y
视为常量。但是,我想要的理想结果应该和这样手动推导出的结果是一样的:
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
如何对表达式中包含非自由符号的特定符号进行导数运算?
您应该将 x
和 y
声明为函数而不是符号,例如:
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)))
我有如下等式,像这样:
y = 3x2 + x
然后,我想区分w.r.t 变量t
和sympy
的两边。我尝试在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
会将符号 x
和 y
视为常量。但是,我想要的理想结果应该和这样手动推导出的结果是一样的:
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
如何对表达式中包含非自由符号的特定符号进行导数运算?
您应该将 x
和 y
声明为函数而不是符号,例如:
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)))