
Лабораторные работы - Выполненые / Студенты всех групп / LAB_07 / МП-30 / 04_Омельянов_07
.docЛабораторная работа №7
Изучение процедур ode.. в MATLAB.
Постановка задачи.
Возьмем
функцию
и будем считать ее решением задачи Коши
для дифференциального уравнения первого
порядка.
Получим
это дифференциальное уравнение
и начальное условие
.
Изучим порядок использования процедур
ode..
(например, help
ode45)
и другие сопутствующие команды.
Реализация математической модели.
Создадим m-файл функцию yp.m, описывающую правую часть нашего дифференциального уравнения:
function [ S2 ] = proverkaode45(fun, interv, y0, toch)
format long g
OPTIONS = odeset( 'MaxStep', toch);
[t,Y]=ode45(fun, interv, y0, OPTIONS);
figure
hold on
plot(t,t.^2,'g+',t,Y,'r');
title(['Теоретическое и численное решения']);
xlabel('argument');
ylabel('Function');
hold off
razm = size(Y);
D=0;
for i = 1:razm(1,1)
D = D+ (Y(i,1) - (t(i,1))^2)^2;
end
D;
S2(1,1) = D;
D = D/razm(1,1);
S2(1,2) = D;
end
Входные параметры функции proverkaode45:
-
имя функции, содержащей дифференциальное уравнение;
-
интервал поиска решения дифференциального уравнения;
-
граничное условие задачи Коши (значение искомого решения в крайней левой точке интервала поиска решения);
-
точность решения: MaxStep – верхняя граница размера шага [положительный скаляр], по-умолчанию равен одной десятой длинны интервала поиска решения для всех решений.
Выходные параметры:
-
суммарное квадратичное отклонение практического решения от теоретического;
-
среднее квадратичное отклонение практического решения (выборки) от теоретического решения (матожидания) – статистика
для изучения этого уравнения будем использовать функцию:
function [ MassS2 ] = S2(fun, interv, y0, ntoch)
format long g
toch (1,1)= 1;
for i = 2:ntoch
toch(1,i) = toch(1,i-1)/10;
end
for i = 1:ntoch
MassS2(i,:) = proverkaode45(fun, interv, y0, toch(1,i));
end
figure
hold on
plot(log10(toch),20*log10(MassS2(:,1)),'g.-');
title(['Зависимость суммарного квадратичного отклонения от точности решения']);
xlabel('точность');
ylabel('суммарное квадратичное отклонение');
hold off
figure
hold on
plot(log10(toch),20*log10(MassS2(:,2)),'r.-');
title(['Зависимость среднего квадратичного отклонения от точности решения']);
xlabel('точность');
ylabel('среднее квадратичное отклонение');
hold off
end
Входные параметры функции S2:
-
имя функции, содержащей дифференциальное уравнение;
-
интервал поиска решения дифференциального уравнения;
-
граничное условие задачи Коши (значение искомого решения в крайней левой точке интервала поиска решения);
-
число точек графика зависимости суммарного квадратичного отклонения и среднего квадратичного отклонения численного решения от теоретического от точности решения (MaxStep); точность изменяется в геометрической прогрессии с
Выходные параметры:
-
массив суммарных квадратичных отклонений и среднее квадратичных отклонений численных решений различной точности от теоретического решения (в порядке уменьшения точности по строкам в геометрической прогрессии).
Введём ещё одно представление ранее описанного дифференциального уравнения, исходя из того, что интересующее нас решение нам известно. Функция yp1.m:
function yp=yp1(t,y)
yp=sqrt(y)+t;
end
Эта функция пригодится нам как сейчас для сравнительного анализа точности численного решения дифференциального уравнения, так и в дальнейшем.
Результаты моделирования:
Результаты работы функций S2(@yp1, [0 3], 0, 7) и S2(@yp, [0 3], 0, 7) приведены ниже:
Численные результаты (соответствуют выходным параметрам функции S2)
>> S2(@yp, [0 3], 0, 7)
ans =
3.87034881624059e-29 2.97719139710815e-30
4.88733253670591e-28 4.0391177989305e-30
1.20642354511534e-24 1.00451585771469e-27
1.601529130435e-21 1.33449640066244e-25
1.18030010576173e-18 9.83575225007901e-24
4.65006432565654e-16 3.87505037550514e-22
2.55340147734914e-13 2.12783438713808e-20
>> S2(@yp1, [0 3], 0, 7)
ans =
0.00351866437049759 0.000206980257088094
1.28019063116428e-05 1.02415250493142e-07
1.18248867348599e-07 9.84586738955863e-11
1.18145078355402e-09 9.84460281271576e-14
1.18182499672581e-11 9.84845956888531e-17
1.31970506173309e-13 1.09975330164982e-19
2.48056769076757e-13 2.06713957004468e-20
Графики
приведены в полулогарифмическом
масштабе. Значению точности 0 соответствует
,
значению -5 –
.
Кривые, расположенные выше соответствуют
решению yp1,
расположенные ниже – yp.
Видно, что в первом случае оценка убывает
(среднеквадратичное отклонение
уменьшается) с ростом точности (MaxStep
убывает), во втором случае оценка
возрастает (среднеквадратичное отклонение
увеличивается) с ростом точности (MaxStep
убывает).
Вывод:
точность численного решения дифференциального уравнения зависит как от параметров функции, применяемой для решения, так и от формы представления самого дифференциального уравнения. Так как все кривые, полученные в полулогарифмическом масштабе, хорошо кусочно аппроксимируются прямыми, можно утверждать экспоненциальную зависимость точности численного решения дифференциального уравнения от параметра MaxStep функции, применяемой для решения.
Рассмотрим ещё одно представление ранее описанного дифференциального уравнения, исходя из того, что интересующее нас решение нам известно. Функция yp2.m:
function yp=yp2(t,y)
yp=2*sqrt(y);
end
Решение этого уравнения, найденное с помощью функции
proverkaode45(@yp2, [0 3], 0, 1)
Решение этого уравнения, найденное с помощью функции
proverkaode45(@yp2, [1 4], 1, 1)
В первом
случае задача Коши имеет 2 решения
,
во втором решение единственно.
Вывод:
при численном решении дифференциальных уравнений надо учитывать возможность тривиальных решений в постановке задачи Коши.
Теперь рассмотри возможность решения уравнений второго порядка с помощью процедур «ode…».
Положим,
что производная второго порядка
выражается через первую производную и
переменную:
тогда,
если заданы граничные условия
,
мы можем решить его относительно первой
производной, то есть найти
,
а это уравнение разрешить относительно
y:
.
Процедуры ode
предназначены для решения систем
дифференциальных уравнений. Поэтому в
функции, описывающей систему
дифференциальных уравнений, переменной
y
соответствует столбец искомых функций,
а переменной yp
столбец производных этих функций.
function yp = yp3 (t, y)
yp = [-cos(t); y(1, 1)];
end
Первый эемент
столбца yp
–
,
а второй –
,
соответствующий решению
= y(1,1).
Таким образом, командой '[t,YY]=ode45('yp3',[0
2*pi],[0
1]);' мы получаем массив YY,
первый столбец которого соответствует
,
а второй -
.
Командой ‘plot(t,cos(t),'r+',t,YY)'
построим графики производной и самой
функции:
Голубой линии соответствует график производной, зелёной – теоретическое решение, красным крестикам – численное решение.
Решим
задачу Коши:
.
function yp=yp4(t,y)
yp=1-y^2;
end
>> [t,YY]=ode45('ypp',[-10 10],-0.999999995877693);
>> plot(t,YY,'r-',t,tanh(t),'g.')