Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архив1 / docx57 / Отчёт (10)

.docx
Скачиваний:
20
Добавлен:
01.08.2013
Размер:
39.57 Кб
Скачать

Министерство образования Российской Федерации

Белгородский государственный технологический университет им. В.Г. Шухова

Кафедра программного обеспечения вычислительной техники и автоматизированных систем

Вычислительная математика

Лабораторная работа №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

Рунге-Кутты

0

1

2

3

4

5

6

7

8

9

10

0

0,1

0,2

0,3

0,4

0,5

0,6

0,7

0,8

0,9

1

1

1

1,01

1,0302

1,061106

1,1035502

1,1587277

1,2282514

1,3142290

1,4193673

1,5471103

1

1,005

1,0201755

1,04598594

1,08322304

1,13305129

1,19706869

1,277392001,37677310

1,49875520

1,64788134

0

0,01005

0,02040

0,03138

0,04333

0,05665

0,07183

0,08943

0,110170,13493

0,16487

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

1

1,00501252

1,02020134

1,04602785

1,08328706

1,13314844

1,19721734

1,27762127

1,37712769

1,49930236

1,64872100


Результат работы программы

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.