Лабораторные работы - Выполненые / Студенты всех групп / LAB_07 / МП-30 / 12_Балабанова_07
.docИзучение процедур ode.. в MATLAB
-
Объект исседования
Объектом исследования в этой лабораторной работе являются процедуры ODE23 и ODE45. Эти процедуры являются мощным механизмом для решения задачи Коши, она часто возникает при построении моделей реальных объектов.
-
ПроцедурА oDe23
«Поиграем» с MATLAB:
притворимся, что мы не знаем первообразной
какой-нибудь очень простой функции
(допустим,
)
и попросим MATLAB решить
задачу Коши для этой функции, дополнительно
задав начальные условия
.
Для этого необходимо сделать следующие
действия:
-
создать m-файл, куда запишем производную:
(файл с названием yp1.m)
function yp=yp1(t,y)
%
yp=2*t;
-
ввести в командной строке следующие команды:
>> [t,Y]=ode45(@yp1,[0 3],0);
(где @yp1 – имя функции, [0 3] – отрезок, на котором мы ищем решение, 0 – начальное значение функции)
>> plot(t,t.^2,'g+',t,Y,'r')
В отчёте я опускаю строчки, связанные с оформлением графика: установка толщины, добавление сетки, легенды и т.п.
В результате выполнения этих команд на экран будет выведен следующий график:
Г
рафики
совпадают, а если и есть погрешность,
то в данном случае она пренебрежимо
мала (в задачах, где не нужна очень
большая точность). Но, точностью тоже
можно управлять, изменив необходимые
опции команды ODE…, как
нам рассказал Саша Моисеев.
Как написано в разработке к лабораторной работе, функцию в файле «yp1.m» можно задать по-другому (назовём её «yp2»):
function yp=yp2(t,y)
%
yp=2*sqrt(y);
На первый взгляд, всё верно: мы знаем,
что функция, чью производную мы задаём
в этом файле, имеет вид
а так как процедуру ODE мы
будем применять на отрезке
,где
,
значит, мы имеем право выразить
через
как написано в функции yp2:
И если сделать это предположение и
попросить ODE45 решить
задачу Коши с теми же условиями, что и
для функции yp1, то
результирующий график будет выглядеть
следующим образом:
Р
езультат
неожиданный. Казалось бы, графики должны
быть точно такими же, как и в первом
«эксперименте», но результат работы
ODE представляет собой
прямую линию, идущую вдоль оси абсцисс.
Значит, процедура выдала неверный
результат, а если сказать точнее, то не
«неверный», а не тот, который бы хотели
получить мы. А получилось так потому,
что всё-таки производная была задана
неверно. «Вручную» проинтегрировав
функцию
,
мы получим следующий результат:

