D01 Chapter Contents
D01 Chapter Introduction
NAG Library Manual

# NAG Library Routine DocumentD01UAF

Note:  before using this routine, please read the Users' Note for your implementation to check the interpretation of bold italicised terms and other implementation-dependent details.

## 1  Purpose

D01UAF computes an estimate of the definite integral of a function of known analytical form, using a Gaussian quadrature formula with a specified number of abscissae. Formulae are provided for a finite interval (Gauss–Legendre), a semi-infinite interval (Gauss–Laguerre, rational Gauss), and an infinite interval (Gauss–Hermite).

## 2  Specification

 SUBROUTINE D01UAF ( KEY, A, B, N, F, DINEST, IUSER, RUSER, IFAIL)
 INTEGER KEY, N, IUSER(*), IFAIL REAL (KIND=nag_wp) A, B, DINEST, RUSER(*) EXTERNAL F

## 3  Description

### 3.1  General

D01UAF evaluates an estimate of the definite integral of a function $f\left(x\right)$, over a finite or infinite range, by $n$-point Gaussian quadrature (see Davis and Rabinowitz (1975), Fröberg (1970), Ralston (1965) or Stroud and Secrest (1966)). The integral is approximated by a summation of the product of a set of weights and a set of function evaluations at a corresponding set of abscissae ${x}_{i}$. For adjusted weights, the function values correspond to the values of the integrand $f$, and hence the sum will be
 $∑i=1nwifxi$
where the ${w}_{i}$ are called the weights, and the ${x}_{i}$ the abscissae. A selection of values of $n$ is available. (See Section 5.)
Where applicable, normal weights may instead be used, in which case the corresponding weight function $\omega$ is factored out of the integrand as $f\left(x\right)=\omega \left(x\right)g\left(x\right)$ and hence the sum will be
 $∑ i=-1 n w-i gx ,$
where the normal weights ${\stackrel{-}{w}}_{i}={w}_{i}\omega \left({x}_{i}\right)$ are computed internally.
D01UAF uses a vectorized subroutine F to supply abscissae to the user and to subsequently receive function evaluations. If adjusted weights are used, the values of the integrand $f\left({x}_{i}\right)$ must be returned for all supplied abscissae ${x}_{i}$. If normal weights are used, the values of the normalized integrand $g\left({x}_{i}\right)$ must be returned.

### 3.2  Both Limits Finite

 $∫abfxdx.$
The Gauss–Legendre weights and abscissae are used, and the formula is exact for any function of the form:
 $fx=∑i= 0 2n- 1 ci xi.$
The formula is appropriate for functions which can be well approximated by such a polynomial over $\left[a,b\right]$. It is inappropriate for functions with algebraic singularities at one or both ends of the interval, such as ${\left(1+x\right)}^{-1/2}$ on $\left[-1,1\right]$.

### 3.3  One Limit Infinite

 $∫a∞fxdx or ∫-∞afxdx.$
Two quadrature formulae are available for these integrals.
(a) The Gauss–Laguerre formula is exact for any function of the form:
 $fx=e-bx ∑i= 0 2n- 1 ci xi.$
This formula is appropriate for functions decaying exponentially at infinity; the parameter $b$ should be chosen if possible to match the decay rate of the function.
If the adjusted weights are selected, the complete integrand $f\left(x\right)$ should be provided through F.
If the normal form is selected, the contribution of ${e}^{-bx}$ is accounted for internally, and F should only return $g\left(x\right)$, where $f\left(x\right)={e}^{-bx}g\left(x\right)$.
If $b<0$ is supplied, the interval of integration will be $\left[a,\infty \right)$. Otherwise if $b>0$ is supplied, the interval of integration will be $\left(-\infty ,a\right]$.
(b) The rational Gauss formula is exact for any function of the form:
 $fx=∑i=2 2n+1cix+bi=∑i=0 2n-1c2n+1-ix+bix+b2n+1.$
