Скачиваний:
66
Добавлен:
23.01.2015
Размер:
1.32 Mб
Скачать

Лабораторная работа № 7 Изучение процедур ode.. В matlab

      1. Постановка задачи

На втором семестре обучения у нас был курс «Дифференциальных уравнений». Для решения многих из них приходилось тратить немало времени. Также решение дифференциальных уравнений и построение графиков решений часто необходимо при решении многих физических задач, например, при описании движения зараженной частицы (закон Кулона), движения под действием сил тяжести и трения и др.

Чтобы как-то сэкономить драгоценное время дифференциальные уравнения можно решать не «вручную», а при помощи программы MatLab.

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

Для решения дифференциальных уравнений и систем дифференциальных уравнений в MatLabпредусмотрены следующие функции

  • ode45 - одношаговый явный метод Рунге-Кутты 4-го и 5-го порядка. Это классический метод, рекомендуемый для начальной пробы решения. Во многих случаях он дает хорошие результаты;

  • ode23 - одношаговый явный метод Рунге-Кутты 2-го и 4-го порядка. При умеренной жесткости системы ОДУ и низких требованиях к точности этот метод может дать выигрыш в скорости решения;

  • ode113 — многошаговый метод Адамса-Башворта-Мултона переменного порядка. Это адаптивный метод, который может обеспечить высокую точность решения

  • ode23tb — неявный метод Рунге-Кутта в начале решения и метод, использующий формулы обратного дифференцирования 2-го порядка в последующем. Несмотря на сравнительно низкую точность, этот метод может оказаться более эффективным, чем ode15s;

  • ode15s — многошаговый метод переменного порядка (от 1 до 5, по умолчанию 5), использующий формулы численного дифференцирования. Это адаптивный метод, его стоит применять, если решатель ode45 не обеспечивает решения;

  • ode23s — одношаговый метод, использующий модифицированную формулу Розенброка 2-го порядка. Может обеспечить высокую скорость вычислений при низкой точности решения жесткой системы дифференциальных уравнений;

  • ode23t – метод трапеций с интерполяцией. Этот метод дает хорошие результаты при решении задач, описывающих осцилляторы с почти гармоническим выходным сигналом;

Все они имеют вид ode__(f, interval, x0 [, options]).

Входными параметрами этих функций являются:

  • f - вектор-функция для вычисления правой части уравнения системы уравнений

  • interval - массив из двух чисел, определяющий интервал интегрирования дифференциального уравнения или системы;

  • x0 - вектор начальных условий системы дифференциальных систем

  • options - параметры управления ходом решения дифференциального уравнения или системы.

Все функции возвращают:

массив Т - координаты узлов сетки, в которых ищется решение;

матрицу X, i-й столбец которой является значением вектор-функции решения в узле Тi

Объектами моего исследования как раз и являются различные функции для решения дифференциальных уравнений типа ode.

      1. Реализация в MatLab

      • Решение задачи Коши для дифференциального уравнения первого порядка y=t.^2

Возьмем функцию y=t.^2 и будем считать ее решением задачи Коши для дифференциального уравнения первого порядка.

Получим это дифференциальное уравнение y'=2*tи начальное условиеy(0)=0. Изучим порядок использования процедурode.. (например,helpode45) и другие сопутствующие команды. Создадимm-файл функциюyp.m, описывающую правую часть нашего дифференциального уравнения:

function yp=yp(t,y)

%

yp=2*t;

Запустим различные процедуры решения этой задачи Коши, выполним построение графиков известной функции y=t.^2 и результата численного решения задачи КошиY(t), сравним их и найдем погрешности в решении.

[t,Y]=ode45('yp',[0 3],0);

plot(t,t.^2,'b*',t,Y,'r')

grid on

title('построение графика функции y=t^2')

xlabel('t')

ylabel('y(t)')

legend('функция y=t^2','дифференциальное уравнение');

figure

plot(t,t.^2-Y,'r')

grid on

title('погрешность метода ode45')

xlabel('t')

ylabel('разность')

%

[t,Y]=ode23('yp',[0 3],0);

figure

plot(t,t.^2-Y,'r')

grid on

title('погрешность метода ode23')

xlabel('t')

ylabel('разность')

%

[t,Y]=ode23s('yp',[0 3],0);

figure

plot(t,t.^2-Y,'r')

grid on

title('погрешность метода ode23s')

xlabel('t')

ylabel('разность')

%

[t,Y]=ode23tb('yp',[0 3],0);

figure

plot(t,t.^2-Y,'r')

grid on

title('погрешность метода ode23tb')

xlabel('t')

ylabel('разность')

%

[t,Y]=ode15s('yp',[0 3],0);

figure

plot(t,t.^2-Y,'r')

grid on

title('погрешность метода ode15s')

xlabel('t')

ylabel('разность')

%

[t,Y]=ode113('yp',[0 3],0);

figure

plot(t,t.^2-Y,'r')

grid on

title('погрешность метода ode113')

xlabel('t')

ylabel('разность')

Получим следующие результаты:

Синими звездочками будет построен график функции , как заданной функции, а красной линией график функции-решения дифференциального уравнения.

Кажется, что результаты совпадают, но на самом деле в вычислениях присутствует погрешность.

Попробуем решить дифференциальное уравнение другими методами и вычислим их погрешности.

      • Решение задачи Коши для дифференциального уравнения первого порядка y=t.^2 (второй способ)

Возьмем опять функцию y=t.^2. Дифференциальное уравнение y'=2*t и начальное условие y(0)=0. Правую часть дифференциального уравнения можно записать также и другим способом: y'=2*sqrt(y).

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

function yp=yp2(t,y)

%

yp=2*sqrt(y);

Снова решим задачу Коши с нулевым начальным условием. Построим соответствующие графики.

[t,Y]=ode45('yp2',[1 3],1);

plot(t,t.^2,'b*',t,Y,'r')

grid on

title('функция y=t^2')

xlabel('t')

ylabel('y(t)')

legend('функция y=t^2','дифференциальное уравнение');

Однако ответ получился неверным. Чтоб ответ получился правильный, необходимо заменить начальные условия, на t=1 и y(1)=1.

[t,Y]=ode45('yp2',[1 3],1);

plot(t,t.^2,'b*',t,Y,'r')

grid on

title('функция y=t^2')

xlabel('t')

ylabel('y(t)')

legend('функция y=t^2','дифференциальное уравнение');

%

figure

plot(t,t.^2-Y,'r')

grid on

title('погрешность метода ode45')

xlabel('t')

ylabel('разность')

%

[t,Y]=ode23('yp2',[1 3],1);

figure

plot(t,t.^2-Y,'r')

grid on

title('погрешность метода ode23')

xlabel('t')

ylabel('разность')

%

[t,Y]=ode23s('yp2',[1 3],1);

figure

plot(t,t.^2-Y,'r')

grid on

title('погрешность метода ode23s')

xlabel('t')

ylabel('разность')

%

[t,Y]=ode23tb('yp2',[1 3],1);

figure

plot(t,t.^2-Y,'r')

grid on

title('погрешность метода ode23tb')

xlabel('t')

ylabel('разность')

%

[t,Y]=ode15s('yp2',[1 3],1);

figure

plot(t,t.^2-Y,'r')

grid on

title('погрешность метода ode15s')

xlabel('t')

ylabel('разность')

%

[t,Y]=ode113('yp2',[1 3],1);

figure

plot(t,t.^2-Y,'r')

grid on

title('погрешность метода ode113')

xlabel('t')

ylabel('разность')

Получим следующие результаты:

Теперь ответ верный. Но необходимо разобраться, почему же так получилось?

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

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