Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
численные методы 6 вариант.docx
Скачиваний:
56
Добавлен:
03.05.2015
Размер:
531.61 Кб
Скачать

[] Классический метод Рунге — Кутты 4 порядка

Метод Рунге — Кутты 4 порядка столь широко распространён, что его часто называют просто методом Рунге — Кутты.

Рассмотрим задачу Коши

Тогда приближенное значение в последующих точках вычисляется по итерационной формуле:

Вычисление нового значения проходит в четыре стадии:

где — величина шага сетки по

Этот метод имеет четвёртый порядок точности, то есть суммарная ошибка на конечном интервале интегрирования имеет порядок (ошибка на каждом шаге порядка).

[] Прямые методы Рунге — Кутты

Семейство прямых методов Рунге — Кутты является обобщением метода Рунге — Кутты 4 порядка. Оно задаётся формулами

где — величина шага сетки пои вычисление нового значения проходит вэтапов:

Конкретный метод определяется числом и коэффициентамии. Эти коэффициенты часто упорядочивают в таблицу (называемую таблицей Бутчера)

Для коэффициентов метода Рунге — Кутты должны быть выполнены условия для. Если требуется, чтобы метод имел порядок, то следует так же обеспечить условие

где — приближение, полученное по методу Рунге — Кутты. После многократного дифференцирования это условие преобразуется в систему полиномиальных уравнений на коэффициенты метода.

Листинг программы в приложении

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

С шагом 0,2:

Vvedite znachenija koncov otrezka [a,b]

1 2

vveditenachalnoe znachenie funkcii y0 pri x=x0

0

Vvedite chislo znacheniy funkcii na promegutke (a,b]

5

Metod Eilera Metoda E-koshi Metod Runge-Koshi

x= 1.00 y1= 0.000000 y2= 0.000000 y3= 0.000000

x= 1.20 y1= 0.200000 y2= 0.216667 y3= 0.218779

x= 1.40 y1= 0.433333 y2= 0.467063 y3= 0.471049

x= 1.60 y1= 0.695238 y2= 0.746287 y3= 0.751990

x= 1.80 y1= 0.982143 y2= 1.050684 y3= 1.057997

x= 2.00 y1= 1.291270 y2= 1.377426 y3= 1.386272

Dlja prodolgenija nagmite lubuyu klavishu

С шагом 0,1:

Vvedite znachenija koncov otrezka [a,b]

1 2

vveditenachalnoe znachenie funkcii y0 pri x=x0

0

Vvedite chislo znacheniy funkcii na promegutke (a,b]

10

Metod Eilera Metoda E-koshi Metod Runge-Koshi

x= 1.00 y1= 0.000000 y2= 0.000000 y3= 0.000000

x= 1.10 y1= 0.100000 y2= 0.104545 y3= 0.104841

x= 1.20 y1= 0.209091 y2= 0.218216 y3= 0.218785

x= 1.30 y1= 0.326515 y2= 0.340247 y3= 0.341073

x= 1.40 y1= 0.451632 y2= 0.469991 y3= 0.471060

x= 1.50 y1= 0.583891 y2= 0.606896 y3= 0.608197

x= 1.60 y1= 0.722817 y2= 0.750480 y3= 0.752005

x= 1.70 y1= 0.867993 y2= 0.900326 y3= 0.902067

x= 1.80 y1= 1.019052 y2= 1.056065 y3= 1.058015

x= 1.90 y1= 1.175666 y2= 1.217366 y3= 1.219521

x= 2.00 y1= 1.337543 y2= 1.383938 y3= 1.386293

Dlja prodolgenija nagmite lubuyu klavishu

I

X

Значения, найденные методом

Точное значение

Эйлера

Эйлера-Коши

Рунге-Кутта

F(x)=ln x

0

1

0

0

0

0

1

1.2

0.200000

0.181860

0.182321

0,182321

2

1.4

0.363720

0.335794

0.336472

0,336472

3

1.6

0.502685

0.469224

0.470003

0,470003

4

1.8

0.623600

0.586966

0.587786

0,587786

5

2

0.730732

0.692316

0.693147

0,693147

Погрешность по методу Рунге <0.000001

I

X

Значения, найденные методом

Точное значение

Эйлера

Эйлера-Коши

Рунге-Кутта

F(x)=ln x

