logo search
Для моделирования в Matlab и Scilab

Решение дифференциальных уравнений

MatLab предоставляет возможности для решения обыкновенных дифференциальных уравнений произвольного порядка и систем с начальными условиями, т.е. задачи Коши.

Решатели реализуют следующие методы решения систем дифференциальных уравнений, причем для решения жестких систем уравнений рекомендуется использовать только специальные решатели ode15s , ode23s, ode23t, ode23tb:

Несмотря на сравнительно низкую точность, этот метод может оказаться более эффективным, чем ode15s;

Все решатели могут решать системы уравнений явного вида у' = F(t, y). Решатели ode15s и ode23t способны найти корни дифференциально-алгебраических уравнений M(t)y' = F(t, у), где М называется матрицей массы. Решатели ode15s, ode23s, ode23t и ode23tb могут решать уравнения неявного вида M(t,y) у' = F(t, у).

В описанных далее функциях для решения систем дифференциальных уравнений приняты следующие обозначения и правила:

Этапы решения ОДУ:

1 Приведение дифференциального уравнения к системе дифференциальных уравнений первого порядка. Для этого вводится столько дополнительных функций, каков порядок уравнения.

2 Написание специальной файл-функции для системы уравнений. Файл-функция содержит два входных аргумента: переменную t, по которой производится дифференцирование, даже если она входит в уравнение неявно, и вектор, размер которого равен числу неизвестных функций системы.

3 Вызов подходящего солвера (встроенной функции). Входными аргументами солвера, в простом случае, являются имя файл-функции в апострофах, вектор с начальным и конечным значениями переменной

Покажем применение решателя ОДУ на ставшем классическом примере - решении уравнения Ван-дер-Поля, записанного в виде системы из двух дифференциальных уравнений:

y'1 = y2 ;

y'2 = Mu*(1 - y1^2)*y2 - y1;

при начальных условиях

y1(0) = 2;

y2(0) = 0;

Перед решением нужно записать систему дифференциальных уравнений в виде ode-функции. Для этого в главном меню выберем File > New > M-File и введем

function dydt = vanderpol(t, y)

global Mu

dydt = [y(2);

Mu*(1-y(1)^2)*y(2)-y(1)];

Сохраним m-файл-функцию. Тогда решение решателем ode45 и сопровождающий его график можно получить, используя следующие команды:

global Mu = 1;

tspan = [0, 20];

y0 = [2; 0];

[t,y] = ode45(@vanderpol, tspan, y0, [], Mu);

% Plot of the solution

plot(t,y(:,1))

xlabel('t')

ylabel('solution y')

title('van der Pol Equation, \mu = 1')

Решение решателем ode15s и его график можно получить, используя следующие команды:

tspan = [0, 3000];

y0 = [2; 0];

Mu = 1000;

[t,y] = ode15s(@vanderpol, tspan, y0, [], Mu);

plot(t,y(:,1))

title('van der Pol Equation, \mu = 1000')

axis([0 3000 -3 3])

xlabel('t')

ylabel('solution y')