Решить матричное дифференциальное уравнение в Matlab - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь решить конкретную систему ODE dF/dt = A*F, F_initial = eye(9). Будучи новичком в Matlab, я пытаюсь каким-то образом использовать реализованную функцию ode45, и я нашел полезные советы в Интернете. Однако все они предполагают, что A является постоянной величиной, в то время как в моем случае матрица A является функцией t, другими словами, A изменяется с каждым шагом по времени.

Я решил A отдельно и сохранил его в массиве 9x9xN (потому что моя сетка t = 0:dt:2, N=2/dt - это количество временных шагов, а A(:,:,i) соответствует его значению на i-м шаг времени). Но я не могу реализовать этот массив в ode45, чтобы в конечном итоге решить мой ODE.

Любая помощь приветствуется, и, пожалуйста, скажите мне, если я пропустил что-то важное, объясняя свою проблему. Спасибо

1 Ответ

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

Прежде всего, F должен быть вектором столбца при использовании ode45. Вы никогда не получите результат, установив F_initial = eye (9), вам понадобятся F = единиц (9,1).

Кроме того, ode45 (документация здесь, проверьте секцию tspan) не обязательно оценивает вашу функцию на заданных вами временных шагах, поэтому вы не можете предварительно вычислить матрицу A. Здесь я собираюсь предположить, что F - это вектор-столбец, а A - это матрица, которая воздействует на него и может быть вычислена на каждом временном шаге. Если это так, то мы можем просто включить A в функцию, переданную ode45, например:

F_initial = ones(9,1);
dt = 0.01;
tspan = 0:2/dt:2;
[t, F] = ode45(@(t,F) foo(t, F, Ainput), tspan, F_initial);

function f = foo(t, F, Ainput)
    A = calculate_A(t, Ainput);
    f = A*F;
end

function A = calculate_A(t, Ainput)
    %some logic, calculate A based on inputs and timestep
    A = ones(9,9)*sqrt(t)*Ainput;
end

@ (x) f (x, y) в основном создает новую анонимную функцию , которая позволяет вам рассматривать y как константу в вычислениях.

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

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