2012-01-25 2 views
2

мне нужно решить это уравнение в Mathematica:Решение дифференциального матричного уравнения с Mathematica

д/дх v (х) = . против (х)

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

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

+0

может быть, стоит задать этот вопрос здесь: http://mathematica.stackexchange.com –

+1

Спасибо Доммер! – Mush

ответ

7

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

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

которые мы делаем анти-симметричным (так что решение является колебательный)

A = A - [email protected]; 

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

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 - [email protected]; 

который может производить решения, как

more

+0

ничего себе! Thaaaaanks много! отличная работа :) Моя ужасная матрица - это функция от x. Слава богу, вы сказали, что числовой код остается прежним! : P Необходимо еще одно предложение. Можете ли вы назвать меня хорошей книгой для математики? – Mush

+0

@Mush: твердая и недавняя книга [Mathematica In Action] (http://www.amazon.com/dp/0387753664/). Но документация Mathematica также очень хороша, там много скрытых драгоценных камней. Наконец, есть этот сайт - некоторые хорошие программисты Mathematica здесь (в том числе несколько сотрудников WRI). См. Большой список, опубликованный по адресу http://stackoverflow.com/q/8672115/421225 – Simon

+0

@Mush: Кстати, если мое сообщение ответило на ваш вопрос, не забудьте нажать кнопку галочки, чтобы принять его. – Simon

0

Попробуйте что-то вроде этого (я не 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}] 

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

+0

Спасибо Черри. Но моя матрица ** А ** ужасна. я не могу положить его элементы a11, a22 ... вручную :(После некоторой операции я получаю матрицу, поэтому мне нужно использовать этот результат напрямую. будет ли она работать хорошо, если просто написать A вместо элементов?: -s – Mush

+0

@ Mush Попробуйте это как в моем первом примере - я буду ближе к Mathematica только завтра :) И если у вас есть матрица A, вам не нужно переписывать ее элементы - вы можете получить к ним доступ напрямую, например A [[1]] [[2 ]] даст вам a12 – Cheery

+0

ой! Большое спасибо ! Я попробую это :) – Mush

1

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

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

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

Однако я пропустил эту проблему (и многие проблемы с синтаксисом relatex), просто представив reduntant переменную, которая должна быть только идентификационной матрицей, но без введения списка (матрица является 2d-списком, поэтому 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}] 
Смежные вопросы