Вычисление интеграла методом Чебышева (n=3)
.docМинистерство образования РФ
Пермский Государственный Технический Университет
Кафедра Автоматики и Телемеханики
Лабораторная работа № 2
Создание адаптивного квадратурного алгоритма.
Метод Чебышева
Выполнил:
Студент гр. КРЭС-05
Гайнуллин Р.
Проверил:
Преподаватель
Леготкина Т. С.
2007
Задание:
Вычислить интеграл методом Чебышева для n=3, с погрешностью зад=0,001.
Текст программы:
{Программа вычисляет интеграл методом Чебышева в адаптивном алгоритме}
Uses Crt;
Const b=1;a=0;e=0.001;t=0.7071;
function f(x:extended):extended;
begin
f:=(x*x*x)*(1-x)*(1-x)*(1-x)*(1-x)*(1-x);
end;
{Основная программа}
Var
xl,xm,xr,x,Theb1,Theb2 :extended; {Значение x на краях отрезка и посередине}
S,P,Q,h,ee:extended; {Значение интеграла }
ei,hi,Qi:array[1..1000]of extended;
xl1,xm1,xr1,x1 :extended; {Значение x на краях отрезка и посередине}
S1,P1,Q1,h1,ee1:extended; {Значение интеграла}
ei1,hi1,Qi1:array[1..1000]of extended;
i,j:byte;
function Theb(a1,b1:extended):extended;
var x1,x2,x3:extended;
begin
x1:=(b1+a1)/2-(b1-a1)*(-t)/2;
x3:=(b1+a1)/2+(b1-a1)*t/2;
x2:=(b1+a1)/2;
Theb2:=(0.333*((b-a)/2)*(f(x1)+f(x2)+f(x3)));
Theb1:=Theb1+Theb2;
Theb:=Theb2; end;
BEGIN
Theb1:=0;Theb2:=0;
ClrScr;
Writeln('Вычисление интеграла без банкирования');
WriteLn('j':5, '|', 'h(i)':17,'Q(i)':21,'e(i)':17);
WriteLn('-----------------------------------------------------------------------------');
xl:=a;xr:=b;i:=0;
Repeat {Цикл поиска отрезка, удовлетворяющего неравенству}
repeat h:=xr-xl; {Размер отрезка}
P:=Theb(xl, xr); {1*h}
xm:=(xl+xr)/2; {Середина отрезка}
Q:=Theb(xl, xm)+Theb(xm, xr); 2*h x:=xr; {х-равен a}
xr:=xm; {xr-равен середине отрезка}
ee:=Abs(P-Q)/63 {выч-ем погрешность на этом участке}
until ee<=h*e/(b-a); {Если погрешность меньше}
i:=i+1;
Qi[i]:=Q; {Значение интеграла на отрезке}
hi[i]:=h; {размер этого отрезка}
ei[i]:=ee; {погрешность на отрезке}
xl:=xm; {присваиваем началу отрезка новое значение}
xr:=b {присваиваем концу отрезка значение b}
until xl>=b-h; {переход к следующему отрезку}
h:=0;S:=0;ee:=0;
for j:=1to i do begin if (j div 5)=0
then
WriteLn(j:5, '|', hi[j], '|', Qi[j], '|', ei[j]); S:=S+Qi[j];
h:=h+hi[j];
ee:=ee+ei[j]
end;
WriteLn('-----------------------------------------------------------------------------');
WriteLn(' ':5, ' ', h:5:5, ' | ', S:7:7, ' | ' , ee:5:5); WriteLn;
WriteLn('Задана погрешность : ',e:5:5);
WriteLn('Значение интеграла : ',S:7:7);
readln; xl1:=a;xr1:=b;i:=0;
Repeat {Цикл поиска отрезка,удовлетворяющего неравенству}
repeat h1:=xr1-xl1; {Размер отрезка}
P1:=Theb(xl1, xr1);
xm1:=(xl1+xr1)/2;
Q1:=Theb(xl1, xm1)+Theb(xm1, xr1);
x1:=xr1;
xr1:=xm1;
ee1:=Abs(P1-Q1)/63
until ee1<=h1*e/(b-a);
i:=i+1;
Qi1[i]:=Q1;
hi1[i]:=h1;
ei1[i]:=ee1;
xl1:=x1;
xr1:=b
until xl1>=b-h1;
h1:=0;
S1:=0;
ee1:=0;
Writeln('Вычисление интеграла c банкированием');
WriteLn('j':5, '|', 'h(i)':17,'Q(i)':21,'e(i)':17);
WriteLn('-------------------------------------------------------------------------------');
for j:=1to i do
begin
S1:=S1+Qi1[j];
h1:=h1+hi1[j];
ei1[j+1]:=ei1[j+1]+ei1[j];
ee1:=ee1+ei1[j];
WriteLn(j:5, '|', hi1[j], '|', Qi1[j], '|', ei1[j]*10);
end;
WriteLn('-------------------------------------------------------------------------------');
WriteLn(' ':5, ' ', h1:5:5, ' | ', S1:5:5, ' | ' , ee1*10:5:5);
WriteLn('Задана погрешность : ',e:5:5);
WriteLn('Значение интеграла : ',S1:5:5);
readln
END.