Цитата:
Сообщение от nasty111
Извините, нужно написать на Pascal.
|
Тогда получите. Между прочим, в задании не хватает еще кое-чего, а именно промежутка, в котором следует рассчитать значения функции. Указание такого промежутка в методе Рунге-Кутты является обязательным. А раз он не указан, то я волевым усилием ставлю интервал [0..1].
Код:
VAR
Xbef,Ybef,Xaft,Yaft,H,K1,K2,K3,K4:Real;
i,N:Word;
Function F(Xf,Yf:Real):Real;
begin
F:=Yf-Xf;
end;
Function fK1(Xk,Yk:Real):Real;
begin
fK1:=F(Xk,Yk);
end;
Function fK2(Xk,Yk,Hk:Real):Real;
begin
fK2:=F(Xk+Hk/2,Yk+Hk/2*fK1(Xk,Yk));
end;
Function fK3(Xk,Yk,Hk:Real):Real;
begin
fK3:=F(Xk+Hk/2,Yk+Hk/2*fK2(Xk,Yk,Hk));
end;
Function fK4(Xk,Yk,Hk:Real):Real;
begin
fK4:=F(Xk+Hk,Yk+Hk*fK3(Xk,Yk,Hk));
end;
Function Y_acc(X_acc:Real):Real;
begin
Y_acc:=0.5*Exp(X_acc)+X_acc+1;
end;
BEGIN
H:=0.1;
N:=Round(1/H);
Xbef:=0;
Ybef:=1.5;
WriteLn(' X Y Y_accur');
Writeln(Xbef:4:2,Ybef:15:5, Y_acc(Xbef):15:5);
For i:=1 to N do
begin
Xaft:=Xbef+H;
K1:=fK1(Xbef,Ybef);
K2:=fK2(Xbef,Ybef,H);
K3:=fK3(Xbef,Ybef,H);
K4:=fK4(Xbef,Ybef,H);
Yaft:=Ybef+H/6*(K1+2.0*K2+2.0*K3+K4);
Writeln(Xaft:4:2,Yaft:15:5, Y_acc(Xaft):15:5);
Xbef:=Xaft;
Ybef:=Yaft;
end;
ReadLn;
END.
Во втором столбце появляется результат расчета методом Рунге-Кутты, в третьем (для сравнения) - по точной формуле.