This formula is likely to be more accurate for functions having only an inverse power rate of decay for large $x$. Here the choice of a suitable value of $b$ may be more difficult; unfortunately a poor choice of $b$ can make a large difference to the accuracy of the computed integral.
Only the adjusted form of the rational Gauss formula is available, and as such, the complete integrand $f\left(x\right)$ must be supplied in F.
If $a+b<0$, the interval of integration will be $\left[a,\infty \right)$. Otherwise if $a+b>0$, the interval of integration will be $\left(-\infty ,a\right]$.

### 3.4  Both Limits Infinite

 $∫-∞ +∞fxdx.$
The Gauss–Hermite weights and abscissae are used, and the formula is exact for any function of the form:
 $fx = e - b x-a 2 ∑ i=0 2n- 1 ci xi ,$
where $b>0$. Again, for general functions not of this exact form, the parameter $b$ should be chosen to match if possible the decay rate at $\text{}±\infty$.
If the adjusted weights are selected, the complete integrand $f\left(x\right)$ should be provided through F.
If the normal form is selected, the contribution of ${e}^{-b{\left(x-a\right)}^{2}}$ is accounted for internally, and F should only return $g\left(x\right)$, where $f\left(x\right)={e}^{-b{\left(x-a\right)}^{2}}g\left(x\right)$.

## 4  References

Davis P J and Rabinowitz P (1975) Methods of Numerical Integration Academic Press
Fröberg C E (1970) Introduction to Numerical Analysis Addison–Wesley
Ralston A (1965) A First Course in Numerical Analysis pp. 87–90 McGraw–Hill
Stroud A H and Secrest D (1966) Gaussian Quadrature Formulas Prentice–Hall

## 5  Parameters

1:     KEY – INTEGERInput
On entry: indicates the quadrature formula.
${\mathbf{KEY}}=0$
Gauss–Legendre quadrature on a finite interval, using normal weights.
${\mathbf{KEY}}=3$
Gauss–Laguerre quadrature on a semi-infinite interval, using normal weights.
${\mathbf{KEY}}=-3$
${\mathbf{KEY}}=4$
Gauss–Hermite quadrature on an infinite interval, using normal weights.
${\mathbf{KEY}}=-4$
${\mathbf{KEY}}=-5$
Constraint: ${\mathbf{KEY}}=0$, $3$, $-3$, $4$, $-4$ or $-5$.
2:     A – REAL (KIND=nag_wp)Input
3:     B – REAL (KIND=nag_wp)Input
On entry: the quantities $a$ and $b$ as described in the appropriate subsection of Section 3.
Constraints:
• Rational Gauss: ${\mathbf{A}}+{\mathbf{B}}\ne 0.0$;
• Gauss–Laguerre: ${\mathbf{B}}\ne 0.0$;
• Gauss–Hermite: ${\mathbf{B}}>0$.
4:     N – INTEGERInput
On entry: $n$, the number of abscissae to be used.
Constraint: ${\mathbf{N}}=1$, $2$, $3$, $4$, $5$, $6$, $8$, $10$, $12$, $14$, $16$, $20$, $24$, $32$, $48$ or $64$.
If the soft fail option is used, the answer is evaluated for the largest valid value of N less than the requested value.
5:     F – SUBROUTINE, supplied by the user.External Procedure
F must return the value of the integrand $f$, or the normalized integrand $g$, at a specified point.
The specification of F is:
 SUBROUTINE F ( X, NX, FV, IFLAG, IUSER, RUSER)
 INTEGER NX, IFLAG, IUSER(*) REAL (KIND=nag_wp) X(NX), FV(NX), RUSER(*)
