Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Числ_методы_I_(лаб).doc
Скачиваний:
218
Добавлен:
05.06.2015
Размер:
3.44 Mб
Скачать

Программное обеспечение

Система Matlabпозволяет решать задачу Коши для обыкновенных дифференциальных уравнений и их систем посредством обращения к функциямode23иode45. Первая из них реализует методы Рунге–Кутта второго и третьего порядков, а вторая – четвертого и пятого порядков. Выбор шага интегрирования в них осуществляется автоматически на основе задаваемой абсолютной погрешности решения. Решение задачи эти функции возвращают в виде массива значений аргумента и искомой функции.

Обращение и функциям ode23иode45осуществляется следующим образом

[t,x]=ode23('fun', t0, tf, x0)

[t,x]=ode45('fun', t0, tf, x0)

или

[t,x]=ode23('fun', t0, tf, x0, tol, trace)

[t,x]=ode45('fun', t0, tf, x0, tol, trace)

где fun – имя m-файла, с помощью которого вычисляются правые части уравнений или системы дифференциальных уравнений, t0 – начальное значение аргумента, левая граница отрезка построения решения, tf – конечное значение аргумента, правая граница построения решения, х0 – вектор начальных условий, tol – задаваемая абсолютная погрешность построения решения, по умолчанию для ode23 она принята равной 0.001, а для ode45 – 0.00000l, trace – признак выдачи промежуточных результатов.

Пример решения на пэвм в среде Matlab

Пусть дана задача Коши для дифференциального уравнений 1-го порядка

,

для которой надо построить решение на отрезке [0, 5] с относительной погрешностью не более 2%.

Для применения одной из описанных выше функций Matlab’а сначала надо сформироватьm-файл, например с именемS.m, для вычисления правой части уравнения

function v=S(x,y)

v=sin(x*y);

После этого можно обратиться к функции ode45, задавая имя созданногоm-файл, начальное условие, границы интервала интегрирования и требующуюся абсолютную погрешность интегрирования, например 10–12. Относительная погрешность решения при этом не находится. Построим также график полученного решения. Описанные действия реализуются следующим набором команд

t0=0;

x0=[1];

tf=5;

[t,P]=ode45('S',t0,tf,x0,1e-12)

plot(t,P);

После запуска этой программы на выполнение в командном окне появятся результаты решения в виде таблицы

t = P =

0 1.0000

0.1250 1.0078

0.2500 1.0316

0.3750 1.0719

0.5000 1.1297

0.6250 1.2058

0.7500 1.3006

0.8750 1.4119

................

4.9600 0.6636

5.0000 0.6576

а в графическом окне (см. рис.6) будет показан график полученного решения.

Рис.6.

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

function [y,x]=eiler(a,b,n,y0)

h=(b-a)/n

y(1)=y0; x(1)=a; ←задание начального условия

for i=2:n+1

x(i)=a+(i-1)*h;

y(i)=y(i-1)+h*sin(x(i-1)*y(i-1));

end

При такой организации процесса вычислений вторая программа должна реализовывать правило Рунге. Она должна дважды обратиться к первой программе. Первый раз с nшагами по отрезку интегрирования рассматриваемой задачи Коши, а второй раз – с 2nшагами. Результаты такого обращения будут храниться в векторахyиy1соответственно. Для расчета относительной погрешности решения, хранящегося в вектореy1, следует вычислить максимальное значение этого решения. После этого можно найти его относительную погрешность, сохранив её в виде вектораdy. Текст такой программы при 10-и шагах по отрезку построения решения может иметь вид

n=10

[y,x]=eiler(0,5,n,1);

[y1,x1]=eiler(0,5,2*n,1);

maxy(1:n)=y1(2:2:2*n+1);

plot(x,y,x1,y1), grid ←вывод графиков решений

for i=2:n+1

maxy(i)=max(y1(3:2:2*i-1));←поиск максимума решения

end

dy=abs(y(1:n+1)-y1(1:2:2*n+1))./maxy;

hold on ←использование того же графического окна

Y=[x',y1(1:2:2*n+1).',dy.'] ←построение матрицы решений и погрешности

plot(x,dy),grid

Эту программу следует сохранить в виде m-файла с именемodeqv.mв той же папке, что и функцию, реализующую метод Эйлера.

Запуск этого файла на выполнение позволяет получить в командном окне следующий результат

Y =

0 1.0000 0

0.5000 1.0619 0.0582

1.0000 1.3829 0.1035

1.5000 1.8520 0.0753

2.0000 1.8778 0.0563

..........................

5.0000 0.6555 0.0031

П

Рис.7.

ри этом в графическом окне отобразится рисунок с графиками решения с 10-ю шагами по отрезку интегрирования рассматриваемой задачи Коши, с 20-ю шагами и график относительной погрешности последнего решения. Он показан на рис.7. На этом рисунке можно видеть, что для 20-и шагов интегрирования заданная точность решения задачи Коши не достигнута. Наибольшая относительная погрешность превышает 10%. Поэтому расчёт надо повторить с числом шагов 20 и 40, 40 и 80 и так далее. Как показывают расчёты при 80 и 160 шагах получаемое решение имеет относительную погрешность при 160 шагахh= 0.03125, которая не превышает 1,6%, то есть удовлетворяет заданному условию. График полученного решения совпадает с графиком, показанным на рис.6.

При необходимости решения поставленной задачи Коши усовершенствованным методом Эйлера можно воспользоваться предыдущеей программой. Для этого надо переделать m-файл, в котором хранится программа решения задачи Коши методом Эйлера. Его содержимое, сохраняемое под именемu_eiler, показано ниже

function [y,x]=u_eiler(a,b,n,y0)

h=(b-a)/n

y(1)=y0; x(1)=a; ←задание начального условия

for i=2:n+1

xs(i)=x(i-1)+h/2; ←средняя точка

ys(i)=y(i-1)+h/2*sin(x(i-1)*y(i-1));

x(i)=a+(i-1)*h;

y(i)=y(i-1)+h*sin(xs(i)*ys(i));

end

При этом в программе odeqv.mследует только заменить имя функцииeilerнаu_eiler. Её запуск на выполнение для 10-шагов по отрезку интегрирования даёт в командном окне следующий результат, в графическом окне отобразится график, показнный на рис.8.

Y =

0 1.0000 0

0.5000 1.1282 0.0024

1.0000 1.5334 0.0027

1.5000 1.9068 0.0099

2.0000 1.8100 0.0263

...........................

5.0000 0.6595 0.0208

Рис.8.

Точность полученного решения – неудовлетворительна: относительная погрешность составляет 3%. Поэтому надо пересчитать решение с более мелким разбиением отрезка интегрирования. В данном случае оказывается, что достаточно разбить отрезок интегрирования на 40 участков, чтобы получить относительную погрешность решения не превышающую 1.1%. При этом график этого решения совпадёт с графиком, показанным на рис.6.