![]()
![]()
![]()
![]()
(Мы знаем, что при
,
следовательно
)
![]()
Но полученная функция не равносильна
той, что мы задали в самом начале,
не то же самое, что
.
В точке, где
,
функция
имеет производную, как раз равную
,
а функция
производную в этой точке не имеет
.
Поэтому процедура ODE в
качестве решения поставленной нами
задачи Коши выдаёт совсем другую функцию.
Вывод: прежде, чем давать задачи компьютеру, необходимо самому аналитически и «вручную» выполнить все необходимые преобразования и проверить выполнение всех необходимых условий. Иначе мы рискуем попасться в похожую ловушку, и часто понять, где же скрывается ошибка, очень сложно.
-
ПРоцедура Ode45
Попробуем теперь решить задачу Коши
для дифференциального уравнения второго
порядка. Возьмём известную функцию,
например,
.
Соответственно
![]()
или
![]()
Начальные условия:
![]()
![]()
(Далее позволю себе скопировать текст
из разработки к лабораторной работе)
Чтобы можно было воспользоваться
MATLABом, сначала сведем эту задачу к
системе из двух дифференциальных
уравнений первого порядка. Будем считать
саму функцию
первой координатой двумерной функции
(т.е.
или
на языке MATLAB
)),
а ее первую производную
- второй (т.е.
или на языке MATLAB
).
Тогда с учетом того, что
мы придумали сами, имеем первое уравнение
системы
,
второе -
или
.
Если эту систему записать в матричной
форме, то слева мы получим вектор-столбец
из производных компонент вектор-функции
Y, а справа - вектор-столбец из функций
или, чтобы выглядело пострашнее,
.
Создадим m-файл функцию yp3.m, описывающую правую часть нашей системы дифференциальных уравнений:
function yp=yp3(t,y)
%
yp=[-sin(t);-y(1)];
Исследуем решения, например, так:
>> [t,YY]=ode45('yp3',[0 2*pi],[1 0]);
>> plot(t,cos(t),'r+',t,YY)
>> plot(t,cos(t),'r+',t,YY(:,1))
В зависимости от того, какую строку 2ую или 3ю, мы пропишем в командной строке, на экран будут выведены следующие графики:
В
ам
не кажется странным, что в команде
plot(…) фигурировало две
переменные, а графиков получилось три:
красный, зелёный и синий? Красными
крестиками изображён график
.
Значит, синий и зелёный графики относятся
к вектор-функции
.
Теперь понятно, откуда взялся зелёный
график на предыдущем рисунке: это график
второго столбца вектора
.
Удостовериться в этом можно следующим
образом:
>>plot(t,YY(:,1),'g',t,YY(:,2),'b','LineWidth',2)
-
д
ругие
примеры использования процедур ODE…-
Пример 1: экспонента
-
Очень любопытно будет выглядеть запись функции для первообразной, представляющей собой экспоненту:
m-файл «expon.m»:
function yp=expon(t,y)
%
yp=[y(1); y(1)];
Команды, записанные в командной строке:
>>[t,YY]=ode45('expon',[0 5],[1 1]);
>>plot(t,exp(t),'r-',t,YY(:,1),'bo','LineWidth',3)
Р
езультатом
выполнения команд является график:
Так как команды были корректно записаны и функция была корректно определена, результат «то, что надо»: результат выполнения команды ODE совпал с заданной нами экспонентой. Однако, даже если записать команду plot(…) неправильно, как это было сделано нами в пункте 3, а именно
>> plot(t,exp(t),'r-',t,YY,'bo', 'LineWidth', 3)
р
езультат
всё равно нас удовлетворит:
Как видно из рисунка, никаких лишних графиков не появилось, несмотря на то, что мы некорректно задали команду plot(…): в ней мы вместо YY(:,1) написали YY. Так произошло потому, что столбцы YY(:,1) и YY(:,2) совпадают, это можно проверить, ввести в MatLab команду:
>> YY(:,1)==YY(:,2)
Результатом её выполнения будет являться столбец длиной length(YY(:,1)), заполненный единицами, что говорит нам о том, что первый столбец YY равен второму его столбцу.
Однако, такая ситуация, когда нет лишних графиков при неправильном задании функции, очень редка, в подавляющем большинстве случаев такую ошибку MatLab не простит.
-
Пример 2: дифференциальное уравнение более высоких порядков
Теперь заставим MatLab решить
более сложную задачу: дифференциальное
уравнение 4го порядка. В качестве искомой
первообразной возьмём опять же
.
m-файл «yp4.m»
function yp=yp4(t,y)
%
yp=[-sin(t);-y(1); sin(t); y(1)];
Нахождение первообразной с помощью команды ODE45 и построение графиков:
>> [t,YY]=ode45('yp4',[0 2*pi],[1 0 -1 0]);
>>plot(t,cos(t),'r+',t,YY(:,1),'b-','LineWidth',3)
В
уаля!
Результат снова получен верный:
Если дифференциальное уравнение первого или второго порядка иногда можно решить самим, вручную, то справиться с дифференциальным уравнением 3его порядка и выше бывает очень тяжело. MatLab же с этой задачей справляется с лёгкостью.
А
взгляните, какая красота получается,
если опять же допустить ошибку в команде
plot(…) и построить графики
всех столбцов YY:
>> plot(t,cos(t),'r+',t,YY, 'LineWidth', 3)
Красиво, неправда ли? Хорошо, что сейчас мы знаем, откуда получились все эти графики. Но если бы мы честно пытались найти решение дифференциального уравнения и в ответ получили бы такой график, мы бы, наверное, не очень обрадовались.
-
Вывод
Выполнив эту лабораторную работу, мы научились находить решения дифференциальных уравнений в пакете MatLab и убедились в том, что компьютер с мощной вычислительной программой – это хорошо, но пользоваться всем этим нужно уметь.
