| adaptIntegrateSphereTri {SphericalCubature} | R Documentation | 
Adaptive integration over spherical triangles
Description
Adaptively integrate a function over a set of spherical triangles.
Function adaptIntegrateSphereTri() uses spherical triangles and 
works in n-dimensions; it uses function adaptIntegrateSimplex() in package SimplicialCubature, which is 
based on code of Alan Genz.  adaptIntegrateSphereTri3d() works only in 3-dimensions and is 
described in the paper by N. Boal and F-J. Sayas; it is not as sophisticated and is slower than adaptIntegrateSphereTri(), but can be useful and is self contained.  
Usage
adaptIntegrateSphereTri( f, n, S, fDim=1L, maxEvals=20000L, absError=0.0, 
    tol=1.0e-5, integRule=3L, partitionInfo=FALSE, ...  ) 
adaptIntegrateSphereTri3d( f, S, maxRef=50, relTol=0.001, maxTri=50000, gamma=1.5 ) 
adaptIntegrateSphereTriI0( f, K )
adaptIntegrateSphereTriI1( f, K )
adaptIntegrateSphereTriSubdivideK( K ) 
Arguments
| f | function f defined on the sphere | 
| S | array of spherical triangles, dim(S)=c(n,n,nS).  Columns of S should be points on the unit sphere: sum(S[,i,j]^2)=1. Execution will be faster if every simplex S[,,j] is 
contained within any single orthant.  This will happend automatically if function  | 
| n | dimension of the ball | 
| fDim | integer dimension of the integrand function | 
| maxEvals | maximum number of evaluations allowed | 
| absError | desired absolute error | 
| tol | desired relative tolerance | 
| integRule | integration rule to use in call to function  | 
| partitionInfo | if TRUE, return the final partition after subdivision | 
| ... | optional arguments to function f(x,...) | 
| maxRef | maximum number of refinements allowed | 
| relTol | desired relative tolerance | 
| maxTri | maximum number of triangles allowed while refining | 
| gamma | threshold parameter for when a triangle is subdivided, should be >= 1 | 
| K | a single spherical triangle in 3 space, dim(K)=c(3,3) | 
Details
adaptIntegrateSphereTri3d() takes as input a function 
f defined on the unit sphere in 3-dimensions and a list of spherical triangles K0 and attempts to 
integrate f over the part of the unit sphere described by K0.  The triangles in K0 should individually contained 
in an orthant. The algorithm estimates the integral over each triangle, then estimates error on each triangle, 
and subdivides triangles with large errors.  This is repeated until either the desired accuracy is achieved, 
or there are too many subdivisions.
Functions adaptIntegrateSphereI0(), adaptIntegrateSphereI1(), and adaptIntegrateSphereSubdivideK() are internal 
functions that compute the integral I0 for a spherical triangle, integral I1 for a spherical triangle, and subdivide
spherical triangle K into 4 smaller spherical triangles (using midpoints of each side).
adaptIntegrateSphereTri()  takes as input a function 
f defined on the unit sphere in n-dimensions and a list of spherical triangles S and attempts to 
integrate f over (part of) the unit sphere described by S.  It uses the R package SimplicialCubature to
evaluate the integrals.  The spherical triangles in S should individually be contained 
in an orthant. The algorithm estimates the integral over each triangle, then estimates error on each triangle, 
and subdivides triangles with large errors.  This is repeated until either the desired accuracy is achieved, 
or there are too many subdivisions.  This function is more general than adaptIntegrateSphereTri3d in two 
ways: (1) it works in dimension n >= 2, and (2) it allows vector integrands f.  It also is generaly faster
than adaptIntegrateSphereTri(). Use the function Orthants() to get a rough triangulation of
the sphere; see the examples below.  For finer resolution triangulation can be obtained from 
UnitSphere() in R package mvmesh.    
For description of adaptIntegrateSphereTri3d() see www.unizar.es/galdeano/actas_pau/PDFVIII/pp61-69.pdf. 
Thoughtful choice of the spherical trianges can result in faster and more accurate results, see the example below with
function f3().
Value
A list containing
| status | a string describing result, ideally it should be "success", otherwise it is an error/warning message. | 
| integral | approximation to the value of the integral | 
| I0 | vector of approximate integral over each triangle in K | 
| numRef | number of refinements | 
| nk | number of triangles in K | 
| K | array of spherical triangles after subdivision, dim(K)=c(3,3,nk) | 
| est.error | estimated error | 
| subsimplices | if partitionInfo=TRUE, this gives an array of subsimplices, see function adsimp for more details. | 
| subsimplicesIntegral | if partitionInfo=TRUE, this array gives estimated values of each component of the integral on each subsimplex, see function adsimp for more details. | 
| subsimplicesAbsError | if partitionInfo=TRUE, this array gives estimated values of the absolute error of each component of the integral on each subsimplex, see function adsimp for more details. | 
| subsimplicesVolume | if partitionInfo=TRUE, vector of m-dim. volumes of subsimplices; this is not d-dim. volume if m < n. | 
Examples
# test of polynomial integration f(s)=s[1]^2
f <- function( s ) { return( s[1]^2 ) }
n <- 3
# integrate over whole sphere
S <- Orthants( n )
a <- adaptIntegrateSphereTri( f, n, S )
b <- adaptIntegrateSphereTri3d( f, S )
# exact answer, adaptIntegrateSphereTri approximation, adaptIntegrateSphereTri3d approximation
sphereArea(n)/n; a$integral; b$integral
# integrate over first orthant only
S <- Orthants( n, positive.only=TRUE ) 
a <- adaptIntegrateSphereTri( f, n, S )
b <- adaptIntegrateSphereTri3d( f, S )
# exact answer, adaptIntegrateSphereTri approximation, adaptIntegrateSphereTri3d approximation
sphereArea(n)/(8*n); a$integral; b$integral
# example of specifiying spherical triangles that make the integration easier
f3 <- function( x ) { sqrt( abs( x[1]-3*x[2] ) ) } # has a cusp along the line x[1]=3*x[2]
a <- adaptIntegrateSphereTri( f3, n=2, partitionInfo=TRUE )
str(a)
# define problem specific spherical triangles, using direction of the cusp
phi <- atan(1/3); c1 <- cos(phi); s1 <- sin(phi)
S <- array( c(1,0,c1,s1,  c1,s1,0,1,    0,1,-1,0,   -1,0,-c1,-s1,  
            -c1,-s1,0,-1, 0,-1,1,0), dim=c(2,2,6) )
b <- adaptIntegrateSphereTri( f3, n=2, S, partitionInfo=TRUE )
str(b) # estAbsError here is 1/6 of above with approx. the same number of function evaluations