0

1

0

0

0

0

1

1.1

0.100000

0.095241

0.095310

0,095310

2

1.2

0.190483

0.182206

0.182322

0,182321

3

1.3

0.273136

0.262216

0.262364

0,262364

4

1.4

0.349230

0.336302

0.336472

0,336472

5

1.5

0.419748

0.405280

0.405465

0,405465

6

1.6

0.485462

0.469808

0.470004

0,470003

7

1.7

0.546996

0.530427

0.530628

0,530628

8

1.8

0.604857

0.587581

0.587787

0,587786

9

1.9

0.659464

0.641646

0.641854

0,641853

10

2

0.711169

0.692939

0.693147

0,693147

Погрешность по методу Рунге <0.000002

Приложение

Листинг программы к заданию 1

program GausMethod;

uses Crt;

label

finish;

const

l=9;

type

matriceA=array[1..l,1..l+1] of real;

vectorX=array[1..l] of real;

var

i,j,k,m,n: integer;

aa,bb,S: real;

a:matriceA;

x:vectorX;

ch:char;

{Podprorammy}

procedure PAUSA;

begin

writeln;

writeln('Dlja prodolgenija nagmite lubuju klavishu');

repeat

ch:=readkey

until (ch<>'');

end;

procedure OutputOfMatrice;

begin

ClrScr;

for i := 1 to n do

begin

for j := 1 to n+1 do

write (a[i,j]:16:7);

writeln;

end;

pausa;

end;

{Main Program}

begin

ClrScr;

writeln ('Vvedite chislo uravneniy n');

read(n);

writeln ('Vvedite rasshirennuju matricu');

writeln ('po odnomu elementu po strokam');

for i := 1 to n do

begin

for j := 1 to n+1 do

read(a[i,j]);

writeln;

end;

OutputOfMatrice;

for k := 1 to n do

begin

{Poisk maksimalnogo elementa v k-toy stroke}

aa:=abs(a[k,k]);

i:=k;

for m := k+1 to n do

begin

if abs(a[m,k])>aa then

begin

i:=m;

aa:=abs(a[m,k]);

end;

end;

if aa<0.000001 then

begin

writeln;

writeln('Sistema ne imeet edinstvennogo reshenija');

pausa;

goto finish;

end;

{Perestanovka i-toy stroki,

sodergachey glavniy element s k-toy

strokoy}

if i<>k then

begin

for j := k to n+1 do

begin

bb:=a[k,j];

a[k,j]:=a[i,j];

a[i,j]:=bb;

end;

end;

{Preobrazovanie k-toy stroki}

aa:=a[k,k];

a[k,k]:=1;

for j := k+1 to n+1 do

a[k,j]:=a[k,j]/aa;

{Preobrazovanie s pomochju k-toj stroki ostalnih strok }

for i := k+1 to n do

begin

bb:=a[i,k];

a[i,k]:=0;

if bb<>0 then

begin

for j := k+1 to n+1 do

a[i,j]:= a[i,j]-bb*a[k,j];

end;

end;

end;

OutputOfMatrice;

{koec prjamogo hoda v metode Gaussa}

for i := n downto 1 do

begin

s:=a[i,n+1];

for j := n downto i+1 do

s:=s-a[i,j]*x[j];

x[i]:=s;

end;

ClrScr;

for i := 1 to n do

writeln('x',i,'=',x[i]);

pausa;

finish:;

end.

Листинг программы к заданию 2,1

program metodPolovinngoDelenija;

uses crt;

label

finish;

var

a, b,d,e,x1,fa,f1:real;

ch:char;

{procedures/functions}

function f(x:real):real;

begin

f:=x*x*x-2*x*x-4*x+5;

end;

procedure OutputOfResult;

begin

clrscr;

writeln('x=',x1);

writeln('Pogreshnost rezultat =',d);

writeln ('Dlja prodolgenija nagmite lubuyu klavishu');

repeat ch:=readkey until ch<>'';

end;

{Main program}

begin

clrscr;

writeln('Vvedite po porjadku 3 chisla');

writeln('koordinaty koncov otrezka a,b, tochost epsilon');

readln(a,b,e);

if f(a)*f(b)>0

then

goto finish;

repeat

x1:=(a+b)/2;

f1:=f(x1);

if f1=0 then

begin

d:=0;

