Составление процедуры численного решения задачи Коши для уравнения. Тестирование программы VM43.CPP, страница 2


приложение 1

ТЕКСТ ПРОГРАММЫvm43.cpp

program lab43vm;

uses crt;

const a1  = 0;

a2  = 0;

b1  = 6;

b2  = 2;

h0  = 0.1;

y01 = 0;

y02 = 0;

y10 = 3;

eps = 0.0001;

eps1 = 0.001;

var i, j, k : integer;

metod : integer;

toch : real;

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

begin

f1 := 6*x - y;

end;

function f2(x, y, y1 : real) : real;

begin

{ f2 := 3 * ArcTan((1-y1)/sqrt(1 - sqr(1 - y1)))-y-2*x;{}

{ f2 := y*y+y1*y1-1-sin(x);{}

{ f2 := ln(y)+y1-x; {}

{ f2 := y*y + y1*y1 - 1 - sin(x);{}

{ f2 := 1/y1 - sqrt(y)+ (2*x*x+8*x+5)/(2*x+2);{}

f2 := (y1-cos(x))*x-y;

end;

function rc41(h : real) : real;

var k1, k2, k3, k4, x, y : real;

begin

x := a1;

y := y01;

repeat

k1  := h * f1(x, y);

k2  := h * f1(x + h/2, y + k1/2);

k3  := h * f1(x + h/2, y + k2/2);

k4  := h * f1(x + h, y + k3);

y   := y + (k1 + 2*k2 + 2*k3 + k4)/6;

x   := x + h;

i   := i + 1;

until abs(b1-x) < eps*0.1;

rc41 := y;

end;

function rc42(h : real) : real;

var x, y, y1, k11, k12, k21, k22, k31, k32, k41, k42 : real;

j:word;

begin

x  := a2;

y  := y02;

y1 := y10;

repeat

k11 := h * y1;

k12 := h * f2(x, y, y1);

k21 := h * (y1 + k12 / 2);

k22 := h * f2(x + h/2, y + k11/2, y1 + k12/2);

k31 := h * (y1 + k22/2);

k32 := h * f2(x + h/2, y + k21/2, y1 + k22/2);

k41 := h * (y1 + k32);

k42 := h * f2(x + h, y + k31, y1 + k32);

y   := y +  (k11 + 2*k21 + 2*k31 + k41)/6;

y1  := y1 + (k12 + 2*k22 + 2*k32 + k42)/6;

x   := x + h;

i   := i + 1;

until abs(b2-x) < eps*0.1;

rc42 := y;

end;

function rc21(h : real) : real;

var x, y, y1_2 : real;

begin

x := a1;

y := y01;

repeat

y1_2 := y + (h/2)*f1(x, y);

y    := y + h * f1(x + h/2, y1_2);

x    := x + h;

i    := i + 1;

until abs(b1-x) < eps*0.1;

rc21 := y;

end;

function rc22(h : real) : real;

var x, y, y1, k11, k12, k21, k22, k31, k32 : real;

begin

x  := a2;

y  := y02;

y1 := y10;

repeat

k11 := h * y1;

k12 := h * f2(x, y, y1);

k21 := h * (y1 + k12 / 2);

k22 := h * f2(x + h/2, y + k11/2, y1 + k12/2);

k31 := h * (y1 - k12 + 2*k22);

k32 := h * f2(x + h, y - k11 + 2*k21, y1 - k12 + 2*k22);

y   := y +  (k11 + 4*k21 + k31)/6;

y1  := y1 + (k12 + 4*k22 + k32)/6;

x   := x + h;

i   := i + 1;

until abs(b2-x) < eps*0.1;

rc22 := y;

end;

procedure Runge_Cutta;

var x, y_Old, y_New, h : real;

begin

h  := h0;

case (metod) of

1 : begin y_New := rc41(h); k:=15; end;

2 : begin y_New := rc21(h); k:=3; end;

3 : begin y_New := rc42(h); k:=15; end;

4 : begin y_New := rc22(h); k:=7; end;

end;

i := 0;

repeat

y_Old := y_New;

h := h/2 ;

case (metod) of

1 : y_New := rc41(h);

2 : y_New := rc21(h);

3 : y_New := rc42(h);

4 : y_New := rc22(h);

end;

until abs((y_Old - y_New)/k) < eps;

case (metod) of

1 : writeln('Метод Рунге-Кутта 41 : ',y_New:6:7);

2 : writeln('Метод Рунге-Кутта 21 : ',y_New:6:7);

3 : writeln('Метод Рунге-Кутта 42 : ',y_New:6:7);

4 : writeln('Метод Рунге-Кутта 32 : ',y_New:6:7);

end;

end;

procedure KonRaz;

var P, Q : array[1..10] of real;

h, x, y : real;

begin

h := h0;

i := 0;

P[1] := 0.5 / (h + 0.5);

Q[1] := (2 * h) / (h + 0.5);

x    := 1;

for j := 2 to trunc(0.3/h) do

begin

x := x + h;

i := i + 1;

P[j] := (1/(h*h)-1/(2*h)) / ((2/(h*h)-2/x)(1/(h*h)+1/(2*h))*P[j-1]);

Q[j] := ((1/(h*h)+1/(2*h))*Q[j-1]-(x+0.4)) /

((2/(h*h)-2/x)-(1/(h*h)+1/(2*h))*P[j-1]);

end;

y:=Q[j];

for j := (trunc(0.3/h) - 1) downto 1 do

begin

y := y * P[j] + Q[j];

i := i + 1;

end;

writeln('Решение краевой задачи : ', y:6:7);

end;

begin

clrscr;

metod := 1;

{writeln('----------¦ МЕТОД РУНГЕ-КУТТА 4 ¦----------');    }

Runge_Cutta;

toch := 6 * exp(-b1) + 6 * b1 - 6;

writeln('Точное значение      : ', toch:6:7);

writeln('Точность вычислений  :  ', eps:6:7);

writeln('Количество итераций  : ', i);

writeln('-------------------------------------------');

metod := 2;

{ writeln('----------¦ МЕТОД РУНГЕ-КУТТА 2 ¦----------'); }

Runge_Cutta;

writeln('Точное значение      : ', toch:6:7);

writeln('Точность вычислений  :  ', eps:6:7);

writeln('Количество итераций  : ', i);

writeln('-------------------------------------------');

writeln;

metod := 3;

{ writeln('----------¦ МЕТОД РУНГЕ-КУТТА 4 ¦----------'); }

Runge_Cutta;

writeln('Точность вычислений  : ', eps:6:7);

writeln('Количество итераций  : ', i);

writeln('-------------------------------------------');

metod := 4;

{ writeln('----------¦ МЕТОД РУНГЕ-КУТТА 3 ¦----------');}

Runge_Cutta;

writeln('Точность вычислений  : ', eps:6:7);

writeln('Количество итераций  : ', i);

writeln('-------------------------------------------');

writeln;

KonRaz;

writeln('Точность вычислений    : ', eps1:6:7);

writeln('Количество итераций    : ', i);

write('-------------------------------------------');

readln

end.