{iterint2.pas}
uses crt ;
function f(x:real):real;
begin
f:=x*x;
end;
var
i,j,n :longint;
x,x0,x1,dx,int,int2
:real;
begin clrscr;
x0:=1;
x1:=2;
n:=2;
dx:=(x1-x0)/n;
int2:=0;
for i:=0 to n-1 do int2:=int2 +f(x0+i*dx)*dx;
for j:=1 to 21 do
BEGIN n:=n*2 ;
int:=int2/2;
dx:=(x1-x0)/n;
int2:=0;
for i:=0 to n-1 do
if odd(i) then int2:=int2 +f(x0+i*dx)*dx;
int2:=int2+int;
writeln('Int2=',int2:12:6);
END;
if readkey=#3 then; end.
Но ведь все знают, что методов прямоугольников два: один – метод левых прямоугольников, второй – метод правых прямоугольников.
Значение суммы правых (intR) чуть отличается от суммы левых прям-ов (int2):
intR = int2 –F(x0) + F(x1)
Пришлось добавить кое-что в программу:
{iterint3.pas}
uses crt ;
function f(x:real):real;
begin
f:=x*x;
end;
var
i,j,n :longint;
x,x0,x1,dx,int,int2,intR
:real;
begin clrscr;
x0:=1;
x1:=2;
n:=2;
dx:=(x1-x0)/n;
int2:=0;
for i:=0 to n-1 do int2:=int2 +f(x0+i*dx)*dx;
for j:=1 to 21 do
BEGIN n:=n*2 ;
int:=int2/2;
dx:=(x1-x0)/n;
int2:=0;
for i:=0 to n-1 do
if odd(i) then int2:=int2 +f(x0+i*dx)*dx;
int2:=int2+int;
intR:=int2-f(x0)*dx+f(x1)*dx;
writeln('Int2=',int2:12:6,' intr=',intR:12:6);
END;
if readkey=#3 then; end.
После чего осталось совсем ничего: добавить точность (параметр t ) и изменить цикл:
{iterint4.pas}
uses crt ;
function f(x:real):real;
begin
f:=x*x;
end;
var
i,j,n :longint;
x,x0,x1,dx,int,int2,intR,t
:real;
begin clrscr;
t:=0.001;
x0:=1;
x1:=2;
n:=2;
dx:=(x1-x0)/n;
int2:=0;
for i:=0 to n-1 do int2:=int2 +f(x0+i*dx)*dx;
repeat
n:=n*2 ;
int:=int2/2;
dx:=(x1-x0)/n;
int2:=0;
for i:=0 to n-1 do
if odd(i) then int2:=int2 +f(x0+i*dx)*dx;
int2:=int2+int;
intR:=int2-f(x0)*dx+f(x1)*dx;
until abs(int2-intR)<t;
writeln('Int2=',int2:12:6,' intr=',intR:12:6);
if readkey=#3 then; end.
Получилась хорошая программа, которая мне и сейчас нравится…
А вообще… скажу я честно: этот метод – самый лучший!
Павел Сапунов
|