Преобразование векторного уравнения в список уравнений в Mathematica
В силу синтаксиса DSolve системы дифференциальных уравнений должны быть заданы в виде списков уравнений, а не как векторное уравнение (в отличие от Solve, которое принимает оба).
Итак, мой простой вопрос - как преобразовать векторное уравнение, например:
{f'[t],g'[t]}=={{a,b},{c,d}}.{f[t],g[t]}
В список уравнений:
{f'[t]==a*f[t]+b*g[t],g'[t]==c*f[t]+d*g[t]}
Я думаю, что я знал, как только ответ, но я не могу найти его сейчас, и я думаю, что он может принести пользу и другим.
Ответы
Ответ 1
Попробуйте использовать Thread:
Thread[{f'[t], g'[t]} == {{a, b}, {c, d}}.{f[t], g[t]}]
(* {f'[t] == a f[t] + b g[t], g'[t] == c f[t] + d g[t] *)
Он принимает оператор равенства ==
и применяет его к каждому элементу в списке с тем же Head
.
Ответ 2
Стандартный ответ на этот вопрос заключается в том, что Бретт представил,
т.е. используя Thread
.
Однако я нахожу, что для использования в DSolve
, NDSolve
и т.д. Лучше использовать команду LogicalExpand
.
eqn = {f'[t], g'[t]} == {{a, b}, {c, d}}.{f[t], g[t]};
LogicalExpand[eqn]
(* f'[t] == a f[t] + b g[t] && g'[t] == c f[t] + d g[t] *)
Он не преобразовывает векторное уравнение в список, но он более полезен, поскольку он автоматически выравнивает уравнения матрицы/тензора и комбинации векторных уравнений.
Например, если вы хотите добавить начальные условия к вышеупомянутому дифференциальному уравнению, вы должны использовать
init = {f[0], g[0]} == {f0, g0};
LogicalExpand[eqn && init]
(* f[0] == f0 && g[0] == g0 &&
f'[t] == a f[t] + b g[t] && g'[t] == c f[t] + d g[t] *)
Примером матричного уравнения является
mEqn = Array[a, {2, 2}] == Partition[Range[4], 2];
Использование Thread
здесь неудобно, вам нужно применить его несколько раз и Flatten
результат. Использование LogicalExpand
легко
LogicalExpand[mEqn]
(* a[1, 1] == 1 && a[1, 2] == 2 && a[2, 1] == 3 && a[2, 2] == 4 *)