NAG CPP Interface
nagcpp::quad::md_gauss (d01fb)

1 Purpose

md_gauss 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.

2 Specification

#include "d01/nagcpp_d01fb.hpp"
template <typename NPTVEC, typename WEIGHT, typename ABSCIS, typename F>

double md_gauss(const NPTVEC &nptvec, const WEIGHT &weight, const ABSCIS &abscis, F f, OptionalD01FB opt)
template <typename NPTVEC, typename WEIGHT, typename ABSCIS, typename F>

double md_gauss(const NPTVEC &nptvec, const WEIGHT &weight, const ABSCIS &abscis, F f)

3 Description

md_gauss 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 wj,ij and abscissae xj,ij 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 dim1_​gauss_​wres and d01bcf (no CPP interface) once for each dimension using a quadrature formula and number of abscissae appropriate to the range of each xj and to the functional dependence of f on xj.
If normal weights are used, the summation will approximate the integral
w1(x1)w2(x2)wn(xn)f (x1,x2,,xn) dxndx2dx1  
where wj(x) is the weight function associated with the quadrature formula chosen for the jth dimension; while if adjusted weights are used, the summation will approximate the integral
f(x1,x2,,xn)dxndx2dx1.  
You must supply a function to evaluate
f(x1,x2,,xn)  
at any values of x1,x2,,xn within the range of integration.

4 References

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

5 Arguments

1: nptvec(ndim) types::f77_integer array Input
On entry: nptvec(j-1) must specify the number of points in the jth dimension of the summation, for j=1,2,,n.
2: weight(lwa) double array Input
On entry: must contain in succession the weights for the various dimensions, i.e., weight(k-1) contains the ith weight for the jth dimension, with
k=nptvec(0)+nptvec(1)++nptvec(j-2)+i.  
3: abscis(lwa) double array Input
On entry: must contain in succession the abscissae for the various dimensions, i.e., abscis(k-1) contains the ith abscissa for the jth dimension, with
k=nptvec(0)+nptvec(1)++nptvec(j-2)+i.  
4: f double Function
f must return the value of the integrand at a given point.
double f(const utility::array1D<double,data_handling::ArgIntent::IN> &x)
1: x(ndim) double array Input
On entry: the coordinates of the point at which the integrand f must be evaluated.
2: ndim types::f77_integer Input
On entry: n, the number of dimensions of the integral.
Note: f should not return floating-point NaN (Not a Number) or infinity values, since these are not handled by md_gauss. If your code inadvertently does return any NaNs or infinities, md_gauss is likely to produce unexpected results.
5: opt OptionalD01FB Input/Output
Optional parameter container, derived from Optional.

5.1Additional Quantities

1: ndim
n, the number of dimensions of the integral.
2: lwa
The dimension of the arrays weight and abscis.

6 Exceptions and Warnings

Errors or warnings detected by the function:
All errors and warnings have an associated numeric error code field, errorid, stored either as a member of the thrown exception object (see errorid), or as a member of opt.ifail, depending on how errors and warnings are being handled (see Error Handling for more details).
Raises: ErrorException
errorid=1
On entry, lwa is too small.
lwa = value.
Minimum possible dimension: value.
errorid=1
On entry, ndim = value.
Constraint: ndim20.
errorid=1
On entry, ndim = value.
Constraint: ndim1.
errorid=10601
On entry, argument value must be a vector of size value array.
Supplied argument has value dimensions.
errorid=10601
On entry, argument value must be a vector of size value array.
Supplied argument was a vector of size value.
errorid=10601
On entry, argument value must be a vector of size value array.
The size for the supplied array could not be ascertained.
errorid=10602
On entry, the raw data component of value is null.
errorid=10603
On entry, unable to ascertain a value for value.
errorid=-99
An unexpected error has been triggered by this routine.
errorid=-399
Your licence key may have expired or may not have been installed correctly.
errorid=-999
Dynamic memory allocation failed.
Raises: CallbackException
errorid=10701
An exception was thrown in a callback.
errorid=10702
The memory address for an array in a callback has changed.

7 Accuracy

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.

8 Parallelism and Performance

Please see the description for the underlying computational routine in this section of the FL Interface documentation.

9 Further Comments

The total time taken by md_gauss will be proportional to
T×nptvec(0)×nptvec(1)××nptvec(ndim-1),  
where T is the time taken for one evaluation of f.

10 Example

This example evaluates the integral
120-1 (x1x2x3) 6 (x4+2) 8e-2x2e-0.5x32dx4dx3dx2dx1  
using adjusted weights. The quadrature formulae chosen are:
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.
Source FileDataResults
ex_d01fb.cppNoneex_d01fb.r