Насколько я знаю, SymPy не имеет функции, которая делает это напрямую, но это просто сделать вручную.
Я предполагаю, что вы всегда хотите, чтобы ваши два дополнительных уравнения имели форму y = x'
и z = y'
.
Во-первых, давайте создадим ODE (в SymPy выражения автоматически принимаются равными нулю, поэтому для упрощения вещей не будем беспокоиться о части = 0
). Я возьму вашу независимую переменную t
.
In [4]: t = symbols('t')
In [7]: x, y, z = symbols('x y z', cls=Function)
In [6]: ode = x(t).diff(t, t) - 2*x(t).diff(t) + x(t)
In [13]: ode = x(t).diff(t, 3) - 2*x(t).diff(t, t) + x(t).diff(t)
In [14]: ode
Out[14]:
2 3
d d d
──(x(t)) - 2⋅───(x(t)) + ───(x(t))
dt 2 3
dt dt
Теперь, если мы заменим x'
с y
,
In [15]: ode.subs(x(t).diff(t), y(t))
Out[15]:
2
d d
y(t) - 2⋅──(y(t)) + ───(y(t))
dt 2
dt
мы видим, что он также заменяет x''
с y'
. Так что давайте подставим y'
с z
:
In [16]: ode = ode.subs(x(t).diff(t), y(t)).subs(y(t).diff(t), z(t))
In [17]: ode
Out[17]:
d
y(t) - 2⋅z(t) + ──(z(t))
dt
Теперь наша система [x' y' z']
является
In [20]: Matrix([y(t), z(t), solve(ode, z(t).diff(t))[0]])
Out[20]:
⎡ y(t) ⎤
⎢ ⎥
⎢ z(t) ⎥
⎢ ⎥
⎣-y(t) + 2⋅z(t)⎦
Обратите внимание, что мы уже знаем, что x' = y
и y' = z
, поэтому мы используем только те, кто непосредственно, но мы используем solve()
, чтобы получить наш замещенного ОДУ в количестве z'
.
Если вы хотите коэффициенты, простой фокус в том, чтобы взять якобиан:
In [23]: M = Matrix([y(t), z(t), solve(ode, z(t).diff(t))[0]]).jacobian([x(t), y(t), z(t)])
In [24]: M
Out[24]:
⎡0 1 0⎤
⎢ ⎥
⎢0 0 1⎥
⎢ ⎥
⎣0 -1 2⎦
Я оставил задачу оборачивать это в единую функцию ode_to_system(ode, [x(t), y(t), z(t)])
в качестве упражнения для читателя.
попробуйте найти преобразования Лапласа или Z, которые обычно используются для этой цели. – Spektre
@Spektre Спасибо за примечание. Я не уверен, что здесь правильная идея преобразования Лапласа. Поэтому я хочу сказать, что дифференциальное уравнение второго или третьего порядка и преобразовать его в систему первого порядка. Я действительно хочу использовать инструмент компьютерной алгебры, такой как Sympy или Sage, чтобы я мог проверить свою собственную алгебру за ошибки. Использование преобразования Лапласа будет работать как метод решения уравнения, но я не уверен, что он преобразует однородное дифференциальное уравнение третьего порядка в систему дифференциальных уравнений первого порядка. Возможно, вы могли бы объяснить, что вы имеете в виду. – krishnab
добавлен ответ (это комментарий действительно, но в комментариях он будет нечитаемым) – Spektre