Значит, так. Ничего про квадратурные (кратные) узлы и прочую заумь не знаю, но вот взял свою старую программу по численному интегрированию и переделал под Вашу функцию. Тут, правда, делается так: число разбиений промежутка удваивается, пока не будет достигнута нужная точность. Посмотрите, может быть пригодится:
Код:
Const
a=0.0;
b=1.0;
Function F(x:Real):Real;
begin
F:=1.0/(x+1.0);
end;
Function Antiderivative(x:Real):Real;
begin
Antiderivative:=Ln(1+x);
end;
Procedure Rectangle;
var
i,N:Integer;
Sum1,Sum2,h:Real;
begin
N:=5;
h:=(b-a)/N;
Sum1:=0;
for i:=0 to N-1 do
Sum1:=Sum1+h*F(a+h*i);
Sum2:=Sum1;
Repeat
Sum1:=Sum2;
N:=N*2;
h:=(b-a)/N;
Sum2:=0;
for i:=0 to N-1 do
Sum2:=Sum2+h*F(a+h*i);
Until ABS(Sum2-Sum1)<0.001;
WriteLn('Rectangle: ', Sum2:10:5);
end;
Procedure Trapezium;
var
i,N:Integer;
Sum1,Sum2,h:Real;
begin
N:=5;
h:=(b-a)/N;
Sum1:=(F(a)+F(b))/2*h;
for i:=1 to N-1 do
Sum1:=Sum1+h*F(a+h*i);
Sum2:=Sum1;
Repeat
Sum1:=Sum2;
N:=N*2;
h:=(b-a)/N;
Sum2:=(F(a)+F(b))/2*h;
for i:=1 to N-1 do
Sum2:=Sum2+h*F(a+h*i);
Until ABS(Sum2-Sum1)<0.001;
WriteLn('Trapezium: ', Sum2:10:5);
end;
Procedure Simpson;
var
i,N:Integer;
Sum1,Sum2,h:Real;
begin
N:=2;
h:=(b-a)/(2*N);
Sum1:=(F(a)+F(b))/3*h;
for i:=1 to N do
Sum1:=Sum1+4.0*h/3.0*F(a+h*(2*i-1));
for i:=2 to N do
Sum1:=Sum1+2.0*h/3.0*F(a+h*(2*i-2));
Sum2:=Sum1;
Repeat
Sum1:=Sum2;
N:=N*2;
h:=(b-a)/(2*N);
Sum2:=(F(a)+F(b))/3*h;
for i:=1 to N do
Sum2:=Sum2+4.0*h/3.0*F(a+h*(2*i-1));
for i:=2 to N do
Sum2:=Sum2+2.0*h/3.0*F(a+h*(2*i-2));
Until ABS(Sum2-Sum1)<0.001;
WriteLn('Simpson: ', Sum2:10:5);
end;
BEGIN
Rectangle;
Trapezium;
Simpson;
WriteLn('Accurate value:', (Antiderivative(b)-Antiderivative(a)):10:5);
ReadLn;
END.