NAG Library Function Document
nag_quad_md_numth_vec (d01gdc)
 
1
 Purpose
nag_quad_md_numth_vec (d01gdc) calculates an approximation to a definite integral in up to  dimensions, using the Korobov–Conroy number theoretic method.  
 
2
 Specification
| 
| #include <nag.h> |  
| #include <nagd01.h> |  
| void | nag_quad_md_numth_vec (Integer ndim, Integer npts,
double vk[],
Integer nrand,
Nag_Boolean transform,
double *res,
double *err,
Nag_Comm *comm, 
NagError *fail)| 
| void | (*vecreg)(Integer ndim,
const double x[],
Integer j,
double c[],
double d[],
Integer m,
Nag_Comm *comm), |  | 
 |  | 
 
3
 Description
nag_quad_md_numth_vec (d01gdc) calculates an approximation to the integral
using the Korobov–Conroy number theoretic method (see 
Korobov (1957), 
Korobov (1963) and 
Conroy (1967)).  The region of integration defined in 
(1) is such that generally 
 and 
 may be functions of 
, for 
,  with 
 and 
 constants.  The integral is first of all transformed to an integral over the 
-cube 
 by the change of variables
The method then uses as its basis the number theoretic formula for the 
-cube, 
:
where 
 denotes the fractional part of 
, 
 are the so-called optimal coefficients, 
 is the error, and 
 is a prime integer.  (It is strictly only necessary that 
 be relatively prime to all 
 and is in fact chosen to be even for some cases in 
Conroy (1967).)  The method makes use of properties of the Fourier expansion of 
 which is assumed to have some degree of periodicity.  Depending on the choice of 
 the contributions from certain groups of Fourier coefficients are eliminated from the error, 
.  Korobov shows that 
 can be chosen so that the error satisfies
where 
 and 
 are real numbers depending on the convergence rate of the Fourier series, 
 is a constant depending on 
, and 
 is a constant depending on 
 and 
.  There are a number of procedures for calculating these optimal coefficients.  Korobov imposes the constraint that
and gives a procedure for calculating the argument, 
, to satisfy the optimal conditions.
 In this function the periodisation is achieved by the simple transformation
More sophisticated periodisation procedures are available but in practice the degree of periodisation does not appear to be a critical requirement of the method.
An easily calculable error estimate is not available apart from repetition with an increasing sequence of values of 
 which can yield erratic results.  The difficulties have been studied by 
Cranley and Patterson (1976) who have proposed a Monte–Carlo error estimate arising from converting 
(2) into a stochastic integration rule by the inclusion of a random origin shift which leaves the form of the error 
(3) unchanged; i.e., in the formula 
(2), 
 is replaced by 
, for 
, where each 
,  is uniformly distributed over 
.  Computing the integral for each of a sequence of random vectors 
 allows a ‘standard error’ to be estimated.
This function provides built-in sets of optimal coefficients, corresponding to six different values of 
.  Alternatively, the optimal coefficients may be supplied by you.  Functions 
nag_quad_md_numth_coeff_prime (d01gyc) and 
nag_quad_md_numth_coeff_2prime (d01gzc) compute the optimal coefficients for the cases where 
 is a prime number or 
 is a product of two primes, respectively.
 
4
 References
Conroy H (1967)  Molecular Shroedinger equation VIII. A new method for evaluting multi-dimensional integrals J. Chem. Phys. 47 5307–5318 
Cranley R and Patterson T N L (1976)  Randomisation of number theoretic methods for mulitple integration SIAM J. Numer. Anal. 13 904–914 
Korobov N M (1957)  The approximate calculation of multiple integrals using number theoretic methods Dokl. Acad. Nauk SSSR 115 1062–1065 
Korobov N M (1963)  Number Theoretic Methods in Approximate Analysis Fizmatgiz, Moscow 
 
5
 Arguments
- 1:
  
      – IntegerInput
- 
On entry: , the number of dimensions of the integral. Constraint:
  .
 
