Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

QUADMET

.PDF
Скачиваний:
42
Добавлен:
27.03.2015
Размер:
329.94 Кб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]