
- •Лабораторная работа № 7 Изучение процедур ode.. В matlab
- •Постановка задачи
- •Объект исследования
- •Реализация в MatLab
- •Решение задачи Коши для дифференциального уравнения второго порядка
- •Решение задачи Коши для дифференциального уравнения второго порядка (линейное уравнение с постоянными коэффициентами)
Лабораторная работа № 7 Изучение процедур ode.. В matlab
Постановка задачи
На втором семестре обучения у нас был курс «Дифференциальных уравнений». Для решения многих из них приходилось тратить немало времени. Также решение дифференциальных уравнений и построение графиков решений часто необходимо при решении многих физических задач, например, при описании движения зараженной частицы (закон Кулона), движения под действием сил тяжести и трения и др.
Чтобы как-то сэкономить драгоценное время дифференциальные уравнения можно решать не «вручную», а при помощи программы MatLab.
Объект исследования
Для решения дифференциальных уравнений и систем дифференциальных уравнений в 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.
Реализация в 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('разность')
Получим следующие результаты:
Теперь ответ верный. Но необходимо разобраться, почему же так получилось?
Вычислим погрешности различных способов решении дифференциальных уравнений