# NAG Library Routine Document

## 1Purpose

d01fbf computes an estimate of a multidimensional integral (from $1$ to $20$ dimensions), given the analytic form of the integrand and suitable Gaussian weights and abscissae.

## 2Specification

Fortran Interface
 Function d01fbf ( ndim, lwa, fun,
 Real (Kind=nag_wp) :: d01fbf Integer, Intent (In) :: ndim, nptvec(ndim), lwa Integer, Intent (Inout) :: ifail Real (Kind=nag_wp), External :: fun Real (Kind=nag_wp), Intent (In) :: weight(lwa), abscis(lwa)
#include nagmk26.h
 double d01fbf_ (const Integer *ndim, const Integer nptvec[], const Integer *lwa, const double weight[], const double abscis[], double (NAG_CALL *fun)(const Integer *ndim, const double x[]),Integer *ifail)

## 3Description

d01fbf approximates a multidimensional integral by evaluating the summation
 $∑i1=1l1 w 1,i1 ∑i2=1l2 w2,i2 ⋯ ∑in=1ln wn,in f x 1 , i1 , x 2 , i2 ,…, x n , in$
given the weights ${w}_{j,{i}_{j}}$ and abscissae ${x}_{j,{i}_{j}}$ for a multidimensional product integration rule (see Davis and Rabinowitz (1975)). The number of dimensions may be anything from $1$ to $20$.
The weights and abscissae for each dimension must have been placed in successive segments of the arrays weight and abscis; for example, by calling d01bcf or d01tbf once for each dimension using a quadrature formula and number of abscissae appropriate to the range of each ${x}_{j}$ and to the functional dependence of $f$ on ${x}_{j}$.
If normal weights are used, the summation will approximate the integral
 $∫w1x1∫w2x2⋯∫wnxnf x1,x2,…,xn dxn⋯dx2dx1$
where ${w}_{j}\left(x\right)$ is the weight function associated with the quadrature formula chosen for the $j$th dimension; while if adjusted weights are used, the summation will approximate the integral
 $∫∫⋯∫fx1,x2,…,xndxn⋯dx2dx1.$
You must supply a subroutine to evaluate
 $fx1,x2,…,xn$
at any values of ${x}_{1},{x}_{2},\dots ,{x}_{n}$ within the range of integration.

## 4References

Davis P J and Rabinowitz P (1975) Methods of Numerical Integration Academic Press

## 5Arguments

1:     $\mathbf{ndim}$ – IntegerInput
On entry: $n$, the number of dimensions of the integral.
Constraint: $1\le {\mathbf{ndim}}\le 20$.
2:     $\mathbf{nptvec}\left({\mathbf{ndim}}\right)$ – Integer arrayInput
On entry: ${\mathbf{nptvec}}\left(\mathit{j}\right)$ must specify the number of points in the $\mathit{j}$th dimension of the summation, for $\mathit{j}=1,2,\dots ,n$.
3:     $\mathbf{lwa}$ – IntegerInput
On entry: the dimension of the arrays weight and abscis as declared in the (sub)program from which d01fbf is called.
Constraint: ${\mathbf{lwa}}\ge {\mathbf{nptvec}}\left(1\right)+{\mathbf{nptvec}}\left(2\right)+\cdots +{\mathbf{nptvec}}\left({\mathbf{ndim}}\right)$.
4:     $\mathbf{weight}\left({\mathbf{lwa}}\right)$ – Real (Kind=nag_wp) arrayInput
On entry: must contain in succession the weights for the various dimensions, i.e., ${\mathbf{weight}}\left(k\right)$ contains the $i$th weight for the $j$th dimension, with
 $k=nptvec1+nptvec2+⋯+nptvecj-1+i.$
5:     $\mathbf{abscis}\left({\mathbf{lwa}}\right)$ – Real (Kind=nag_wp) arrayInput
On entry: must contain in succession the abscissae for the various dimensions, i.e., ${\mathbf{abscis}}\left(k\right)$ contains the $i$th abscissa for the $j$th dimension, with
 $k=nptvec1+nptvec2+⋯+nptvecj-1+i.$
6:     $\mathbf{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 ( ndim, x)
 Real (Kind=nag_wp) :: fun Integer, Intent (In) :: ndim Real (Kind=nag_wp), Intent (In) :: x(ndim)
#include nagmk26.h
 double fun (const Integer *ndim, const double x[])
1:     $\mathbf{ndim}$ – IntegerInput
On entry: $n$, the number of dimensions of the integral.
2:     $\mathbf{x}\left({\mathbf{ndim}}\right)$ – Real (Kind=nag_wp) arrayInput
On entry: the coordinates of the point 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 d01fbf 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 d01fbf. If your code inadvertently does return any NaNs or infinities, d01fbf is likely to produce unexpected results.
7:     $\mathbf{ifail}$ – IntegerInput/Output
On entry: ifail must be set to $0$, $-1\text{​ 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\text{​ or ​}1$ is recommended. If the output of error messages is undesirable, then the value $1$ is recommended. Otherwise, if you are not familiar with this argument, the recommended value is $0$. When the value $-\mathbf{1}\text{​ or ​}\mathbf{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).

## 6Error Indicators and Warnings

If on entry ${\mathbf{ifail}}=0$ or $-1$, explanatory error messages are output on the current error message unit (as defined by x04aaf).
Errors or warnings detected by the routine:
${\mathbf{ifail}}=1$
 On entry, ${\mathbf{ndim}}<1$, or ${\mathbf{ndim}}>20$, or ${\mathbf{lwa}}<{\mathbf{nptvec}}\left(1\right)+{\mathbf{nptvec}}\left(2\right)+\cdots +{\mathbf{nptvec}}\left({\mathbf{ndim}}\right)$.
${\mathbf{ifail}}=-99$
See Section 3.9 in How to Use the NAG Library and its Documentation for further information.
${\mathbf{ifail}}=-399$
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.
${\mathbf{ifail}}=-999$
Dynamic memory allocation failed.
See Section 3.7 in How to Use the NAG Library and its Documentation for further information.

## 7Accuracy

The accuracy of the computed multidimensional sum depends on the weights and the integrand values at the abscissae. If these numbers vary significantly in size and sign then considerable accuracy could be lost. If these numbers are all positive, then little accuracy will be lost in computing the sum.

## 8Parallelism and Performance

d01fbf is not threaded in any implementation.

The total time taken by d01fbf will be proportional to
 $T×nptvec1×nptvec2×⋯×nptvecndim,$
where $T$ is the time taken for one evaluation of fun.

## 10Example

This example evaluates the integral
 $∫12∫0∞∫-∞∞∫1∞ x1x2x3 6 x4+2 8e-2x2e-0.5x32dx4dx3dx2dx1$
• ${x}_{1}$: Gauss–Legendre, $a=1.0$, $b=2.0$,
• ${x}_{2}$: Gauss–Laguerre, $a=0.0$, $b=2.0$,
• ${x}_{3}$: Gauss–Hermite, $a=0.0$, $b=0.5$,
• ${x}_{4}$: rational Gauss, $a=1.0$, $b=2.0$.
Four points are sufficient in each dimension, as this integral is in fact a product of four one-dimensional integrals, for each of which the chosen four-point formula is exact.

### 10.1Program Text

Program Text (d01fbfe.f90)

None.

### 10.3Program Results

Program Results (d01fbfe.r)

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