- 2:
  
      – function, supplied by the userExternal Function
- 
vecfun must evaluate the integrand at a specified set of points. 
 
The specification of  vecfun is: 
| 
| void | vecfun (Integer ndim,
const double x[],
double fv[],
Integer m,
Nag_Comm *comm) |  |  
 - 1:
  
      – IntegerInput
- 
On entry: , the number of dimensions of the integral. 
- 2:
  
      – const doubleInput
- 
Note: where  appears in this document, it refers to the array element
      . On entry: the coordinates of the  points at which the integrand must be evaluated.  contains the th coordinate of the th point. 
- 3:
  
      – doubleOutput
- 
On exit:  must contain the value of the integrand of the th point, i.e., , for . 
- 4:
  
      – IntegerInput
- 
On entry: the number of points  at which the integrand is to be evaluated. 
- 5:
  
      – Nag_Comm *
- Pointer to structure of type Nag_Comm; the following members are relevant to  vecfun- . 
- user – double *
- iuser – Integer *
- p – Pointer 
- The type Pointer will be  void *- .  Before calling  nag_quad_md_numth_vec (d01gdc)-  you may allocate memory and initialize these pointers with various quantities for use by  vecfun-  when called from  nag_quad_md_numth_vec (d01gdc)-  (see  Section 3.3.1.1-  in How to Use the NAG Library and its Documentation). 
 
 
 Note: vecfun should not return floating-point NaN (Not a Number) or infinity values, since these are not handled by  nag_quad_md_numth_vec (d01gdc). If your code inadvertently  does return any NaNs or infinities,  nag_quad_md_numth_vec (d01gdc) is likely to produce unexpected results. 
 
- 3:
  
      – function, supplied by the userExternal Function
- 
vecreg must evaluate the limits of integration in any dimension for a set of points. 
 
The specification of  vecreg is: 
| 
| void | vecreg (Integer ndim,
const double x[],
Integer j,
double c[],
double d[],
Integer m,
Nag_Comm *comm) |  |  
 - 1:
  
      – IntegerInput
- 
On entry: , the number of dimensions of the integral. 
- 2:
  
      – const doubleInput
- 
Note: where  appears in this document, it refers to the array element
      . On entry: for , ,  contain the current values of the first  coordinates of the th point, which may be used if necessary in calculating the  values of  and . 
- 3:
  
      – IntegerInput
- 
On entry: the index  for which the limits of the range of integration are required. 
- 4:
  
      – doubleOutput
- 
On exit:  must be set to the lower limit of the range for , for . 
- 5:
  
      – doubleOutput
- 
On exit:  must be set to the upper limit of the range for , for . 
- 6:
  
      – IntegerInput
- 
On entry: the number of points  at which the limits of integration must be specified. 
- 7:
  
      – Nag_Comm *
- Pointer to structure of type Nag_Comm; the following members are relevant to  vecreg- . 
- user – double *
- iuser – Integer *
- p – Pointer 
- The type Pointer will be  void *- .  Before calling  nag_quad_md_numth_vec (d01gdc)-  you may allocate memory and initialize these pointers with various quantities for use by  vecreg-  when called from  nag_quad_md_numth_vec (d01gdc)-  (see  Section 3.3.1.1-  in How to Use the NAG Library and its Documentation). 
 
 
 Note: vecreg should not return floating-point NaN (Not a Number) or infinity values, since these are not handled by  nag_quad_md_numth_vec (d01gdc). If your code inadvertently  does return any NaNs or infinities,  nag_quad_md_numth_vec (d01gdc) is likely to produce unexpected results. 
 
- 4:
  
      – IntegerInput
- 
On entry: the Korobov rule to be used. There are two alternatives depending on the value of  npts.
 
| (i) | . In this case one of six preset rules is chosen using  ,  ,  ,  ,   or   points depending on the respective value of npts  being  ,  ,  ,  ,   or  . |  
| (ii) | . npts is the number of actual points to be used with corresponding optimal coefficients supplied in the array vk . |  
 
 Constraint:
  .
 
