Описание системы ОДУ
Можно использовать m-файл типа odefunction (или m-file типа odefile для совместимости с прежними версиями, но последний случай мы рассматривать не будем, чтобы определить систему дифференциальных уравнений в одной из явных (первая формула) или неявных форм:
y'= F(t, у), My' = F(t, у) или M(t)y' = Y(t, у),
Где t – независимая переменная (скаляр), которая обычно представляет время; у – вектор зависимых переменных; F – функция от t и у, возвращающая вектор-столбец такой же длины как и у; М и М(£) – матрицы, которые не должны быть вырожденными. М может быть и константой.
Рассмотрим пример решения уравнения. Оно сводится к системе уравнений.
Подготовим m-файл ode-функции vdp.m:
function
[outl.out2.out3]
=
vdp(t.y.flag)
if
nargin
<
3
| isempty(flag)
outl
=
[
2
.
*
y(
2
).
*
(l
-
y(
2
).
^
2
)
-
y(
1
); y(
1
)];
else
switch
(flag)
case
'inlt'
% Return tspan .y0 and options
out1
=
[
0
20
];
out2
=
[
2
;
0
];
out3
=
[ ];
otherwise
error([
' Unknown request '
''
flag
''
'.'
]);
end
end
Тогда решение системы с помощью решателя ode23 реализуется следующими командами:
>
>
[T.Y]
=
ode23(@vdp.[
0
20
]. [
2
0
]);
Еще проще работать с решателями нового поколения. Рассмотрим систему уравнений:
y'+abs(y)=0; y(0)=0; у(4)=-2.
Для решения в пределах отрезка [0; 4] с помощью bvp4c достаточно привести эту систему к виду: y'=-abs(y), y(0)=0; у(4)+2=0. Затем – создаем две ode-функции: twoode и twobc в разных m-файлах:
function
dydx
=
twoode(x,y)
dydx
=
[ y(
2
)
-
abs(yd)) ];
function
res
=
twobc(ya.yb) res
=
[ ya(
1
)yb(
1
)
+
2
];
Теперь наберите в командной строке type twobvp и посмотрите само решение уравнения, которое содержится в уже имеющемся в системе файле twobvp. А исполнив команду twodvp, можно наблюдать результат решения в виде графиков. В решении вы найдете структуру узлов начальной сетки решения, которая поясняется ниже.
- solinit – это структура узлов начальной сетки решения (в любой шкале), но такая, что solinit.x=a, solinit.x – b. И функция у, и функция у' должны быть непрерывны на участке [а b]. Дотадка для начальной итерации so1imt=bvpi-mt(x,yinit.params) в bvp4c отличается тем, что ваше начальное представление о функции у yinit можно вводить не только в виде вектора, но и как символьную функцию.
Рекомендуется просмотреть также пример mat4bvp и дополнительные примеры решения систем дифференциальных уравнений, приведенные в файле odedemo. Во многих случаях решение задач, сводящихся к решению систем дифференциальных уравнений, удобнее осуществлять с помощью пакета расширения Simulink.