Цитата:
Сообщение от Darik102rus
С помощью формулы Симпсона вычислить интеграл:
|
С помощью формулы Симпсона ВЫЧИСЛЕН интеграл! Да еще (для сравнения) вычислено точное значение, благо интеграл - берущийся. Формат вывода построен так, что в численном решении отображается число значащих цифр, определяемое заданной точностью.
Код:
Const
a=0.1;
b=0.8;
Var
z,Eps:Real;
Function F(p,q:Real):Real;
begin
F:=p*p/Sqr(p*p*p+q*q*q);
end;
Function Antiderivative(p,q:Real):Real;
begin
Antiderivative:=-1.0/3/(p*p*p+q*q*q);
end;
Procedure Simpson;
var
i,N:Integer;
Sum1,Sum2,h:Real;
begin
N:=2;
h:=(b-a)/(2*N);
Sum1:=(F(a,z)+F(b,z))/3*h;
for i:=1 to N do
Sum1:=Sum1+4.0*h/3.0*F(a+h*(2*i-1),z);
for i:=2 to N do
Sum1:=Sum1+2.0*h/3.0*F(a+h*(2*i-2),z);
Sum2:=Sum1;
Repeat
Sum1:=Sum2;
N:=N*2;
h:=(b-a)/(2*N);
Sum2:=(F(a,z)+F(b,z))/3*h;
for i:=1 to N do
Sum2:=Sum2+4.0*h/3.0*F(a+h*(2*i-1),z);
for i:=2 to N do
Sum2:=Sum2+2.0*h/3.0*F(a+h*(2*i-2),z);
Until ABS(Sum2-Sum1)<Eps;
WriteLn('Simpson: ', Sum2:0:(Round(-Ln(Eps)/Ln(10))+1));
end;
Begin
Write('z = ');
Readln(z);
Write('Eps = ');
Readln(Eps);
Simpson;
WriteLn('Accurate value: ', (Antiderivative(b,z)-Antiderivative(a,z)):0:8);
ReadLn;
End.