1:     X(NX) – REAL (KIND=nag_wp) arrayInput
On entry: the abscissae, ${x}_{i}$, for $\mathit{i}=1,2,\dots ,{n}_{x}$ at which function values are required.
2:     NX – INTEGERInput
On entry: ${n}_{x}$, the number of abscissae.
3:     FV(NX) – REAL (KIND=nag_wp) arrayOutput
On exit: if adjusted weights are used, the values of the integrand $f$. ${\mathbf{FV}}\left(\mathit{i}\right)=f\left({x}_{\mathit{i}}\right)$, for $\mathit{i}=1,2,\dots ,{n}_{x}$.
Otherwise the values of the normalized integrand $g$ using the normal weights. ${\mathbf{FV}}\left(i\right)=g\left({x}_{i}\right)$ for all $i=1,2,\dots ,{n}_{x}$.
4:     IFLAG – INTEGERInput/Output
On entry: ${\mathbf{IFLAG}}=0$.
On exit: set ${\mathbf{IFLAG}}<0$ if you wish to force an immediate exit from D01UAF with ${\mathbf{IFAIL}}=-{\mathbf{1}}$.
5:     IUSER($*$) – INTEGER arrayUser Workspace
6:     RUSER($*$) – REAL (KIND=nag_wp) arrayUser Workspace
F is called with the parameters IUSER and RUSER as supplied to D01UAF. You are free to use the arrays IUSER and RUSER to supply information to F as an alternative to using COMMON global variables.
F must either be a module subprogram USEd by, or declared as EXTERNAL in, the (sub)program from which D01UAF is called. Parameters denoted as Input must not be changed by this procedure.
Some points to bear in mind when coding F are mentioned in Section 7.
6:     DINEST – REAL (KIND=nag_wp)Output
On exit: the estimate of the definite integral.
7:     IUSER($*$) – INTEGER arrayUser Workspace
8:     RUSER($*$) – REAL (KIND=nag_wp) arrayUser Workspace
IUSER and RUSER are not used by D01UAF, but are passed directly to F and may be used to pass information to this routine as an alternative to using COMMON global variables.
9:     IFAIL – INTEGERInput/Output
On entry: IFAIL must be set to $0$, $-1\text{​ or ​}1$. If you are unfamiliar with this parameter you should refer to Section 3.3 in the Essential Introduction for details.
For environments where it might be inappropriate to halt program execution when an error is detected, the value $-1\text{​ or ​}1$ is recommended. If the output of error messages is undesirable, then the value $1$ is recommended. Otherwise, because for this routine the values of the output parameters may be useful even if ${\mathbf{IFAIL}}\ne {\mathbf{0}}$ on exit, the recommended value is $-1$. When the value $-\mathbf{1}\text{​ or ​}1$ is used it is essential to test the value of IFAIL on exit.
On exit: ${\mathbf{IFAIL}}={\mathbf{0}}$ unless the routine detects an error or a warning has been flagged (see Section 6).

## 6  Error Indicators and Warnings

