Симпийно-матричный дифференциал ОДУ - PullRequest
0 голосов
/ 25 августа 2018

Как я могу использовать Sympy для решения матричного дифференциального уравнения?

У меня есть уравнение вида y '(t) = A * y (t) + B, где A - матрица 3x3,y (t) - вектор 1x3, а B - вектор 1x3.

В частности, я работаю над проблемой компьютерной графики, которая использует дифференциальное уравнение для перемещения точек в 3D.У меня есть точка в трехмерном пространстве y (t), матрица вращения 3x3 и вектор перевода.Уравнение y '= Ay + B является упрощением реальной проблемы, над которой я работаю, но я не смог использовать Sympy для решения даже y' = Ay + B.Я ищу решение в закрытой форме (не числовой ответ) в Sympy.

Я знаю, как решить уравнение y '= Ay + B, но я хочу использовать Sympy, чтобы найти то же решение,а затем адаптировать код к более сложной проблеме, которую я пытаюсь решить.

Мой текущий код такой:

from sympy import *

y0 = Function('y0')
y1 = Function('y1')
y2 = Function('y2')
t = symbols(('t'))
b0,b1,b2 = symbols(('b0:3'))

y = Matrix([y0(t), y1(t), y2(t)])
B = Matrix([b0,b1,b2])

ode = Eq(y.diff(t), y)

soln = dsolve(ode, y0(t),y1(t),y2(t))

, но это вызывает ошибку Python

TypeError: cannot add <class 'sympy.matrices.immutable.ImmutableDenseMatrix'> and <class 'sympy.core.symbol.Dummy'>

В приведенном выше примере он использует еще более упрощенный пример y '= y + B, но даже это не работает.

Каков наилучший способ решения подобных проблем в Sympy?

1 Ответ

0 голосов
/ 25 августа 2018

dsolve ожидает плоские списки или плоские кортежи, а не матрицы. Чтобы преобразовать матрицу столбцов A в плоский список, можно использовать заклинание A.T.tolist()[0] - то есть транспонировать, превратить во вложенный список [[x, y, z]], затем взять 0-ую запись [x, y, z]. Итак, ваш код должен быть

ode = (y.diff(t) - y).T.tolist()[0]
soln = dsolve(ode, y.T.tolist()[0])

Обычно удобнее передавать разницу lhs-rhs вместо Eq(lhs, rhs), поэтому я сделал это.

К сожалению, вывод

[Eq(y0(t), C1*exp(t)), False, False] 

(как в 1.1.1, так и в 1.2), что, очевидно, является ошибкой. Решение линейных систем ODE с более чем двумя уравнениями в SymPy в настоящее время основано на неправильном понимании некоторыми студентами курса ODE, который они прошли. Этот PR исправит большинство этих проблем, но он заброшен.

...