Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
50
Добавлен:
23.01.2015
Размер:
499.71 Кб
Скачать

Изучение процедур ode.. в MATLAB

  1. Объект исседования

Объектом исследования в этой лабораторной работе являются процедуры ODE23 и ODE45. Эти процедуры являются мощным механизмом для решения задачи Коши, она часто возникает при построении моделей реальных объектов.

  1. ПроцедурА 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 в качестве решения поставленной нами задачи Коши выдаёт совсем другую функцию.

Вывод: прежде, чем давать задачи компьютеру, необходимо самому аналитически и «вручную» выполнить все необходимые преобразования и проверить выполнение всех необходимых условий. Иначе мы рискуем попасться в похожую ловушку, и часто понять, где же скрывается ошибка, очень сложно.

  1. ПРоцедура 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)

  1. д ругие примеры использования процедур ODE…

    1. Пример 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 не простит.

    1. Пример 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)

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

  1. Вывод

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

Соседние файлы в папке МП-30