
QUADMET
.PDF
u при этом имеет порядок малости O( 1 ):
p
k
Смысл метода особенно нагляден если n = 2; f(x) = 1. Интеграл в этом случае -площадь области D, а Sk - отношение числа тех точек P1; P2; ¢ ¢ ¢ ; Pk, котрые попали в область D, к числу всех точек. Очевидно, что это отношение приблизительно равно площади области D, поскольку площадь всего квадрата куда попадают точки, равна единице.
Привлекательность метода -в логической простоте алгоритма, который не усложняется с ростом размерности и усложнением области интегрирования. Однако в случае простых областей и узких классов функций метод проигрывает методам учитывающих эту специфику.
Вопроси для самоконтроля:
1.Построить квадратурные формулы Филона в случае n = 1; 2.
2.Привести пример функции класса C[m®;¯]; способной "одурачить"адаптивную программу.
3.Построить усложненные квадратурные формулы прямоугольников, трапеций, Симпсона.
4.Получить оценки погрешностей усложненных квадратурных формул прямоугольников, трапеций, Симпсона.
5.Получить рекуррентные формулы трапеций, Симпсона и Буля .
Задания лабораторной работы:
В лабораторной работе требуется по указанию преподавателя выполнить некоторые из следующих заданий.
1.Для заданной функция провести исследование применимости заданного метода интегрирования.
2.Для заданной функции, заданной точности и заданного интервала [®; ¯] найти численное значение интеграла:
а) составить адаптивную программу ( алгоритм оформить в виде подпрограммы );
б) провести отладку программы;
3.Вычислить указанный интеграл с помощью адаптивной подпрограммы QUANCE8 (см. приложение).
4.Сравнить результаты, полученные с помощью написанной программы
иподпрограммы QUANCE8.
5.Привести примеры функций, способных "одурачить"написанную подпрограмму.
Рекомендуемая литература:
21
1.Никольский С.М. Квадратурные формулы. П.: Наука,1988.
2.Бахвалов Н.С. Численные методы, т.1. М.: Наука,1973.
3.Самарский А.А. Введение в численные метода. М.: Наука,1982.
4.Крылов В.И. Приближенное вычисление интегралов. М.: Наука,1967.
5.Форсайт Дж., Малькольм М., Моулер К. Машинные методы математических вычислений. М.: Мир,1980.
Приложение.
Функция romberg в системе программирования MATLAB
function [quad,r,err,tol]=romberg(f,a,b,n,tol)
%Входные параметры
%f-подинтегральная функция, вводится как строка ’f’
%a и b - верхний и нижний пределы интегрирования
%n- максимальное число строк в таблице
%tol-допустимое отклонение
%Выходные параметры
%quadприближенное значение интеграла
%r- табличное значение Ромберга
%errошибка исключения
%h- наименьший шаг
m=1; h=b-a; j=0; err=1;
r=zeros(4,4);
r(1,1)=h*(feval(f,a)+feval(f,b))/2; while (( err > tol) & (j<n)) | (j<4) j=1+j;
h=h/2;
s=0;
for p=1:m x=a+h*(2*p-1); s=s+feval(f,x); end
r(j+1,1)=r(j,1)/2+s*h;
22
m=m*2; for k=1:j
r(j+1,k+1)=r(j+1,k)+( r(j+1,k)-r(j,k) )/(4^k-1); end
err= abs(r(j,j)-r(j+1,k+1)); end
quad=r(j+1,j+1)
Функция adaptsim в системе программирования MATLAB
function [quad,srmat,err]=adaptsim(f,a,b,tol)
%Входные параметры
%f- подинтегральная функция, вводимая как строка
%a и b - верхний и нижний пределы интегрирования
% tol - допустимое абсолютное отклонение
% Выходные параметры
% quad - значение квадратуры
%srmat - матрица значений
%err - ошибка вычислений
srmat=zeros(30,6);
iterating=0;
done=1;
srvec=zeros(1,6);
srvec=srule(f,a,b,tol);
srmat(1,1:6)=srvec;
m=1;
state=iterating;
while (state==iterating) n=m;
for j=n:-1:1 p=j;
sr0vec=srmat(p,:);
23
err=sr0vec(5);
tol=sr0vec(6); if (tol<=err)
state=done;
sr1vec=sr0vec;
sr2vec=sr0vec;
a=sr0vec(1);
b=sr0vec(2);
c=(a+b)/2;
err=sr0vec(5);
tol=sr0vec(6);
tol2=tol/2;
sr1vec=srule(f,a,c,tol2);
sr2vec=srule(f,c,b,tol2);
err=abs(sr0vec(3)-sr1vec(3)-sr2vec(3))/10;
if (err<tol) srmat(p,:)=sr0vec; srmat(p,4)=sr1vec(3)+sr2vec(3); srmat(p,5)=err;
else srmat(p+1:m+1,:)=srmat(p:m,:); m=m+1;
srmat(p,:)=sr1vec;
srmat(p+1,:)=sr2vec;
state=iterating; end
end end end
quad=sum(srmat(:,4));
err=sum(abs(srmat(:,5)));
srmat=srmat(1:m,1:6);
function z=srule(f,a,b,tol0) h=(b-a)/2;
24
c=zeros(1,3); c=feval(f,[a (a+b)/2 b]);
s=h*( c(1)+4*c(2)+c(3) )/3; s2=s;
tol1=tol0;
err=tol0;
z=[a b s s2 err tol1];
Подпрограмма QUANCE8 в системе программирования FORTRAN
Обращение к адаптивной подпрограмме QUANCE8 осуществляется оператором
CALL QUANCE8(FUN,A,B,ABS,REL,RES,ERR,NOF,FLAG ) Входными параметрами подпрограммы я являются:
FUN - имя внешней подпрограммы для описания интегрируемой функция;
А - нижний предел интегрирования; В - верхний предел интегрирования;
АВS - граница абсолютной погрешности приближенного значения; REL - граница относительной погрешности приближенного значения. Выходными параметрами подпрограммы являются:
RES - приближенное значение интеграла ;
ERR - оценка абсолютной погрешности приближенного значения; NOF - число потребовавшихся вычислений функции;
FLAG - индикатор надежности вычисления приближенного значения интеграла.
Так если FLAG=0, то результат, по всей видимости, имеет требуемую точность, если FLAG=60, но достаточно мало, приближенное значение все еще приемлемо. Если же значение параметра FLAG велико, то интегрируемая функция принадлежит одному из типов неприемлемых для подпрограммы. В индикаторе FLAG содержится информация о точке интервала [А,В], с которой подпрограмма не может справится, так как превышен предел количества вычислений функции на отрезка интегрирования (более 5000), либо длина подинтервала меньше значения (В-А)/230 . Точка x0 интервала [А, В], где подпрограмма встретилась с трудностью, вычисляется по формуле
x0=B-(дробная часть FLAG )*(B-A).
25
C Иллюстрирующая программа для QUANC8 C
REAL FUNCTION FUN*8(X) REAL*8 X
IF (X.EQ.0.0)FUN=1.0
IF (X.NE.0.0) FUN=DSIN(X)/X RETURN
END
C
IMPLICIT REAL*8(C,U,E,G,Z,H,F,Y,W,A,P,R,O, :D,V,Q,S,T,X,B),INTEGER*4(I,J,K,L,M,N) EXTERNAL FUN
REAL*8 A,B,ABSERR,RELERR,RESULT,ERREST,FLAG,FUN INTEGER*4 NOFUN
A=0.0
B=2 RELERR=1.0E-10 ABSERR=0.0
CALL QUANC8(FUN,A,B,ABSERR,RELERR,RESULT,
|
*ERREST,NOFUN,FLAG) |
|
|
write(*,*) ’RESULT= ’,RESULT,’ |
ERREST= ’,ERREST |
70 |
write(*,*)’NOFUN=’,NOFUN |
|
|
IF (FLAG.EQ.0.0) GO TO 100 |
|
write(*,*) ’WARNING,RESULT MAY BE UNRELIABLE’, *’ FLAG= ’, FLAG
100STOP END
SUBROUTINE QUANC8(FUN,A,B, ABSERR,RELERR,RESULT, *ERREST,NOFUN,FLAG)
IMPLICIT REAL*8(C,U,E,G,Z,H,F,Y,W,A,P,R,O, :D,V,Q,S,T,X,B),INTEGER*4(I,J,K,L,M,N)
REAL*8 FUN,A,B,ABSERR,RELERR,RESULT,ERREST,FLAG INTEGER*4 NOFUN
Cоценить интеграл для FUN(X) от a до w с заданной
Cпользователем точностью
Cавтоматическая адаптивная программа, основанная
Cна формуле Ньютона-Котеса 8-го порядка
C
26
C |
вхoдная |
инфoрмация |
C |
|
|
C |
FUN |
имя пoдпрoграммы-функции FUN(X), рeали- |
C |
|
зующeй пoдынтeгральную функцию |
Cа нижний прeдeл интeгрирoвания
CB вeрхний прeдeл интeгрирoвания (w мoжeт
C |
быть мeньшe, чeм а) |
CRELERR граница oтнoситeльнoй пoгрeшнoсти
C |
(дoлжна быть нeoтрицатeльна) |
CABSERR граница абсoлютнoй пoгрeшнoсти
C |
|
(дoлжна быть нeoтрицатeльна) |
C |
|
|
C |
выхoдная инфoрмация |
|
C |
|
|
C |
RESULT |
приближeниe к интeгралу,удoвлeтвoряющee, |
C |
|
мoжнo надeяться,мeнee жeсткoй из двух |
C |
|
границ пoгрeшнoсти |
C |
eRREST |
oцeнка вeличины дeйствитeльнoй oшибки |
C |
NOFUN |
числo значeний функции,испoльзoванных |
C |
|
при вычислeнии RESULT |
C |
FLAG |
индикатoр надeжнoсти,eсли FLAG=0,тo |
C |
|
RESULT удoвлeтвoряeт заданнoй границe |
C |
|
пoгрeшнoсти, eсли FLAG=XXX.YYY, тo |
C |
|
XXX=числo интeрвалoв, для кoтoрых |
C |
|
нe былo схoдимoсти, а YYY=часть oснoвнoгo |
C |
|
интeрвала,oставшаяся для oбрабoтки |
C |
|
в тoт мoмeнт, кoгда прoграмма при- |
C |
|
близилась к прeдeльнoму значeнию |
C |
|
для NOFUN |
|
REAL*8 W0,W1,W2,W3,W4,AREA,X0,F0,STONE,STEP, |
|
|
*COR11,TEMP |
|
|
REAL*8 QPREV,QNOW,QDIFF,QLEFT,ESTERR,TOLERR |
REAL*8 QRIGHT(31),F(16),X(16),FSAVE(8,30),XSAVE(8,30) INTEGER*4 LEVMIN,LEVMAX,LEVOUT,NOMAX,NOFIN,LEV,NIM,I,J
C
C** этап 1 ** присвoeниe начальных значeний
27
Cпeрeмeнным,нeзависящим oт интeрвала, гeнe-
Cрирoваниe кoнстант
C
LEVMIN=1
LEVMAX=30
LEVOUT=6
NOMAX=5000 NOFIN=NOMAX-8*(LEVMAX-LEVOUT+2**(LEVOUT+1))
C
Ceсли NOFUN дoстигаeт значeния NOFIN, TO TREWOGA
W0=3956.0/14175.0
W1=23552.0/14175.0 W2=-3712.0/14175.0 W3=41984.0/14175.0 W4=-18160.0/14175.0
Cприсвoить нулeвыe значeния пeрeмeнным суммам
C
FLAG=0.0
RESULT=0.0
COR11=0.0
ERREST=0.0
AREA=0.0
NOFUN=0
IF (A.EQ.B) RETURN
C
C** этап 2 ** присвoeниe начальных значeний пeрeмeнным,
Cзависящим oт интeрвала,в сooтвeтствии с пeрвым интeр-
Cвалoм
C
LEV=0
NIM=1
X0=A
X(16)=B
QPREV=0.0
F0=FUN(X0)
STONE=(B-A)/16.0
X(8)=(X0+X(16))/2.0
28
X(4)=(X0+X(8))/2.0
X(12)=(X(8)+X(16))/2.0
X(2)=(X0+X(4))/2.0
X(6)=(X(4)+X(8))/2.0
X(10)=(X(8)+X(12))/2.0
X(14)=(X(12)+X(16))/2.0
DO 25 J=2,16,2
F(J)=FUN(X(J))
25CONTINUE NOFUN=9
C
C** этап 3 ** oснoвныe вычислeния
Cтрeбуются QPREV,X0,X2,X4,...,X16,F0,F2,F4,...,F16
Cвычисляются X1,X3,...,X15,F1,F3,...,F15,QLEFT,
CQRIGHT,QNOW,QDIFF,AREA
C |
|
30 |
X(1)=(X0+X(2))/2.0 |
|
F(1)=FUN(X(1)) |
|
DO 35 J=3,15,2 |
|
X(J)=(X(J-1)+X(J+1))/2.0 |
|
F(J)=FUN(X(J)) |
35 |
CONTINUE |
|
NOFUN=NOFUN+8 |
|
STEP=(X(16)-X0)/16.0 |
|
QLEFT=(W0*(F0+F(8))+W1*(F(1)+F(7))+W2*(F(2)+ |
|
* F(6))+W3*(F(3)+F(5))+W4*F(4))*STEP |
|
QRIGHT(LEV+1)=(W0*(F(8)+F(16))+W1*(F(9)+F(15))+ |
|
* W2*(F(10)+F(14))+W3*(F(11)+F(13))+W4*F(12))*STEP |
|
QNOW=QLEFT+QRIGHT(LEV+1) |
|
QDIFF=QNOW-QPREV |
|
AREA=AREA+QDIFF |
C |
|
C |
** этап 4 ** прoвeрка схoдимoсти для интeрвала |
C |
|
|
ESTERR=DABS(QDIFF)/1023.0 |
|
TOLERR=DMAX1(ABSERR,RELERR*DABS(AREA))*(STEP/STONE) |
|
TOLERR=RELERR*DABS(AREA) |
|
IF(ABSERR.GT.TOLERR) TOLERR=ABSERR |
|
TOLERR=TOLERR*STEP/STONE |
29
IF (LEV.LT.LEVMIN) GO TO 50
IF (LEV.GE.LEVMAX) GO TO 62
IF (NOFUN.GT.NOFIN) GOTO 60
IF (ESTERR.LE.TOLERR) GO TO 70
C
C** этап 5 ** схoдимoсти нeт
Cустанoвить слeдующий интeрвал
50 NIM=2*NIM LEV=LEV+1
Cзапoмнить элeмeнты, oтнoсящиeся к правoй пoлoвинe
Cинтeрвала,для будующeгo испoльзoвания
C
DO 52 I=1,8 FSAVE(I,LEV)=F(I+8) XSAVE(I,LEV)=X(I+8)
52 CONTINUE
C
Cсoбрать элeмeнты,oтнoсящиeся к лeвoй пoлoвинe
Cинтeрвала, для нeмeдлeннoгo испoльзoвания
C
QPREV=QLEFT
DO 55 I=1,8
J=-I
F(2*J+18)=F(J+9)
X(2*J+18)=X(J+9)
55CONTINUE GO TO 30
C
C** этап 6 ** "пoжарный" раздeл
Cчислo значeний функции близкo к тoму, чтoбы
Cпрeвысить устанoвлeнный прeдeл
C
60NOFIN=2*NOFIN
LEVMAX=LEVOUT FLAG=FLAG+(B-X0)/(B-A) GO TO 70
C
30