myintegrate {elliptic}R Documentation

Complex integration

Description

Integration of complex valued functions along the real axis (myintegrate()), along arbitrary paths (integrate.contour()), and following arbitrary straight line segments (integrate.segments()).

Usage

myintegrate(f, lower,upper, ...)
integrate.contour(f,u,udash, ...)
integrate.segments(f,points, close=TRUE, ...)

Arguments

f function, possibly complex valued
lower Lower limit of integration in myintegrate(); a real number
upper Upper limit of integration in myintegrate(); a real number (for complex values, use integrate.contour() or integrate.segments())
... Extra arguments passed to integrate()
u Function mapping [0,1] to the contour. For a closed contour, require that u(0)=u(1).
udash Derivative of u.
points In function integrate.segments(), a vector of complex numbers. Integration will be taken over straight segments joining consecutive elements of points.
close In function integrate.segments(), a Boolean variable with default TRUE meaning to integrate along the segment from points[n] to points[1] in addition to the internal segments.

Author(s)

Robin K. S. Hankin

Examples

# To integrate round the unit circle, we need the contour and its
# derivative:

 u <- function(x){exp(pi*2i*x)}
 udash <- function(x){pi*2i*exp(pi*2i*x)}

# First, some elementary functions, for practice:
integrate.contour(function(z){1/z},u,udash)            # should be 2*pi*i
integrate.contour(function(z){log(z)},u,udash)         # should be -2*pi*i
integrate.contour(function(z){sin(z)+1/z^2},u,udash)   # should be zero

# Now, some elliptic functions:
g <- c(3,2+4i)
Zeta <- function(z){zeta(z,g)}
Sigma <- function(z){sigma(z,g)}
WeierstrassP <- function(z){P(z,g)}

jj <- integrate.contour(Zeta,u,udash) 
abs(jj-2*pi*1i)                              # should be zero
abs(integrate.contour(Sigma,u,udash))        # should be zero
abs(integrate.contour(WeierstrassP,u,udash)) # should be zero


# Now integrate over a semicircle.  Observe how it's better to split the
# path into two separate pieces.

R <- 400
u1     <- function(x){R*exp(pi*1i*x)}
u1dash <- function(x){R*pi*1i*exp(pi*1i*x)}
u2     <- function(x){R*(2*x-1)}
u2dash <- function(x){R*2}

f <- function(z){exp(1i*z)/(1+z^2)}

answer.approximate <-
    integrate.contour(f,u1,u1dash) +
    integrate.contour(f,u2,u2dash) 

answer.exact <- pi/exp(1)
abs(answer.approximate - answer.exact)

# Now try integrating over a triangle, with base on the real axis:
abs(integrate.segments(f,c(-R,R,1i*R))- answer.exact)

[Package elliptic version 1.0-1 Index]