If on entry ${\mathbf{IFAIL}}={\mathbf{0}}$ or $-{\mathbf{1}}$, explanatory error messages are output on the current error message unit (as defined by X04AAF).
Note: D01UAF may return useful information for one or more of the following detected errors or warnings.
Errors or warnings detected by the routine:
${\mathbf{IFAIL}}=1$
The $N$-point rule is not among those stored.
On entry: ${\mathbf{N}}=⟨\mathit{\text{value}}⟩$.
$N$-rule used: ${\mathbf{N}}=⟨\mathit{\text{value}}⟩$.
${\mathbf{IFAIL}}=2$
Underflow occurred in calculation of normal weights.
Reduce N or use adjusted weights: ${\mathbf{N}}=⟨\mathit{\text{value}}⟩$.
${\mathbf{IFAIL}}=3$
No nonzero weights were generated for the provided parameters.
${\mathbf{IFAIL}}=11$
On entry, ${\mathbf{KEY}}=⟨\mathit{\text{value}}⟩$.
Constraint: ${\mathbf{KEY}}=0$, $3$, $-3$, $4$, $-4$ or $-5$.
${\mathbf{IFAIL}}=12$
The value of A and/or B is invalid for the chosen KEY. Either:
• The value of A and/or B is invalid for Gauss–Hermite quadrature.
On entry, ${\mathbf{KEY}}=⟨\mathit{\text{value}}⟩$.
On entry, ${\mathbf{A}}=⟨\mathit{\text{value}}⟩$ and ${\mathbf{B}}=⟨\mathit{\text{value}}⟩$.
Constraint: ${\mathbf{B}}>0.0$.
• The value of A and/or B is invalid for Gauss–Laguerre quadrature.
On entry, ${\mathbf{KEY}}=⟨\mathit{\text{value}}⟩$.
On entry, ${\mathbf{A}}=⟨\mathit{\text{value}}⟩$ and ${\mathbf{B}}=⟨\mathit{\text{value}}⟩$.
Constraint: $\left|{\mathbf{B}}\right|>0.0$.
• The value of A and/or B is invalid for rational Gauss quadrature.
On entry, ${\mathbf{KEY}}=⟨\mathit{\text{value}}⟩$.
On entry, ${\mathbf{A}}=⟨\mathit{\text{value}}⟩$ and ${\mathbf{B}}=⟨\mathit{\text{value}}⟩$.
Constraint: $\left|{\mathbf{A}}+{\mathbf{B}}\right|>0.0$.
${\mathbf{IFAIL}}=14$
On entry, ${\mathbf{N}}=⟨\mathit{\text{value}}⟩$.
Constraint: ${\mathbf{N}}>0$.
${\mathbf{IFAIL}}=-1$
Exit requested from F with ${\mathbf{IFLAG}}=⟨\mathit{\text{value}}⟩$.

## 7  Accuracy

The accuracy depends on the behaviour of the integrand, and on the number of abscissae used. No tests are carried out in D01UAF to estimate the accuracy of the result. If such an estimate is required, the routine may be called more than once, with a different number of abscissae each time, and the answers compared. It is to be expected that for sufficiently smooth functions a larger number of abscissae will give improved accuracy.
Alternatively, the range of integration may be subdivided, the integral estimated separately for each sub-interval, and the sum of these estimates compared with the estimate over the whole range.
The coding of F may also have a bearing on the accuracy. For example, if a high-order Gauss–Laguerre formula is used, and the integrand is of the form
 $fx=e-bxgx$
it is possible that the exponential term may underflow for some large abscissae. Depending on the machine, this may produce an error, or simply be assumed to be zero. In any case, it would be better to evaluate the expression with
 $fx = sgn gx × exp -bx+ lngx$
Another situation requiring care is exemplified by
 $∫-∞ +∞e-x2xmdx=0, m​ odd.$
The integrand here assumes very large values; for example, when $m=63$, the peak value exceeds $3×{10}^{33}$. Now, if the machine holds floating point numbers to an accuracy of $k$ significant decimal digits, we could not expect such terms to cancel in the summation leaving an answer of much less than ${10}^{33-k}$ (the weights being of order unity); that is, instead of zero we obtain a rather large answer through rounding error. Such situations are characterised by great variability in the answers returned by formulae with different values of $n$.
In general, you should be aware of the order of magnitude of the integrand, and should judge the answer in that light.

The time taken by D01UAF depends on the complexity of the expression for the integrand and on the number of abscissae required.

## 9  Example

This example evaluates the integrals
 $∫0141+x2 dx=π$
 $∫2∞ 1x2 ln⁡x dx =0.378671$
by rational Gauss quadrature with $b=0$;
 $∫2∞e-xxdx=0.048901$
by Gauss–Laguerre quadrature with $b=1$; and
 $∫-∞ +∞e-3⁢x2-4x-1dx=∫-∞ +∞e-3⁢ x+1 2e2x+2dx=1.428167$
by Gauss–Hermite quadrature with $a=-1$ and $b=3$.
The formulae with $n=2,4,8,16,32$ and $64$ are used in each case. Both adjusted and normal weights are used for Gauss–Laguerre and Gauss–Hermite quadrature.

### 9.1  Program Text

Program Text (d01uafe.f90)

None.

### 9.3  Program Results

Program Results (d01uafe.r)