Метод Адамса
Была задача - написать алгоритм для решения дифференциальных уравнений методом Адамса. Первые 4 точки нашёл методом Рунге-Кутта, потом написал цикл для метода Адамса. Но вот в чём проблема... по формуле, если не ошибаюсь сделал всё правильно, но результат не правильный (проверял методом Рунге-Кутта на дальнейшие точки) . Где ошибка? (первый элемент - f0, сразу находится, f1-f3 - находятся первым циклом) :
program Project1;
uses
crt;
var
x,y,x0,xn,y0,h,
k1,k2,k3,k4:real;
n,i: integer;
Fi : array of real;
function fxy(x,y: real): real;
begin
fxy:=x+cos(y/2.7);
end;
begin
Write ('Vvedite diapazon otrezka (a,b): ');
Readln(x0,xn);
Write ('Vvedite y(', x0:2:2, '): ');
Readln (y0);
Write ('Vvedite kolichestvo shagov izmenenia argumenta: ');
Readln (n);
h := (xn - x0) / n;
x := x0;
y := y0;
SetLength(Fi,n+1);
Fi[0] := fxy(x,y);
Writeln('Nachalnoe znachenie: ', ' x = ', x:4:4, ', y = ', y:4:4);
//Нахождение первых 3-ёх точек (4-тая f0) методом Рунге-Кутта
for i := 1 to 3 do
begin
k1 := h*fxy(x,y);
Write(k1:4:4);
k2 := h*fxy(x+h/2,y+k1/2);
k3 := h*fxy(x+h/2,y+k2/2);
k4 := h*fxy(x+h,y+k3);
y := y + h * (k1+2*k2+2*k3+k4) / 6;
x := x + h;
Fi := fxy(x,y);
Writeln('Shag #', i, ' , x = ', x:4:4, ', y = ', y:4:4);
readkey;
end;
//Нахождение остальных точек методом Адамса
for i := 4 to n do
begin
y := y + h * (55*Fi[i-1]-59*Fi[i-2]+37*Fi[i-3]-9*Fi[i-4])/24;
x := x + h;
Fi := fxy(x,y);
Writeln('Shag #', i, ' , x = ', x:4:4, ', y = ', y:4:4);
readkey;
end;
//Проверка другим методом
x := x0;
y := y0;
for i := 1 to n do
begin
k1 := h*fxy(x,y);
k2 := h*fxy(x+h/2,y+k1/2);
k3 := h*fxy(x+h/2,y+k2/2);
k4 := h*fxy(x+h,y+k3);
y := y + h * (k1+2*k2+2*k3+k4) / 6;
x := x + h;
Writeln('Shag #', i, ' , x = ', x:4:4, ', y = ', y:4:4);
readkey;
end;
end.
То есть первые точки по методу Рунге-Кутта находит верно, а вот составленный алгоритм метода Адамса - косячит. Но на первый взгляд - всё правильно
Ошибки везде. Ты мне еще за прошлый ответ баллов не дал..