приложение 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.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.