OutputOfResult;

goto finish;

end;

fa:=f(a);

if fa*f1<0 then

b:=x1

else

a:=x1;

d:=b-a;

OutputOfResult;

until d<e;

finish:

end.

Листинг программы к заданию 2,2

program ReshenieUravnenijaMetodomIteraciy;

uses crt;

var

d,e,x,x1:real;

ch:char;

{procedures/functions}

function g(x:real):real;

begin

g:=(x*x*x-2*x*x+5)/4;

end;

procedure OutputOfResult;

begin

{clrscr;}

writeln('x=',x1);

writeln('Pogreshnost pribligenija d=',d);

writeln ('Dlja prodolgenija nagmite lubuyu klavishu');

repeat ch:=readkey until ch<>'';

end;

{Main program}

begin

clrscr;

writeln('Vvedite po porjadku 2 chisla');

writeln(' Nachalnoe znachenie i tochost epsilon/10');

readln(x,e);

repeat

x1:=g(x);

d:=abs(x1-x);

outputOfresult;

x:=x1;

until d<e;

end.

Листинг программы к заданию 3

uses crt;

const

l=15;

type

parameters=array [0..6] of real;

data=array [1..l] of real;

var

i,j,k,m: integer;

d1: real;

a,b,d: parameters;

x,y,x1,y1: data;

ch: char;

{Procedures}

procedure PAUSA;

begin

writeln;

writeln ('Dlja prodolgenija nagmite lubuyu klavishu');

repeat ch:=readkey until ch <>'';

end;

{Vichislenije parametrov lineinoi funkcii

pri viravnivanii eksperimentalnih dannyh}

procedure CalculOfParameters;

var

k0,b0,a1,b1,a2,b2,f2: real;

begin

a1:=0;

b1:=0;

a2:=0;

b2:=0;

for i:=1 to m do

begin

a1:=a1+x1[i];

b1:=b1+y1[i];

a2:=a2+x1[i]*x1[i];

b2:=b2+x1[i]*y1[i];

end;

d1:=m*a2-a1*a1;

k0:=(m*b2-a1*b1)/d1;

b0:=(b1*a2-a1*b2)/d1;

d1:=0;

f2:=0;

for i:=1 to m do

begin

f2:=f2+y1[i]*y1[i];

d1:=d1+(y1[i]-k0*x1[i]-b0)*(y1[i]-k0*x1[i]-b0);

end;

d[j]:=sqrt(d1/f2);

a[j]:=k0;

b[j]:=b0;

end;

{Main Program}

begin

clrscr;

writeln ('Vvedite chislo eksperimentalnih tochek m>1');

read (m);

writeln ('Vvedite pari nacheniy xi,yi');

for i:=1 to m do

begin

read (x[i],y[i]);

{writeln(x[i],y[i]);}

end;

for j:=0 to 6 do

begin

case j of

0:

for i:=1 to m do

begin

x1[i]:=x[i];

y1[i]:=y[i];

end;

1:

for i:=1 to m do

y1[i]:=x[i]*y[i];

2:

for i:=1 to m do

y1[i]:=1/y[i];

3:

for i:=1 to m do

y1[i]:=x[i]/y[i];

4:

for i:=1 to m do

y1[i]:=ln(y[i]);

5:

for i:=1 to m do

begin

x1[i]:=ln(x[i]);

y1[i]:=y[i];

end;

6:

for i:=1 to m do

y1[i]:=y[i];

end;

CalculOfParameters;

end;

d1:=d[0];

k:=0;

for i:=1 to 6 do

if d[i]<d1 then

begin

d1:=d[i];

k:=i;

end;

write ('empirichskaja formula N',

k:1,' d=',d1:8:5);

writeln (' k=',a[k]:8:5, ' b=', b[k]:8:5);

pausa;

end.

Листинг программы к заданию 4,1

program Integration;

{vich integrala po formule Simpsona}

uses crt;

var

i,n: integer;

a,b,h,s1,s2,s3,x,x1,x2: real;

ch:char;

{procedures}

function f(x:real):real;

begin

f:=ln(x+1);

end;

procedure PAUSA;

begin

writeln;

writeln ('Dlja prodolgenija nagmite lubuyu klavishu');

repeat ch:=readkey until ch <>'';

end;

{Main program}

begin

clrscr;