- 5:
  
      – doubleInput/Output
- 
On entry: if  ,  vk must contain the   optimal coefficients (which may be calculated using  nag_quad_md_numth_coeff_prime (d01gyc) or  nag_quad_md_numth_coeff_2prime (d01gzc)).
 If  ,  vk need not be set. 
 On exit: if  ,  vk is unchanged.
 If  ,  vk contains the   optimal coefficients used by the preset rule. 
 
- 6:
  
      – IntegerInput
- 
On entry: the number of random samples to be generated (generally a small value, say   to  , is sufficient). The estimate,  res, of the value of the integral returned by the function is then the average of  nrand calculations with different random origin shifts. If  , the total number of integrand evaluations will be  . If  , the number of integrand evaluations will be  , where   is the number of points corresponding to the six preset rules. For reasons of efficiency, these values are calculated a number at a time in  vecfun. 
 Constraint:
  .
 
- 7:
  
      – Nag_BooleanInput
- 
On entry: indicates whether the periodising transformation is to be used. 
 
- The transformation is to be used.
- The transformation is to be suppressed (to cover cases where the integrand may already be periodic or where you want to specify a particular transformation in the definition of vecfun).
 
 Suggested value:
  . 
 
- 8:
  
      – double *Output
- 
On exit: the approximation to the integral . 
- 9:
  
      – double *Output
- 
On exit: the standard error as computed from  nrand sample values. If  ,  err contains zero. 
 
- 10:
  
    – Nag_Comm *
- 
The NAG communication argument (see  Section 3.3.1.1 in How to Use the NAG Library and its Documentation). 
- 11:
  
    – NagError *Input/Output
- 
The NAG error argument (see  Section 3.7 in How to Use the NAG Library and its Documentation). 
 
6
 Error Indicators and Warnings
- NE_ALLOC_FAIL
- 
Dynamic memory allocation failed.
       
      See  Section 2.3.1.2  in How to Use the NAG Library and its Documentation for further information. 
- NE_BAD_PARAM
- 
On entry, argument   had an illegal value. 
- NE_INT
- 
On entry, .
 Constraint: .
 
On entry,  npts must be at least  :  .
 
On entry,  nrand must be at least  :  .
 
- NE_INTERNAL_ERROR
- 
An internal error has occurred in this function. Check the function call and any array sizes. If the call is correct then please contact  NAG for assistance. 
	See  Section 2.7.6  in How to Use the NAG Library and its Documentation for further information. 
- NE_NO_LICENCE
- 
Your licence key may have expired or may not have been installed correctly.
       
      See  Section 2.7.5 in How to Use the NAG Library and its Documentation for further information. 
 
7
 Accuracy
If 
, an estimate of the absolute standard error is given by the value, on exit, of 
err.
 
8
 Parallelism and Performance
nag_quad_md_numth_vec (d01gdc) is threaded by NAG for parallel execution in multithreaded implementations of the NAG Library.
Please consult the 
x06 Chapter Introduction for information on how to control and interrogate the OpenMP environment used within this function. Please also consult the 
Users' Note for your implementation for any additional implementation-specific information.
vecfun and 
vecreg must calculate the integrand and limits of integration at a 
set of points.  For some problems the amount of time spent in these two functions, which must be supplied by you, may account for a significant part of the total computation time.  
 The time taken will be approximately proportional to 
, where 
 is the number of points used, but may depend significantly on the efficiency of the code provided by you in 
vecfun and 
vecreg.
The exact values of 
res and 
err on return will depend (within statistical limits) on the sequence of random numbers generated within 
nag_quad_md_numth_vec (d01gdc) by calls to 
nag_rand_basic (g05sac). Separate runs will produce identical answers.
 
10
 Example
This example calculates the integral
 
10.1
 Program Text
Program Text (d01gdce.c)
 
10.2
 Program Data
None.
 
10.3
 Program Results
Program Results (d01gdce.r)