Raw File
integral2.Rd
\name{integral2}
\alias{integral2}
\alias{integral3}
\title{
  Numerically Evaluate Double  and Triple Integrals
}
\description{
  Numerically evaluate a double integral, resp. a triple integral by
  reducing it to a double integral.
}
\usage{
integral2(fun, xmin, xmax, ymin, ymax, sector = FALSE,
            reltol = 1e-6, abstol = 0, maxlist = 5000,
            singular = FALSE, vectorized = TRUE, ...)

integral3(fun, xmin, xmax, ymin, ymax, zmin, zmax,
            reltol = 1e-6, ...)
}
\arguments{
  \item{fun}{function}
  \item{xmin, xmax}{lower and upper limits of x.}
  \item{ymin, ymax}{lower and upper limits of y.}
  \item{zmin, zmax}{lower and upper limits of z.}
  \item{sector}{logical.}
  \item{reltol}{relative tolerance.}
  \item{abstol}{absolute tolerance.}
  \item{maxlist}{maximum length of the list of rectangles.}
  \item{singular}{logical; are there singularities at vertices.}
  \item{vectorized}{logical; is the function fully vectorized.}
  \item{...}{additional parameters to be passed to the function.}
}
\details{
  \code{integral2} implements the `TwoD' algorithm, that is Gauss-Kronrod
  with (3, 7)-nodes on 2D rectangles.

  The borders of the domain of integration must be finite. The limits of
  \code{y}, that is \code{ymin} and \code{ymax}, can be constants or scalar
  functions of x that describe the lower and upper boundaries. These
  functions must be vectorized.

  \code{integral2} attempts to satisfy \code{ERRBND <= max(AbsTol,RelTol*|Q|)}.
  This is absolute error control when \code{|Q|} is sufficiently small and
  relative error control when \code{|Q|} is larger.

  The function \code{fun} itself must be fully vectorized:
  It must accept arrays \code{X} and \code{Y} and return an array
  \code{Z = f(X,Y)} of corresponding values. If option \code{vectorized} is
  set to \code{FALSE} the procedure will enforce this vectorized behavior.

  With \code{sector=TRUE} the region is a generalized sector that is described
  in polar coordinates (r,theta) by

  \code{0 <= a <= theta <= b} -- a and b must be constants\cr
  \code{c <= r <= d} -- c and d can be constants or ...

  ... functions of theta that describe the lower and upper boundaries.
  Functions must be vectorized.\cr
  NOTE Polar coordinates  are used only to describe the region --
  the integrand is \code{f(x,y)} for both kinds of regions.

  \code{integral2} can be applied to functions that are singular on a boundary.
  With value \code{singular=TRUE}, this option causes \code{integral2} to use
  transformations to weaken singularities for better performance.

  \code{integral3} also accepts functions for the inner interval limits.
  \code{ymin, ymax} must be constants or functions of one variable (\code{x}),
  \code{zmin, zmax} constants or functions of two variables (\code{x, y}), all
  functions vectorized.

  The triple integral will be first integrated over the second and third 
  variable with \code{integral2}, and then integrated over a single variable 
  with \code{integral}.
}
\value{
  Returns a list with \code{Q} the integral and \code{error} the error term.
}
\references{
  Shampine, L. F. (2008). MATLAB Program for Quadrature in 2D.
  Proceedings of Applied Mathematics and Computation, 2008, pp. 266--274.
}
\author{
  Copyright (c) 2008 Lawrence F. Shampine for Matlab code and description
  of the program; adapted and converted to R by Hans W Borchers.
}
\note{
  To avoid recursion, a possibly large matrix will be used and passed between
  subprograms. A more efficient implementation may be possible.
}
\seealso{
  \code{\link{integral}}, \code{cubature:adaptIntegrate}
}
\examples{
fun <- function(x, y) cos(x) * cos(y)
integral2(fun, 0, 1, 0, 1, reltol = 1e-10)
# $Q:     0.708073418273571  # 0.70807341827357119350 = sin(1)^2
# $error: 8.618277e-19       # 1.110223e-16

##  Compute the volume of a sphere
f <- function(x, y) sqrt(1 -x^2 - y^2)
xmin <- 0; xmax <- 1
ymin <- 0; ymax <- function(x) sqrt(1 - x^2)
I <- integral2(f, xmin, xmax, ymin, ymax)
I$Q                             # 0.5236076 - pi/6 => 8.800354e-06

##  Compute the volume over a sector
I <- integral2(f, 0,pi/2, 0,1, sector = TRUE)
I$Q                             # 0.5236308 - pi/6 => 3.203768e-05

##  Integrate 1/( sqrt(x + y)*(1 + x + y)^2 ) over the triangle
##   0 <= x <= 1, 0 <= y <= 1 - x.  The integrand is infinite at (0,0).
f <- function(x,y) 1/( sqrt(x + y) * (1 + x + y)^2 )
ymax <- function(x) 1 - x
I <- integral2(f, 0,1, 0,ymax)
I$Q + 1/2 - pi/4                # -3.247091e-08

##  Compute this integral as a sector
rmax <- function(theta) 1/(sin(theta) + cos(theta))
I <- integral2(f, 0,pi/2, 0,rmax, sector = TRUE, singular = TRUE)
I$Q + 1/2 - pi/4                # -4.998646e-11

##  Examples of computing triple integrals
f0 <- function(x, y, z) y*sin(x) + z*cos(x)
integral3(f0, 0, pi, 0,1, -1,1) # - 2.0 => 0.0

f1 <- function(x, y, z) exp(x+y+z)
integral3(f1, 0, 1, 1, 2, 0, 0.5)
## [1] 5.206447                         # 5.20644655

f2 <- function(x, y, z) x^2 + y^2 + z
a <- 2; b <- 4
ymin <- function(x) x - 1
ymax <- function(x) x + 6
zmin <- -2
zmax <- function(x, y) 4 + y^2
integral3(f2, a, b, ymin, ymax, zmin, zmax)
## [1] 47416.75556                      # 47416.7555556

f3 <- function(x, y, z) sqrt(x^2 + y^2)
a <- -2; b <- 2
ymin <- function(x) -sqrt(4-x^2)
ymax <- function(x)  sqrt(4-x^2)
zmin <- function(x, y)  sqrt(x^2 + y^2)
zmax <- 2
integral3(f3, a, b, ymin, ymax, zmin, zmax)
## [1] 8.37758                          # 8.377579076269617
}
\keyword{ math }
back to top