NAG FL Interface
d01arf (dim1_indef)
1
Purpose
d01arf computes definite and indefinite integrals over a finite range to a specified relative or absolute accuracy, using the method described in
Patterson (1968).
2
Specification
Fortran Interface
Subroutine d01arf ( |
a, b, f, 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 |
:: |
f |
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 <nag.h>
void |
d01arf_ (const double *a, const double *b, double (NAG_CALL *f)(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) |
|
C++ Header Interface
#include <nag.h> extern "C" {
void |
d01arf_ (const double &a, const double &b, double (NAG_CALL *f)(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) |
}
|
The routine may be called by the names d01arf or nagf_quad_dim1_indef.
3
Description
d01arf evaluates definite and indefinite integrals of the form:
using the method described in
Patterson (1968).
3.1
Definite Integrals
In this case
d01arf must be called with
. By linear transformation the integral is changed to
where
and is then approximated by an
-point quadrature rule
where
are the weights and
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 , , , , , , , and points and have respective polynomial integrating degrees , , , , , , , and . 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.
3.2
Indefinite Integrals
Suppose the value of the integral
is required for a number of sub-intervals
, all of which lie in an interval
.
In this case d01arf should first be called with the argument and the interval set to . The routine then calculates the integral over and the Legendre expansion of the integrand, using the same integrand values. If the routine is subsequently called with and the interval set to , the integral over is calculated by analytical integration of the Legendre expansion, without further evaluations of the integrand.
For the interval
the expansion takes the form
where
is the order
Legendre polynomial. Assuming that the integral over the full range
was evaluated to the required accuracy using an
-point rule, then the coefficients
are evaluated by that same rule, up to
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
is a polynomial of degree
.
4
References
Patterson T N L (1968) The Optimum addition of points to quadrature formulae Math. Comput. 22 847–856
5
Arguments
-
1:
– Real (Kind=nag_wp)
Input
-
On entry: , the lower limit of integration.
-
2:
– Real (Kind=nag_wp)
Input
-
On entry: , the upper limit of integration. It is not necessary that .
-
3:
– real (Kind=nag_wp) Function, supplied by the user.
External Procedure
-
f must return the value of the integrand at a given point.
The specification of
f is:
Fortran Interface
Real (Kind=nag_wp) |
:: |
f |
Real (Kind=nag_wp), Intent (In) |
:: |
x |
|
C Header Interface
double |
f_ (const double *x) |
|
C++ Header Interface
#include <nag.h> extern "C" {
double |
f_ (const double &x) |
}
|
-
1:
– Real (Kind=nag_wp)
Input
-
On entry: the point in at which the integrand must be evaluated.
f 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: f 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
,
f is not called.
-
4:
– 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
, its absolute value is used.
If
,
relacc is not used.
-
5:
– 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
, its absolute value is used.
If
,
absacc is not used.
-
6:
– Integer
Input
-
On entry: the maximum number of successive rules that may be used.
Constraint:
. If
maxrul is outside these limits, the value
is assumed.
If
,
maxrul is not used.
-
7:
– Integer
Input
-
On entry: indicates the task to be performed by the routine.
- Only the definite integral over is evaluated.
- As well as the definite integral, the expansion of the integrand in Legendre polynomials over 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.
- is integrated analytically over using the previously computed expansion, stored in alpha. No further evaluations of the integrand are required. The routine must previously have been called with and the interval 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:
, or .
-
8:
– Real (Kind=nag_wp)
Output
-
On exit: if
or
,
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
,
acc is not used.
-
9:
– Real (Kind=nag_wp)
Output
-
On exit: the estimated value of the integral.
-
10:
– Integer
Output
-
On exit: when
or
,
n contains the number of integrand evaluations used in the calculation of the integral.
If
,
n is not used.
-
11:
– Real (Kind=nag_wp) array
Input/Output
-
On entry: if
,
alpha must contain the coefficients of the Legendre expansions of the integrand, as returned by a previous call of
d01arf with
and a range containing the present range.
If
or
,
alpha need not be set on entry.
On exit: if
, the first
elements of
alpha hold the coefficients of the Legendre expansion of the integrand, and the value of
is stored in
.
alpha must not be changed between a call with
and subsequent calls with
.
If
, the first
elements of
alpha are unchanged on exit.
-
12:
– Integer
Input/Output
-
On entry:
ifail must be set to
,
or
to set behaviour on detection of an error; these values have no effect when no error is detected.
A value of causes the printing of an error message and program execution will be halted; otherwise program execution continues. A value of means that an error message is printed while a value of means that it is not.
If halting is not appropriate, the value
or
is recommended. If message printing is undesirable, then the value
is recommended. Otherwise, the value
is recommended since useful values can be provided in some output arguments even when
on exit.
When the value or is used it is essential to test the value of ifail on exit.
On exit:
unless the routine detects an error or a warning has been flagged (see
Section 6).
6
Error Indicators and Warnings
If on entry
or
, explanatory error messages are output on the current error message unit (as defined by
x04aaf).
Errors or warnings detected by the routine:
Note: in some cases d01arf may return useful information.
-
All
maxrul rules have been used but the integral has not converged to the accuracy requested.
.
Failure in convergence during the run with in which the Legendre expansion was created.
-
On entry, .
Constraint: , or .
-
The routine was called with , but a previous call with has been omitted, or made with zero integration interval.
-
The routine was called with , but the interval for indefinite integration is not contained within the interval specified in the previous call with .
An unexpected error has been triggered by this routine. Please
contact
NAG.
See
Section 7 in the Introduction to the NAG Library FL Interface for further information.
Your licence key may have expired or may not have been installed correctly.
See
Section 8 in the Introduction to the NAG Library FL Interface for further information.
Dynamic memory allocation failed.
See
Section 9 in the Introduction to the NAG Library FL Interface for further information.
7
Accuracy
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
for
relacc.
If on exit , then it is likely that the result is correct to one or other of these accuracies. If on exit , 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., for an implementation of -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 be avoided.
8
Parallelism and Performance
d01arf is not threaded in any implementation.
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.
10
Example
This example evaluates the following integrals
-
(i)Definite integral only for
-
(ii)Definite integral together with expansion coefficients for
-
(iii)Indefinite integral using previous expansion for
10.1
Program Text
10.2
Program Data
None.
10.3
Program Results