NAG Library Routine Document

d01arf (dim1_indef)


    1  Purpose
    7  Accuracy


d01arf computes definite and indefinite integrals over a finite range to a specified relative or absolute accuracy, using the method described in Patterson (1968).


Fortran Interface
Subroutine d01arf ( a, b, fun, relacc, absacc, maxrul, iparm, acc, ans, n, alpha, ifail)
Integer, Intent (In):: maxrul, iparm
Integer, Intent (Inout):: ifail
Integer, Intent (Out):: n
Real (Kind=nag_wp), External:: fun
Real (Kind=nag_wp), Intent (In):: a, b, relacc, absacc
Real (Kind=nag_wp), Intent (Inout):: alpha(390)
Real (Kind=nag_wp), Intent (Out):: acc, ans
C Header Interface
#include nagmk26.h
void  d01arf_ (const double *a, const double *b,
double (NAG_CALL *fun)(const double *x),
const double *relacc, const double *absacc, const Integer *maxrul, const Integer *iparm, double *acc, double *ans, Integer *n, double alpha[], Integer *ifail)


d01arf evaluates definite and indefinite integrals of the form:
using the method described in Patterson (1968).

Definite Integrals

In this case d01arf must be called with iparm=0. By linear transformation the integral is changed to
I=-1 +1Fxdx 
Fx=b-a2 f b+a+b-ax2  
and is then approximated by an n-point quadrature rule
where wk are the weights and xk are the abscissae.
The routine uses a family of nine interlacing rules based on the optimal extension of the three-point Gauss rule. These rules use 1, 3, 7, 15, 31, 63, 127, 255 and 511 points and have respective polynomial integrating degrees 1, 5, 11, 23, 47, 95, 191, 383 and 767. Each rule has the property that the next in sequence includes all the points of its predecessor and has the greatest possible increase in integrating degree.
The integration method is based on the successive application of these rules until the absolute value of the difference of two successive results differs by not more than absacc, or relatively by not more than relacc. The result of the last rule used is taken as the value of the integral (ans), and the absolute difference of the results of the last two rules used is taken as an estimate of the absolute error (acc). Due to their interlacing form no integrand evaluations are wasted in passing from one rule to the next.

Indefinite Integrals

Suppose the value of the integral
is required for a number of sub-intervals c,d, all of which lie in an interval a,b.
In this case d01arf should first be called with the argument iparm=1 and the interval set to a,b. The routine then calculates the integral over a,b and the Legendre expansion of the integrand, using the same integrand values. If the routine is subsequently called with iparm=2 and the interval set to c,d, the integral over c,d is calculated by analytical integration of the Legendre expansion, without further evaluations of the integrand.
For the interval -1,1 the expansion takes the form
where Pix is the order i Legendre polynomial. Assuming that the integral over the full range -1,1 was evaluated to the required accuracy using an n-point rule, then the coefficients
αi=122i-1-1 +1PixFxdx,  i=0,1,,m  
are evaluated by that same rule, up to
m=3n- 1/4.  
The accuracy for indefinite integration should be of the same order as that obtained for the definite integral over the full range. The indefinite integrals will be exact when Fx is a polynomial of degree m.


Patterson T N L (1968) The Optimum addition of points to quadrature formulae Math. Comput. 22 847–856


