Integrates a function over an infinite or semi-infinite interval.
F User-supplied
FUNCTION to be
integrated. The form is
F(X), where
X − Independent variable. (Input)
F − The function value. (Output)
F must be declared EXTERNAL in the calling program.
BOUND Finite
bound of the integration range. (Input)
Ignored if INTERV = 2.
INTERV Flag indicating integration interval. (Input)
INTERV Interval
−1 (−∞, BOUND)
1 (BOUND, + ∞)
2 (−∞, + ∞)
RESULT Estimate of the integral from A to B of F. (Output)
ERRABS Absolute
accuracy desired. (Input)
Default: ERRABS = 1.e-3 for
single precision and 1.d-8 for double precision.
ERRREL Relative
accuracy desired. (Input)
Default: ERRREL = 1.e-3 for
single precision and 1.d-8 for double precision.
ERREST Estimate of the absolute value of the error. (Output)
Generic: CALL QDAGI (F, BOUND, INTERV, RESULT [, ])
Specific: The specific interface names are S_QDAGI and D_QDAGI.
Single: CALL QDAGI (F, BOUND, INTERV, ERRABS, ERRREL, RESULT, ERREST)
Double: The double precision name is DQDAGI.
The routine QDAGI uses a globally adaptive scheme in an attempt to reduce the absolute error. It initially transforms an infinite or semi-infinite interval into the finite interval [0, 1]. Then, QDAGI uses a 21-point Gauss-Kronrod rule to estimate the integral and the error. It bisects any interval with an unacceptable error estimate and continues this process until termination. This routine is designed to handle endpoint singularities. In addition to the general strategy described in QDAG, this subroutine employs an extrapolation procedure known as the ɛ-algorithm. The routine QDAGI is an implementation of the subroutine QAGI, which is fully documented by Piessens et al. (1983).
1. Workspace may be explicitly provided, if desired, by use of Q2AGI/DQ2AGI. The reference is
CALL Q2AGI (F, BOUND, INTERV, ERRABS, ERRREL, RESULT, ERREST, MAXSUB, NEVAL, NSUBIN, ALIST, BLIST, RLIST, ELIST, IORD)
The additional arguments are as follows:
MAXSUB Number of subintervals
allowed. (Input)
A value of 500 is used by QDAGI.
NEVAL Number of evaluations of F. (Output)
NSUBIN Number of subintervals generated. (Output)
ALIST Array of length MAXSUB containing a list of the NSUBIN left endpoints. (Output)
BLIST Array of length MAXSUB containing a list of the NSUBIN right endpoints. (Output)
RLIST Array of length MAXSUB containing approximations to the NSUBIN integrals over the intervals defined by ALIST, BLIST. (Output)
ELIST Array of length MAXSUB containing the error estimates of the NSUBIN values in RLIST. (Output)
IORD Array of length MAXSUB. (Output)
Let K be NSUBIN if NSUBIN .LE.(MAXSUB/2 +
2), MAXSUB + 1 − NSUBIN otherwise.
The first K
locations contain pointers to the error estimates over the subintervals, such
that ELIST(IORD(1)),
, ELIST(IORD(K))
form a decreasing sequence.
2. Informational errors
Type Code
4 1 The maximum number of subintervals allowed has been reached.
3 2 Roundoff error, preventing the requested tolerance from being achieved, has been detected.
3 3 A degradation in precision has been detected.
3 4 Roundoff error in the extrapolation table, preventing the requested tolerance from being achieved, has been detected.
4 5 Integral is divergent or slowly convergent.
3.
If EXACT is the
exact value, QDAGI attempts to find
RESULT such that
ABS(EXACT − RESULT).LE.MAX(ERRABS, ERRREL * ABS(EXACT)). To specify
only a relative error, set ERRABS to zero.
Similarly, to specify only an absolute error, set ERRREL to zero.
4. Since QDAGI makes a transformation of the original interval into the finite interval [0,1] the resulting function values can be extremely small and the resulting function might have spikes. In some cases QDAGI overlooks these spikes. The user can try adjusting the absolute and relative error tolerances to remedy this or, alternatively, try using IMSL routine QDAG1D.
The value of
is estimated. The values of the actual and estimated error are machine dependent. Note that we have requested an absolute error of 0 and a relative error of .001. The effect of these requests, as documented in Comment 3 above, is to ignore the absolute error requirement.
USE QDAGI_INT
USE UMACH_INT
USE CONST_INT
IMPLICIT NONE
INTEGER INTERV, NOUT
REAL ABS, ALOG, BOUND, ERRABS, ERREST, ERROR, &
ERRREL, EXACT, F, PI, RESULT
INTRINSIC ABS, ALOG
EXTERNAL F
! Get output unit number
CALL UMACH (2, NOUT)
! Set limits of integration
BOUND = 0.0
INTERV = 1
! Set error tolerances
ERRABS = 0.0
CALL QDAGI (F, BOUND, INTERV, RESULT, ERRABS=ERRABS, &
ERREST=ERREST)
! Print results
PI = CONST('PI')
EXACT = -PI*ALOG(10.)/20.
ERROR = ABS(RESULT-EXACT)
WRITE (NOUT,99999) RESULT, EXACT, ERREST, ERROR
99999 FORMAT (' Computed =', F8.3, 13X, ' Exact =', F8.3//' Error ', &
'estimate =', 1PE10.3, 6X, 'Error =', 1PE10.3)
END
!
REAL FUNCTION F (X)
REAL X
REAL ALOG
INTRINSIC ALOG
F = ALOG(X)/(1.+(10.*X)**2)
RETURN
END
Computed =
-0.362
Exact = -0.362
Error estimate =
2.652E-06 Error = 5.960E-08
PHONE: 713.784.3131 FAX:713.781.9260 |