writeln('vvedite znachenija koncov otrezka [a,b]');

read (a,b);

writeln ('Vvedite chislo razbieniy otrezka n');

read(n);

h:=(b-a)/n;

x1:=a+h/2;

x2:=a;

s1:=f(x1);

s2:=(f(x2)+f(b))/2;

for i:=1 to n-1 do

begin

x1:=x1+h;

x2:=x2+h;

s1:=s1+f(x1);

s2:=s2+f(x2);

end;

s1:=h*s1;

s2:=h*s2;

s3:=(2*s1+s2)/3;

writeln('s1=',s1:9:6,' s2=',s2:9:6,' s3=',s3:9:6);

pausa;

end.

Листинг программы для задания 4,2

program IntegrationbyGauss;

{vich integrala po metodu Gaussa}

uses crt;

var

i,n: integer;

a,b,c,c1,d,e,f1,f3,h,h1,s,s1,s2,x1,x2,x3: real;

ch:char;

{procedures}

function f(x:real):real;

begin

f:=ln(x+1);

end;

procedure PAUSA;

begin

writeln;

writeln ('Dlja prodolgenija nagmite lubuyu klavishu');

repeat ch:=readkey until ch <>'';

end;

{Main program}

begin

clrscr;

writeln('vvedite znachenija koncov otrezka [a,b]');

read (a,b);

writeln ('Vvedite tochnost` vichisleniya epsilon');

read(e);

c:=sqrt(3/5);

h1:=(b-a)/2;

c1:=c*h1;

x2:=(a+b)/2;

f1:=f(x2-c1);

f3:=f(x2+c1);

s1:=h1*(5*f1+8*f(x2)+5*f3)/9;

n:=2;

repeat

h:=(b-a)/n;

h1:=h/2;

c1:=c*h1;

x2:=a+h1;

X1:=X2-C1;

x3:=x2+c1;

s2:=0;

for i:=1 to n do

begin

s2:=s2+5*f(x1)+8*f(x2)+5*f(x3);

x1:=x1+h;

x2:=x2+h;

x3:=x3+h;

end;

s2:=s2*h1/9;

d:=abs(s1-s2)/63;

s1:=s2;

n:=2*n;

until d<e;

writeln ('Velichina integrala s=',s2:9:6,

' Pogreshnost` d=',d:9:6);

pausa;

end.

Листинг программы для задания 5

program DifEquationsOfirstOrder;

uses crt;

const

c:array[1..4] of real=(0,0.5,0.5,1);

type

coef=array[0..4] of real;

var

i,j,m: integer;

a,b,h,x,y,y1,y2,y3: real;

k0,k:coef;

ch: char;

{Procedures}

function f(x,y:real):real;

begin

f:=(1-y+ln(x))/x;

end;

procedure PAUSA;

begin

writeln;

writeln ('Dlja prodolgenija nagmite lubuyu klavishu');

repeat ch:=readkey until ch <>'';

end;

{Main program}

begin

clrscr;

writeln('Vvedite znachenija koncov otrezka [a,b]');

read (a,b);

writeln('vveditenachalnoe znachenie funkcii y0 pri x=x0');

read (y);

writeln ('Vvedite chislo znacheniy funkcii na promegutke (a,b]');

read(m);

x:=a;

h:=(b-a)/m;

y1:=y;

y2:=y;

y3:=y;

writeln(' Metod Eilera Metoda E-koshi Metod Runge-Koshi');

writeln ('x=',x:5:2,' y1=',y1:9:6,' y2=',y2:9:6,' y3=',y3:9:6);

for i:=1 to m do

begin

y1:=y1+h*f(x,y1); {Metod Eilera}

for j:=1 to 2 do

k0[j]:=h*f(x+2*c[j]*h,y2+2*c[j]*k0[j-1]);

y2:=y2+(k0[1]+k0[2])/2; {Metod Eilera-Koshi}

for j:=1 to 4 do {Metod runge-Kutta}

k[j]:=h*f(x+c[j]*h,y3+c[j]*k[j-1]);

y3:=y3+(k[1]+2*k[2]+2*k[3]+k[4])/6;

x:=x+h;

writeln ('x=',x:5:2,' y1=',y1:9:6,' y2=',y2:9:6,' y3=',y3:9:6);

end;

pausa

end.

60