1:     a – Real (Kind=nag_wp)Input
On entry: a, the lower limit of integration.
2:     b – Real (Kind=nag_wp)Input
On entry: b, the upper limit of integration. It is not necessary that a<b.
3:     fun – real (Kind=nag_wp) Function, supplied by the user.External Procedure
fun must return the value of the integrand f at a specified point.
The specification of fun is:
Fortran Interface
Function fun ( x)
Real (Kind=nag_wp):: fun
Real (Kind=nag_wp), Intent (In):: x
C Header Interface
#include nagmk26.h
double  fun (const double *x)
1:     x – Real (Kind=nag_wp)Input
On entry: the point in a,b at which the integrand f must be evaluated.
fun must either be a module subprogram USEd by, or declared as EXTERNAL in, the (sub)program from which d01arf is called. Arguments denoted as Input must not be changed by this procedure.
Note: fun should not return floating-point NaN (Not a Number) or infinity values, since these are not handled by d01arf. If your code inadvertently does return any NaNs or infinities, d01arf is likely to produce unexpected results.
If iparm=2, fun is not called.
4:     relacc – Real (Kind=nag_wp)Input
On entry: the relative accuracy required. If convergence according to absolute accuracy is required, relacc should be set to zero (but see also Section 7). If relacc<0.0, its absolute value is used.
If iparm=2, relacc is not used.
5:     absacc – Real (Kind=nag_wp)Input
On entry: the absolute accuracy required. If convergence according to relative accuracy is required, absacc should be set to zero (but see also Section 7). If absacc<0.0, its absolute value is used.
If iparm=2, absacc is not used.
6:     maxrul – IntegerInput
On entry: the maximum number of successive rules that may be used.
Constraint: 1maxrul9. If maxrul is outside these limits, the value 9 is assumed.
If iparm=2, maxrul is not used.
7:     iparm – IntegerInput
On entry: indicates the task to be performed by the routine.
Only the definite integral over a,b is evaluated.
As well as the definite integral, the expansion of the integrand in Legendre polynomials over a,b is calculated, using the same values of the integrand as used to compute the integral. The expansion coefficients, and some other quantities, are returned in alpha for later use in computing indefinite integrals.
ft is integrated analytically over a,b using the previously computed expansion, stored in alpha. No further evaluations of the integrand are required. The routine must previously have been called with iparm=1 and the interval a,b must lie within that specified for the previous call. In this case only the arguments a, b, iparm, ans, alpha and ifail are used.
Constraint: iparm=0, 1 or 2.
8:     acc – Real (Kind=nag_wp)Output
On exit: if iparm=0 or 1, acc contains the absolute value of the difference between the last two successive estimates of the integral. This may be used as a measure of the accuracy actually achieved.
If iparm=2, acc is not used.
9:     ans – Real (Kind=nag_wp)Output
On exit: the estimated value of the integral.
10:   n – IntegerOutput
On exit: when iparm=0 or 1, n contains the number of integrand evaluations used in the calculation of the integral.
If iparm=2, n is not used.
11:   alpha390 – Real (Kind=nag_wp) arrayInput/Output
On entry: if iparm=2, alpha must contain the coefficients of the Legendre expansions of the integrand, as returned by a previous call of d01arf with iparm=1 and a range containing the present range.
If iparm=0 or 1, alpha need not be set on entry.
On exit: if iparm=1, the first m elements of alpha hold the coefficients of the Legendre expansion of the integrand, and the value of m is stored in alpha390. alpha must not be changed between a call with iparm=1 and subsequent calls with iparm=2.
If iparm=2, the first m elements of alpha are unchanged on exit.
12:   ifail – IntegerInput/Output
On entry: ifail must be set to 0, -1​ or ​1. If you are unfamiliar with this argument you should refer to Section 3.4 in How to Use the NAG Library and its Documentation for details.
For environments where it might be inappropriate to halt program execution when an error is detected, the value -1​ 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 arguments may be useful even if ifail0 on exit, the recommended value is -1. When the value -1​ or ​1 is used it is essential to test the value of ifail on exit.
On exit: ifail=0 unless the routine detects an error or a warning has been flagged (see Section 6).

Error Indicators and Warnings

If on entry ifail=0 or -1, explanatory error messages are output on the current error message unit (as defined by x04aaf).
Note: d01arf may return useful information for one or more of the following detected errors or warnings.
Errors or warnings detected by the routine:
If iparm=0 or 1, this indicates that all maxrul rules have been used and the integral has not converged to the accuracy requested. In this case ans contains the last approximation to the integral, and acc contains the difference between the last two approximations. To check this estimate of the integral, d01arf could be called again to evaluate
abftdt  as  ac ftdt+cb ftdt  for some ​a<c<b.  
If iparm=2, this indicates failure of convergence during the run with iparm=1 in which the Legendre expansion was created.
On entry, iparm0, 1 or 2
The routine is called with iparm=2 but a previous call with iparm=1 has been omitted or was invoked with an integration interval of length zero.
On entry, with iparm=2, the interval for indefinite integration is not contained within the interval specified when d01arf was previously called with iparm=1.
An unexpected error has been triggered by this routine. Please contact NAG.
See Section 3.9 in How to Use the NAG Library and its Documentation for further information.
Your licence key may have expired or may not have been installed correctly.
See Section 3.8 in How to Use the NAG Library and its Documentation for further information.
Dynamic memory allocation failed.
See Section 3.7 in How to Use the NAG Library and its Documentation for further information.


The relative or absolute accuracy required is specified by you in the variables relacc or absacc. d01arf will terminate whenever either the relative accuracy specified by relacc or the absolute accuracy specified by absacc is reached. One or other of these criteria may be ‘forced’ by setting the argument for the other to zero. If both relacc and absacc are specified as zero, then the routine uses the value 10.0×machine precision for relacc.
If on exit ifail=0, then it is likely that the result is correct to one or other of these accuracies. If on exit ifail=1, then it is likely that neither of the requested accuracies has been reached.
When you have no prior idea of the magnitude of the integral, it is possible that an unreasonable accuracy may be requested, e.g., a relative accuracy for an integral which turns out to be zero, or a small absolute accuracy for an integral which turns out to be very large. Even if failure is reported in such a case, the value of the integral may still be satisfactory. The device of setting the other ‘unused’ accuracy argument to a small positive value (e.g., 10-9 for an implementation of 11-digit precision) rather than zero, may prevent excessive calculation in such a situation.
To avoid spurious convergence, it is recommended that relative accuracies larger than about 10-3 be avoided.

Parallelism and Performance

d01arf is not threaded in any implementation.

Further Comments

The time taken by d01arf depends on the complexity of the integrand and the accuracy required.
This routine uses the Patterson method over the whole integration interval and should therefore be suitable for well behaved functions. However, for very irregular functions it would be more efficient to submit the differently behaved regions separately for integration.


This example evaluates the following integrals
(i) Definite integral only iparm=0 for
0141+x2 dxabsacc=10-5.  
(ii) Definite integral together with expansion coefficients iparm=1 for
(iii) Indefinite integral using previous expansion iparm=2 for

Program Text

Program Text (d01arfe.f90)

Program Data


Program Results

Program Results (d01arfe.r)

© The Numerical Algorithms Group Ltd, Oxford, UK. 2017