Решение матричного дифференциального уравнения с помощью Mathematica - PullRequest
2 голосов
/ 25 января 2012

Мне нужно решить это уравнение в Mathematica:

d / dx v (x) = A . v (х)

здесь v - вектор столбца {v1(x),v2(x),v3(x),v4(x)} и A представляет собой матрицу 4 x 4 . Я хочу решить для функций v1, v2, v3, v4 с любыми начальными условиями. Диапазон значений x составляет от 0 до 1000.

Как написать код Mathematica для дифференциального уравнения этого типа, используя NDSolve?

Ответы [ 3 ]

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

Итак, если у вас какая-то ужасная матрица

A =  RandomReal[0.1, {4, 4}]; (* A horrible matrix *)

которое мы делаем антисимметричным (поэтому решение колебательное)

A = A - Transpose@A;

Определение вектора функций и их начальных условий

v[x_] := {v1[x], v2[x], v3[x], v4[x]};

init = v[0] == RandomReal[1, 4]

Тогда команда NDSolve выглядит как

sol = NDSolve[LogicalExpand[v'[x] == A.v[x] && init], 
        {v1, v2, v3, v4}, {x, 0, 1000}]

И решения могут быть нанесены с

Plot[Evaluate[v[x] /. sol], {x, 0, 1000}]

da plot


Обратите внимание, что приведенное выше дифференциальное уравнение является линейным уравнением первого порядка с постоянными коэффициентами, поэтому его просто решить с помощью экспоненциальной матрицы. Однако если матрица A была функцией x, то аналитические решения становятся сложными, но числовой код остается прежним.

Например, попробуйте:

A = RandomReal[1/10, {4, 4}] - Exp[-RandomReal[1/100, {4, 4}] x^2];
A = A - Transpose@A;

Которые могут производить решения типа

more

1 голос
/ 25 июня 2012

Я хотел сделать то же самое с матрицей, а не с вектором v. Пока уравнение для него можно прочитать правильно, не зная, что этот символ представляет вектор или матрицу, NDSolve выводит свой символ из начального условия, однако в случай, когда размерность переменной является явной:

M'[t]==a[t]*IdentityMatrix[2]+M[t]

это не удалось. «Обычным» решением является явное определение матрицы и ее выравнивание при выдаче в виде списка переменных.

Однако я пропустил эту проблему (и многие проблемы с синтаксисом релятексов), просто представляя избыточную переменную, единственной ролью которой является идентификационная матрица, но без представления списка (матрица - это 2-мерный список, поэтому Mathematica действует как при добавлении списков друг к другу , генерирующая ошибку):

eqn = {w'[t] == a[t]*identity[t] + w[t], a'[t] == 2, identity'[t] == {{0, 0}, {0, 0}}}
init={ w[0] == {{1, 2}, {2, 1}}, a[0] == 1, identity[0] == {{1, 0}, {0, 1}}}


sol = NDSolve[eqn&&init, {w, a, identity}, {t, 0, 1}]

Некоторые доказательства работы:

Plot[{Evaluate[w[t] /. sol][[1, 1, 1]], Evaluate[w[t] /. sol][[1, 1, 2]]}, {t, 0, 1}]
0 голосов
/ 25 января 2012

Попробуйте что-то вроде этого (у меня в домашней тетради нет Mathematica:))

NDSolve[Transpose[{v1[x],v2[x],v3[x],v4[x]}']=={{a11,a12,a13,a14},{a21,a22,a23,a24},{a31,a32,a33,a34},{a41,a42,a43,a44}}.Transpose[{v1[x],v2[x],v3[x],v4[x]}], {v1,v2,v3,v4},{x,0,1000}]

ps: вы можете переписать его другим способом, заменив свою запись в виде системы уравнений {v1'[х] == а11 * v1 [X] + а12 * v2 [X] + а13 * v3 [X] + а14 * v4 [х], v2' [х] == а21 * v1 [X] + а22 *v2 [x] + a23 * v3 [x] + a24 * v4 [x] и т. д.}} если хотите)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...