GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
dqagie.f
Go to the documentation of this file.
1 SUBROUTINE dqagie(F,BOUND,INF,EPSABS,EPSREL,LIMIT,RESULT,ABSERR,
2 * NEVAL,IER,ALIST,BLIST,RLIST,ELIST,IORD,LAST)
3C***BEGIN PROLOGUE DQAGIE
4C***DATE WRITTEN 800101 (YYMMDD)
5C***REVISION DATE 830518 (YYMMDD)
6C***CATEGORY NO. H2A3A1,H2A4A1
7C***KEYWORDS AUTOMATIC INTEGRATOR, INFINITE INTERVALS,
8C GENERAL-PURPOSE, TRANSFORMATION, EXTRAPOLATION,
9C GLOBALLY ADAPTIVE
10C***AUTHOR PIESSENS,ROBERT,APPL. MATH & PROGR. DIV - K.U.LEUVEN
11C DE DONCKER,ELISE,APPL. MATH & PROGR. DIV - K.U.LEUVEN
12C***PURPOSE THE ROUTINE CALCULATES AN APPROXIMATION RESULT TO A GIVEN
13C INTEGRAL I = INTEGRAL OF F OVER (BOUND,+INFINITY)
14C OR I = INTEGRAL OF F OVER (-INFINITY,BOUND)
15C OR I = INTEGRAL OF F OVER (-INFINITY,+INFINITY),
16C HOPEFULLY SATISFYING FOLLOWING CLAIM FOR ACCURACY
17C ABS(I-RESULT).LE.MAX(EPSABS,EPSREL*ABS(I))
18C***DESCRIPTION
19C
20C INTEGRATION OVER INFINITE INTERVALS
21C STANDARD FORTRAN SUBROUTINE
22C
23C F - SUBROUTINE F(X,IERR,RESULT) DEFINING THE INTEGRAND
24C FUNCTION F(X). THE ACTUAL NAME FOR F NEEDS TO BE
25C DECLARED E X T E R N A L IN THE DRIVER PROGRAM.
26C
27C BOUND - DOUBLE PRECISION
28C FINITE BOUND OF INTEGRATION RANGE
29C (HAS NO MEANING IF INTERVAL IS DOUBLY-INFINITE)
30C
31C INF - DOUBLE PRECISION
32C INDICATING THE KIND OF INTEGRATION RANGE INVOLVED
33C INF = 1 CORRESPONDS TO (BOUND,+INFINITY),
34C INF = -1 TO (-INFINITY,BOUND),
35C INF = 2 TO (-INFINITY,+INFINITY).
36C
37C EPSABS - DOUBLE PRECISION
38C ABSOLUTE ACCURACY REQUESTED
39C EPSREL - DOUBLE PRECISION
40C RELATIVE ACCURACY REQUESTED
41C IF EPSABS.LE.0
42C AND EPSREL.LT.MAX(50*REL.MACH.ACC.,0.5D-28),
43C THE ROUTINE WILL END WITH IER = 6.
44C
45C LIMIT - INTEGER
46C GIVES AN UPPER BOUND ON THE NUMBER OF SUBINTERVALS
47C IN THE PARTITION OF (A,B), LIMIT.GE.1
48C
49C ON RETURN
50C RESULT - DOUBLE PRECISION
51C APPROXIMATION TO THE INTEGRAL
52C
53C ABSERR - DOUBLE PRECISION
54C ESTIMATE OF THE MODULUS OF THE ABSOLUTE ERROR,
55C WHICH SHOULD EQUAL OR EXCEED ABS(I-RESULT)
56C
57C NEVAL - INTEGER
58C NUMBER OF INTEGRAND EVALUATIONS
59C
60C IER - INTEGER
61C IER = 0 NORMAL AND RELIABLE TERMINATION OF THE
62C ROUTINE. IT IS ASSUMED THAT THE REQUESTED
63C ACCURACY HAS BEEN ACHIEVED.
64C IER.GT.0 ABNORMAL TERMINATION OF THE ROUTINE. THE
65C ESTIMATES FOR RESULT AND ERROR ARE LESS
66C RELIABLE. IT IS ASSUMED THAT THE REQUESTED
67C ACCURACY HAS NOT BEEN ACHIEVED.
68C IER.LT.0 EXIT REQUESTED FROM USER-SUPPLIED
69C FUNCTION.
70C
71C ERROR MESSAGES
72C IER = 1 MAXIMUM NUMBER OF SUBDIVISIONS ALLOWED
73C HAS BEEN ACHIEVED. ONE CAN ALLOW MORE
74C SUBDIVISIONS BY INCREASING THE VALUE OF
75C LIMIT (AND TAKING THE ACCORDING DIMENSION
76C ADJUSTMENTS INTO ACCOUNT). HOWEVER,IF
77C THIS YIELDS NO IMPROVEMENT IT IS ADVISED
78C TO ANALYZE THE INTEGRAND IN ORDER TO
79C DETERMINE THE INTEGRATION DIFFICULTIES.
80C IF THE POSITION OF A LOCAL DIFFICULTY CAN
81C BE DETERMINED (E.G. SINGULARITY,
82C DISCONTINUITY WITHIN THE INTERVAL) ONE
83C WILL PROBABLY GAIN FROM SPLITTING UP THE
84C INTERVAL AT THIS POINT AND CALLING THE
85C INTEGRATOR ON THE SUBRANGES. IF POSSIBLE,
86C AN APPROPRIATE SPECIAL-PURPOSE INTEGRATOR
87C SHOULD BE USED, WHICH IS DESIGNED FOR
88C HANDLING THE TYPE OF DIFFICULTY INVOLVED.
89C = 2 THE OCCURRENCE OF ROUNDOFF ERROR IS
90C DETECTED, WHICH PREVENTS THE REQUESTED
91C TOLERANCE FROM BEING ACHIEVED.
92C THE ERROR MAY BE UNDER-ESTIMATED.
93C = 3 EXTREMELY BAD INTEGRAND BEHAVIOUR OCCURS
94C AT SOME POINTS OF THE INTEGRATION
95C INTERVAL.
96C = 4 THE ALGORITHM DOES NOT CONVERGE.
97C ROUNDOFF ERROR IS DETECTED IN THE
98C EXTRAPOLATION TABLE.
99C IT IS ASSUMED THAT THE REQUESTED TOLERANCE
100C CANNOT BE ACHIEVED, AND THAT THE RETURNED
101C RESULT IS THE BEST WHICH CAN BE OBTAINED.
102C = 5 THE INTEGRAL IS PROBABLY DIVERGENT, OR
103C SLOWLY CONVERGENT. IT MUST BE NOTED THAT
104C DIVERGENCE CAN OCCUR WITH ANY OTHER VALUE
105C OF IER.
106C = 6 THE INPUT IS INVALID, BECAUSE
107C (EPSABS.LE.0 AND
108C EPSREL.LT.MAX(50*REL.MACH.ACC.,0.5D-28),
109C RESULT, ABSERR, NEVAL, LAST, RLIST(1),
110C ELIST(1) AND IORD(1) ARE SET TO ZERO.
111C ALIST(1) AND BLIST(1) ARE SET TO 0
112C AND 1 RESPECTIVELY.
113C
114C ALIST - DOUBLE PRECISION
115C VECTOR OF DIMENSION AT LEAST LIMIT, THE FIRST
116C LAST ELEMENTS OF WHICH ARE THE LEFT
117C END POINTS OF THE SUBINTERVALS IN THE PARTITION
118C OF THE TRANSFORMED INTEGRATION RANGE (0,1).
119C
120C BLIST - DOUBLE PRECISION
121C VECTOR OF DIMENSION AT LEAST LIMIT, THE FIRST
122C LAST ELEMENTS OF WHICH ARE THE RIGHT
123C END POINTS OF THE SUBINTERVALS IN THE PARTITION
124C OF THE TRANSFORMED INTEGRATION RANGE (0,1).
125C
126C RLIST - DOUBLE PRECISION
127C VECTOR OF DIMENSION AT LEAST LIMIT, THE FIRST
128C LAST ELEMENTS OF WHICH ARE THE INTEGRAL
129C APPROXIMATIONS ON THE SUBINTERVALS
130C
131C ELIST - DOUBLE PRECISION
132C VECTOR OF DIMENSION AT LEAST LIMIT, THE FIRST
133C LAST ELEMENTS OF WHICH ARE THE MODULI OF THE
134C ABSOLUTE ERROR ESTIMATES ON THE SUBINTERVALS
135C
136C IORD - INTEGER
137C VECTOR OF DIMENSION LIMIT, THE FIRST K
138C ELEMENTS OF WHICH ARE POINTERS TO THE
139C ERROR ESTIMATES OVER THE SUBINTERVALS,
140C SUCH THAT ELIST(IORD(1)), ..., ELIST(IORD(K))
141C FORM A DECREASING SEQUENCE, WITH K = LAST
142C IF LAST.LE.(LIMIT/2+2), AND K = LIMIT+1-LAST
143C OTHERWISE
144C
145C LAST - INTEGER
146C NUMBER OF SUBINTERVALS ACTUALLY PRODUCED
147C IN THE SUBDIVISION PROCESS
148C
149C***REFERENCES (NONE)
150C***ROUTINES CALLED D1MACH,DQELG,DQK15I,DQPSRT
151C***END PROLOGUE DQAGIE
152 DOUBLE PRECISION ABSEPS,ABSERR,ALIST,AREA,AREA1,AREA12,AREA2,A1,
153 * a2,blist,boun,bound,b1,b2,correc,dabs,defabs,defab1,defab2,
154 * dmax1,dres,d1mach,elist,epmach,epsabs,epsrel,erlarg,erlast,
155 * errbnd,errmax,error1,error2,erro12,errsum,ertest,oflow,resabs,
156 * reseps,result,res3la,rlist,rlist2,small,uflow
157 INTEGER ID,IER,IERRO,INF,IORD,IROFF1,IROFF2,IROFF3,JUPBND,K,KSGN,
158 * ktmin,last,limit,maxerr,neval,nres,nrmax,numrl2
159 LOGICAL EXTRAP,NOEXT
160C
161 dimension alist(limit),blist(limit),elist(limit),iord(limit),
162 * res3la(3),rlist(limit),rlist2(52)
163C
164 EXTERNAL f
165C
166C THE DIMENSION OF RLIST2 IS DETERMINED BY THE VALUE OF
167C LIMEXP IN SUBROUTINE DQELG.
168C
169C
170C LIST OF MAJOR VARIABLES
171C -----------------------
172C
173C ALIST - LIST OF LEFT END POINTS OF ALL SUBINTERVALS
174C CONSIDERED UP TO NOW
175C BLIST - LIST OF RIGHT END POINTS OF ALL SUBINTERVALS
176C CONSIDERED UP TO NOW
177C RLIST(I) - APPROXIMATION TO THE INTEGRAL OVER
178C (ALIST(I),BLIST(I))
179C RLIST2 - ARRAY OF DIMENSION AT LEAST (LIMEXP+2),
180C CONTAINING THE PART OF THE EPSILON TABLE
181C WICH IS STILL NEEDED FOR FURTHER COMPUTATIONS
182C ELIST(I) - ERROR ESTIMATE APPLYING TO RLIST(I)
183C MAXERR - POINTER TO THE INTERVAL WITH LARGEST ERROR
184C ESTIMATE
185C ERRMAX - ELIST(MAXERR)
186C ERLAST - ERROR ON THE INTERVAL CURRENTLY SUBDIVIDED
187C (BEFORE THAT SUBDIVISION HAS TAKEN PLACE)
188C AREA - SUM OF THE INTEGRALS OVER THE SUBINTERVALS
189C ERRSUM - SUM OF THE ERRORS OVER THE SUBINTERVALS
190C ERRBND - REQUESTED ACCURACY MAX(EPSABS,EPSREL*
191C ABS(RESULT))
192C *****1 - VARIABLE FOR THE LEFT SUBINTERVAL
193C *****2 - VARIABLE FOR THE RIGHT SUBINTERVAL
194C LAST - INDEX FOR SUBDIVISION
195C NRES - NUMBER OF CALLS TO THE EXTRAPOLATION ROUTINE
196C NUMRL2 - NUMBER OF ELEMENTS CURRENTLY IN RLIST2. IF AN
197C APPROPRIATE APPROXIMATION TO THE COMPOUNDED
198C INTEGRAL HAS BEEN OBTAINED, IT IS PUT IN
199C RLIST2(NUMRL2) AFTER NUMRL2 HAS BEEN INCREASED
200C BY ONE.
201C SMALL - LENGTH OF THE SMALLEST INTERVAL CONSIDERED UP
202C TO NOW, MULTIPLIED BY 1.5
203C ERLARG - SUM OF THE ERRORS OVER THE INTERVALS LARGER
204C THAN THE SMALLEST INTERVAL CONSIDERED UP TO NOW
205C EXTRAP - LOGICAL VARIABLE DENOTING THAT THE ROUTINE
206C IS ATTEMPTING TO PERFORM EXTRAPOLATION. I.E.
207C BEFORE SUBDIVIDING THE SMALLEST INTERVAL WE
208C TRY TO DECREASE THE VALUE OF ERLARG.
209C NOEXT - LOGICAL VARIABLE DENOTING THAT EXTRAPOLATION
210C IS NO LONGER ALLOWED (TRUE-VALUE)
211C
212C MACHINE DEPENDENT CONSTANTS
213C ---------------------------
214C
215C EPMACH IS THE LARGEST RELATIVE SPACING.
216C UFLOW IS THE SMALLEST POSITIVE MAGNITUDE.
217C OFLOW IS THE LARGEST POSITIVE MAGNITUDE.
218C
219C***FIRST EXECUTABLE STATEMENT DQAGIE
220 epmach = d1mach(4)
221C
222C TEST ON VALIDITY OF PARAMETERS
223C -----------------------------
224C
225 ier = 0
226 neval = 0
227 last = 0
228 result = 0.0d+00
229 abserr = 0.0d+00
230 alist(1) = 0.0d+00
231 blist(1) = 0.1d+01
232 rlist(1) = 0.0d+00
233 elist(1) = 0.0d+00
234 iord(1) = 0
235 IF(epsabs.LE.0.0d+00.AND.epsrel.LT.dmax1(0.5d+02*epmach,0.5d-28))
236 * ier = 6
237 IF(ier.EQ.6) GO TO 999
238C
239C
240C FIRST APPROXIMATION TO THE INTEGRAL
241C -----------------------------------
242C
243C DETERMINE THE INTERVAL TO BE MAPPED ONTO (0,1).
244C IF INF = 2 THE INTEGRAL IS COMPUTED AS I = I1+I2, WHERE
245C I1 = INTEGRAL OF F OVER (-INFINITY,0),
246C I2 = INTEGRAL OF F OVER (0,+INFINITY).
247C
248 boun = bound
249 IF(inf.EQ.2) boun = 0.0d+00
250 CALL dqk15i(f,boun,inf,0.0d+00,0.1d+01,result,abserr,
251 * defabs,resabs,ier)
252 IF (ier .LT. 0) RETURN
253C
254C TEST ON ACCURACY
255C
256 last = 1
257 rlist(1) = result
258 elist(1) = abserr
259 iord(1) = 1
260 dres = dabs(result)
261 errbnd = dmax1(epsabs,epsrel*dres)
262 IF(abserr.LE.1.0d+02*epmach*defabs.AND.abserr.GT.errbnd) ier = 2
263 IF(limit.EQ.1) ier = 1
264 IF(ier.NE.0.OR.(abserr.LE.errbnd.AND.abserr.NE.resabs).OR.
265 * abserr.EQ.0.0d+00) GO TO 130
266C
267C INITIALIZATION
268C --------------
269C
270 uflow = d1mach(1)
271 oflow = d1mach(2)
272 rlist2(1) = result
273 errmax = abserr
274 maxerr = 1
275 area = result
276 errsum = abserr
277 abserr = oflow
278 nrmax = 1
279 nres = 0
280 ktmin = 0
281 numrl2 = 2
282 extrap = .false.
283 noext = .false.
284 ierro = 0
285 iroff1 = 0
286 iroff2 = 0
287 iroff3 = 0
288 ksgn = -1
289 IF(dres.GE.(0.1d+01-0.5d+02*epmach)*defabs) ksgn = 1
290C
291C MAIN DO-LOOP
292C ------------
293C
294 DO 90 last = 2,limit
295C
296C BISECT THE SUBINTERVAL WITH NRMAX-TH LARGEST ERROR ESTIMATE.
297C
298 a1 = alist(maxerr)
299 b1 = 0.5d+00*(alist(maxerr)+blist(maxerr))
300 a2 = b1
301 b2 = blist(maxerr)
302 erlast = errmax
303 CALL dqk15i(f,boun,inf,a1,b1,area1,error1,resabs,defab1,ier)
304 IF (ier .LT. 0) RETURN
305 CALL dqk15i(f,boun,inf,a2,b2,area2,error2,resabs,defab2,ier)
306 IF (ier .LT. 0) RETURN
307C
308C IMPROVE PREVIOUS APPROXIMATIONS TO INTEGRAL
309C AND ERROR AND TEST FOR ACCURACY.
310C
311 area12 = area1+area2
312 erro12 = error1+error2
313 errsum = errsum+erro12-errmax
314 area = area+area12-rlist(maxerr)
315 IF(defab1.EQ.error1.OR.defab2.EQ.error2)GO TO 15
316 IF(dabs(rlist(maxerr)-area12).GT.0.1d-04*dabs(area12)
317 * .OR.erro12.LT.0.99d+00*errmax) GO TO 10
318 IF(extrap) iroff2 = iroff2+1
319 IF(.NOT.extrap) iroff1 = iroff1+1
320 10 IF(last.GT.10.AND.erro12.GT.errmax) iroff3 = iroff3+1
321 15 rlist(maxerr) = area1
322 rlist(last) = area2
323 errbnd = dmax1(epsabs,epsrel*dabs(area))
324C
325C TEST FOR ROUNDOFF ERROR AND EVENTUALLY SET ERROR FLAG.
326C
327 IF(iroff1+iroff2.GE.10.OR.iroff3.GE.20) ier = 2
328 IF(iroff2.GE.5) ierro = 3
329C
330C SET ERROR FLAG IN THE CASE THAT THE NUMBER OF
331C SUBINTERVALS EQUALS LIMIT.
332C
333 IF(last.EQ.limit) ier = 1
334C
335C SET ERROR FLAG IN THE CASE OF BAD INTEGRAND BEHAVIOUR
336C AT SOME POINTS OF THE INTEGRATION RANGE.
337C
338 IF(dmax1(dabs(a1),dabs(b2)).LE.(0.1d+01+0.1d+03*epmach)*
339 * (dabs(a2)+0.1d+04*uflow)) ier = 4
340C
341C APPEND THE NEWLY-CREATED INTERVALS TO THE LIST.
342C
343 IF(error2.GT.error1) GO TO 20
344 alist(last) = a2
345 blist(maxerr) = b1
346 blist(last) = b2
347 elist(maxerr) = error1
348 elist(last) = error2
349 GO TO 30
350 20 alist(maxerr) = a2
351 alist(last) = a1
352 blist(last) = b1
353 rlist(maxerr) = area2
354 rlist(last) = area1
355 elist(maxerr) = error2
356 elist(last) = error1
357C
358C CALL SUBROUTINE DQPSRT TO MAINTAIN THE DESCENDING ORDERING
359C IN THE LIST OF ERROR ESTIMATES AND SELECT THE SUBINTERVAL
360C WITH NRMAX-TH LARGEST ERROR ESTIMATE (TO BE BISECTED NEXT).
361C
362 30 CALL dqpsrt(limit,last,maxerr,errmax,elist,iord,nrmax)
363 IF(errsum.LE.errbnd) GO TO 115
364 IF(ier.NE.0) GO TO 100
365 IF(last.EQ.2) GO TO 80
366 IF(noext) GO TO 90
367 erlarg = erlarg-erlast
368 IF(dabs(b1-a1).GT.small) erlarg = erlarg+erro12
369 IF(extrap) GO TO 40
370C
371C TEST WHETHER THE INTERVAL TO BE BISECTED NEXT IS THE
372C SMALLEST INTERVAL.
373C
374 IF(dabs(blist(maxerr)-alist(maxerr)).GT.small) GO TO 90
375 extrap = .true.
376 nrmax = 2
377 40 IF(ierro.EQ.3.OR.erlarg.LE.ertest) GO TO 60
378C
379C THE SMALLEST INTERVAL HAS THE LARGEST ERROR.
380C BEFORE BISECTING DECREASE THE SUM OF THE ERRORS OVER THE
381C LARGER INTERVALS (ERLARG) AND PERFORM EXTRAPOLATION.
382C
383 id = nrmax
384 jupbnd = last
385 IF(last.GT.(2+limit/2)) jupbnd = limit+3-last
386 DO 50 k = id,jupbnd
387 maxerr = iord(nrmax)
388 errmax = elist(maxerr)
389 IF(dabs(blist(maxerr)-alist(maxerr)).GT.small) GO TO 90
390 nrmax = nrmax+1
391 50 CONTINUE
392C
393C PERFORM EXTRAPOLATION.
394C
395 60 numrl2 = numrl2+1
396 rlist2(numrl2) = area
397 CALL dqelg(numrl2,rlist2,reseps,abseps,res3la,nres)
398 ktmin = ktmin+1
399 IF(ktmin.GT.5.AND.abserr.LT.0.1d-02*errsum) ier = 5
400 IF(abseps.GE.abserr) GO TO 70
401 ktmin = 0
402 abserr = abseps
403 result = reseps
404 correc = erlarg
405 ertest = dmax1(epsabs,epsrel*dabs(reseps))
406 IF(abserr.LE.ertest) GO TO 100
407C
408C PREPARE BISECTION OF THE SMALLEST INTERVAL.
409C
410 70 IF(numrl2.EQ.1) noext = .true.
411 IF(ier.EQ.5) GO TO 100
412 maxerr = iord(1)
413 errmax = elist(maxerr)
414 nrmax = 1
415 extrap = .false.
416 small = small*0.5d+00
417 erlarg = errsum
418 GO TO 90
419 80 small = 0.375d+00
420 erlarg = errsum
421 ertest = errbnd
422 rlist2(2) = area
423 90 CONTINUE
424C
425C SET FINAL RESULT AND ERROR ESTIMATE.
426C ------------------------------------
427C
428 100 IF(abserr.EQ.oflow) GO TO 115
429 IF((ier+ierro).EQ.0) GO TO 110
430 IF(ierro.EQ.3) abserr = abserr+correc
431 IF(ier.EQ.0) ier = 3
432 IF(result.NE.0.0d+00.AND.area.NE.0.0d+00)GO TO 105
433 IF(abserr.GT.errsum)GO TO 115
434 IF(area.EQ.0.0d+00) GO TO 130
435 GO TO 110
436 105 IF(abserr/dabs(result).GT.errsum/dabs(area))GO TO 115
437C
438C TEST ON DIVERGENCE
439C
440 110 IF(ksgn.EQ.(-1).AND.dmax1(dabs(result),dabs(area)).LE.
441 * defabs*0.1d-01) GO TO 130
442 IF(0.1d-01.GT.(result/area).OR.(result/area).GT.0.1d+03.
443 *or.errsum.GT.dabs(area)) ier = 6
444 GO TO 130
445C
446C COMPUTE GLOBAL INTEGRAL SUM.
447C
448 115 result = 0.0d+00
449 DO 120 k = 1,last
450 result = result+rlist(k)
451 120 CONTINUE
452 abserr = errsum
453 130 neval = 30*last-15
454 IF(inf.EQ.2) neval = 2*neval
455 IF(ier.GT.2) ier=ier-1
456 999 RETURN
457 END
double precision function d1mach(i)
Definition d1mach.f:23
subroutine dqagie(f, bound, inf, epsabs, epsrel, limit, result, abserr, neval, ier, alist, blist, rlist, elist, iord, last)
Definition dqagie.f:3
subroutine dqelg(n, epstab, result, abserr, res3la, nres)
Definition dqelg.f:2
subroutine dqk15i(f, boun, inf, a, b, result, abserr, resabs, resasc, ierr)
Definition dqk15i.f:3
subroutine dqpsrt(limit, last, maxerr, ermax, elist, iord, nrmax)
Definition dqpsrt.f:2