Преобразование векторного уравнения в список уравнений в Mathematica - PullRequest
10 голосов
/ 15 декабря 2010

Из-за синтаксиса 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]}

Я думаю, что когда-то знал ответ, но сейчас не могу его найти, и думаю, что это может быть полезно и другим.

Ответы [ 2 ]

13 голосов
/ 15 декабря 2010

Попробуйте использовать нить:

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.

6 голосов
/ 25 января 2012

Стандартный ответ на этот вопрос - тот, который Бретт представил, то есть, используя 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 *)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...