Министерство образования Российской Федерации
Белгородский государственный технологический университет им. В.Г. Шухова
Кафедра программного обеспечения вычислительной техники и автоматизированных систем
Вычислительная математика
Лабораторная работа №6
Численные методы решения задачи Коши
Выполнил: студент гр. ПВ-22
Юсюмбели Н. И.
Проверила: Брусенцева В.С.
Белгород
2011
Лабораторная работа №6.
Численные методы решения задачи Коши
Вариант №22
Задания к работе
1.Найти точное решение задачи Коши для соответствующего варианта.
Проверим, что есть точное решение задачи Коши:
2.Вычислить «вручную» у(х+0,2) четырьмя методами: Эйлера, Эйлера-Коши, модифицированным Эйлера и Рунге-Кутты сначала с шагом h=0.2, а затем с шагом h=0,1.
1)Формула метода Эйлера
2)Формула модифицированного метода Эйлера
3)Формула метода Эйлера-Коши
4) Формула метода Рунге-Кутты
Результаты вычислений занесены в таблицы
h=0,2
i |
xi |
Эйлера |
Эйлера-Коши
|
m1 |
m2 |
m3 |
m4 |
Рунге-Кутты |
0 1 2 3 4 5 |
0 0,2 0,4 0,6 0,8 1 |
1 1 1,04 1,1232 1,257984 1,45926144 |
1 1,02 1,082832 1,196312794 1,375281188 1,6448363 |
0 0,040808 0,086663 0,143666 0,22034 0,329743 |
0,02 0,062436 0,112662 0,177667 0,267713 0,398989 |
0,0202 0,063085 0,113962 0,180047 0,271977 0,406607 |
0,040808 0,08666292 0,143669854 0,220362253 0,329820675 0,493277564 |
1 1,020201333 1,083286993 1,197217008 1,377126415 1,648716677 |
h=0,1
i |
xi |
Эйлера |
Эйлера-Коши
|
m1 |
m2 |
m3 |
m4 |
Рунге-Кутты
|
||||||
|
|
|
1 1,005 1,0201755 1,04598594 1,08322304 1,13305129 1,19706869 1,277392001,37677310 1,49875520 1,64788134 |
|
0,005 0,01515 0,02576 0,03716 0,04972 0,06388 0,08015 0,09917 0,12173 0,14884 0,18177
|
0,00501 0,01518 0,02582 0,03726 0,04986 0,06408 0,08042 0,09954 0,12223 0,14950 0,18265
|
0,0100501 0,0204040 0,0313808 0,0433315 0,0566576 0,0718337 0,0894349 0,1101729 0,1349421 0,1648806 0,2014517
|
|
Результат работы программы
i |
x i |
y i т |
y i э |
y i э-к |
y i м |
y i р-к |
0 1 2 3 4 5 6 7 8 9 10 |
1 1,1 1,2 1,3 1,4 1,5 1,6 1,7 1,8 1,9 2 |
2,718 3,004 3,320 3,669 4,055 4,482 4,953 5,474 6,050 6,686 7,389 |
2,718 3,003 3,318 3,665 4,049 4,473 4,942 5,459 6,030 6,661 7,357 |
2,718 3,004 3,320 3,669 4,055 4,482 4,953 5,474 6,050 6,686 7,389 |
2,718 3,004 3,320 3,669 4,055 4,482 4,953 5,474 6,050 6,686 7,389 |
2,718 3,004 3,320 3,669 4,055 4,482 4,953 5,474 6,050 6,686 7,389 |
Описание структур данных
Подпрограммы для нахождения приближённого значения задачи Коши с оценкой точности по принципу Рунге методами Эйлера, Эйлера-Коши, модифицированного Эйлера и методом Рунге-Кутты.
Структура данных на языке паскаль:
Type TFunc3=function(X,Y:BaseType):BaseType;
Спецификация подпрограмм
1)1.Заголовок: Procedure DU_Eiler(F:TFunc3;x0,xn,y0:BaseType;n:Integer;var Y:TMatrix;Eps:Extended=1E-5);
2.Назначение: Функция возвращает таблицу Y приближённых значений решения задачи Коши с точностью на промежутке (x0,xn) с оценкой точности по принципу Рунге для метода Эйлера.
3.Входные параметры: f,x0,xn,y0,n,eps;
4.Выходные параметры: Y
2)1.Заголовок: Procedure DU_EK(F:TFunc3;x0,xn,y0:BaseType;n:Integer;var Y:TMatrix;Eps:Extended=1E-5);
2.Назначение: Функция возвращает таблицу Y приближённых значений решения задачи Коши с точностью на промежутке (x0,xn) с оценкой точности по принципу Рунге для модифицированного метода Эйлера.
3.Входные параметры: f,x0,xn,y0,n,eps;
4.Выходные параметры: Y
3)1.Заголовок: Procedure DU_ME(F:TFunc3;x0,xn,y0:BaseType;n:Integer;var Y:TMatrix;Eps:Extended=1E-5);
2.Назначение: Функция возвращает таблицу Y приближённых значений решения задачи Коши с точностью на промежутке (x0,xn) с оценкой точности по принципу Рунге для метода Эйлера - Коши.
3.Входные параметры: f,x0,xn,y0,n,eps;
4.Выходные параметры: Y
4)1.Заголовок: Procedure DU_Runge_Kutti(F:TFunc3;x0,xn,y0:BaseType; n:Integer;var Y:TMatrix;Eps:Extended=1E-5);
2.Назначение: Функция возвращает таблицу Y приближённых значений решения задачи Коши с точностью на промежутке (x0,xn) с оценкой точности по принципу Рунге для метода Рунге - Кутты.
3.Входные параметры: f,x0,xn,y0,n,eps;
4.Выходные параметры: Y
unit Unit3;
interface
uses Matrix;
type
TFunc3=function(X,Y:BaseType):BaseType;
//------------------------------------------------------------------------------
Procedure DU_Eiler(F:TFunc3;x0,xn,y0:BaseType;n:Integer;var Y:TMatrix;Eps:Extended=1E-5);
Procedure DU_EK(F:TFunc3;x0,xn,y0:BaseType;n:Integer;var Y:TMatrix;Eps:Extended=1E-5);
Procedure DU_ME(F:TFunc3;x0,xn,y0:BaseType;n:Integer;var Y:TMatrix;Eps:Extended=1E-5);
Procedure DU_Runge_Kutti(F:TFunc3;x0,xn,y0:BaseType;n:Integer;var Y:TMatrix;Eps:Extended=1E-5);
//------------------------------------------------------------------------------
implementation
//------------------------------------------------------------------------------
Procedure DU_Eiler(F:TFunc3;x0,xn,y0:BaseType;n:Integer;var Y:TMatrix;Eps:Extended=1E-5);
var
i:integer;
h:BaseType;
{++++++++++++++++++++++++++++++++++++++++++++}
function func(x:BaseType):BaseType;
var h,yk,yk1,yh,yh2,xk:BaseType;
begin
yh2:=0;
h:=(x-x0)/2;
repeat
xk:=x0;
yk:=y0;
while xk<x do
begin
yk1:=yk+h*F(xk,yk);
xk:=xk+h;
yk:=yk1;
end;
yh:=yh2;
yh2:=yk1;
h:=h/2;
until abs(yh2-yh)<Eps;
Result:=yh2;
end;
{++++++++++++++++++++++++++++++++++++++++++++}
begin
Y.SetLength(1,n+1);
Y[1,1]:=y0;
h:=(xn-x0)/n;
for i:=1 to n do
begin
x0:=x0+h;
Y[1,i+1]:=func(x0);
end;
end;
//------------------------------------------------------------------------------
Procedure DU_EK(F:TFunc3;x0,xn,y0:BaseType;n:Integer;var Y:TMatrix;Eps:Extended=1E-5);
var
i:integer;
h:BaseType;
{++++++++++++++++++++++++++++++++++++++++++++}
function func(x:BaseType):BaseType;
var h,yk,yk1,yh,yh2,xk,t:BaseType;
begin
yh2:=0;
h:=(x-x0)/2;
repeat
xk:=x0;
yk:=y0;
while xk<x do
begin
t:=F(xk,yk);
yk1:=yk+h/2*(t+F(xk+h,yk+h*t));
xk:=xk+h;
yk:=yk1;
end;
yh:=yh2;
yh2:=yk1;
h:=h/2;
until abs(yh2-yh)/3<Eps;
Result:=yh2;
end;
{++++++++++++++++++++++++++++++++++++++++++++}
begin
Y.SetLength(1,n+1);
Y[1,1]:=y0;
h:=(xn-x0)/n;
for i:=1 to n do
begin
x0:=x0+h;
Y[1,i+1]:=func(x0);
end;
end;
//------------------------------------------------------------------------------
Procedure DU_ME(F:TFunc3;x0,xn,y0:BaseType;n:Integer;var Y:TMatrix;Eps:Extended=1E-5);
var
i:integer;
h:BaseType;
{++++++++++++++++++++++++++++++++++++++++++++}
function func(x:BaseType):BaseType;
var h,yk,yk1,yh,yh2,xk:BaseType;
begin
yh2:=0;
h:=(x-x0)/2;
repeat
xk:=x0;
yk:=y0;
while xk<x do
begin
yk1:=yk+h*F(xk+h/2,yk+h/2*F(xk,yk));
xk:=xk+h;
yk:=yk1;
end;
yh:=yh2;
yh2:=yk1;
h:=h/2;
until abs(yh2-yh)/3<Eps;
Result:=yh2;
end;
{++++++++++++++++++++++++++++++++++++++++++++}
begin
Y.SetLength(1,n+1);
Y[1,1]:=y0;
h:=(xn-x0)/n;
for i:=1 to n do
begin
x0:=x0+h;
Y[1,i+1]:=func(x0);
end;
end;
//------------------------------------------------------------------------------
Procedure DU_Runge_Kutti(F:TFunc3;x0,xn,y0:BaseType;n:Integer;var Y:TMatrix;Eps:Extended=1E-5);
var
i:integer;
h:BaseType;
{++++++++++++++++++++++++++++++++++++++++++++}
function func(x:BaseType):BaseType;
var h,yk,yk1,yh,yh2,xk,
m1,m2,m3,m4:BaseType;
begin
yh2:=0;
h:=(x-x0)/2;
repeat
xk:=x0;
yk:=y0;
while xk<x do
begin
m1:=h*F(xk,yk);
m2:=h*F(xk+h/2,yk+m1/2);
m3:=h*F(xk+h/2,yk+m2/2);
m4:=h*F(xk+h,yk+m3);
yk1:=yk+1/6*(m1+2*m2+2*m3+m4);
xk:=xk+h;
yk:=yk1;
end;
yh:=yh2;
yh2:=yk1;
h:=h/2;
until abs(yh2-yh)/15<Eps;
Result:=yh2;
end;
{++++++++++++++++++++++++++++++++++++++++++++}
begin
Y.SetLength(1,n+1);
Y[1,1]:=y0;
h:=(xn-x0)/n;
for i:=1 to n do
begin
x0:=x0+h;
Y[1,i+1]:=func(x0);
end;
end;
//------------------------------------------------------------------------------
end.