У меня есть следующее уравнение, например:
узнак равно3x2 + х
Затем я хочу отличить обе стороны от переменной 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
как константу. Однако идеальный результат, который я хочу, должен быть таким же, как результат, полученный вручную следующим образом:
узнак равно3x2 + х
д/дт (г)знак равнод/дт (3x2 + х)
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)
, и может возвращать значение 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)))
Можете ли вы объяснить больше для второй части? Из строки from sympy.abc import t
.
Вы всегда можете найти dy/dt
, даже если не можете изолировать y(t)
в выражении. Итак, если у вас просто есть связь между x(t)
и y(t)
, f(x(t),y(t)) = 0
значение y(t)
будет дано dydt = lambda f: Eq(y(t).diff(t), solve(f.diff(t), y(t).diff(t))[0])
.
Это аккуратное решение, спасибо.