% -*- mode: noweb; noweb-default-code-mode: R-mode; -*- \documentclass[nojss]{jss} \usepackage{dsfont} \usepackage{bbm} \usepackage{amsfonts} \usepackage{amsmath} \usepackage{amssymb} \usepackage{wasysym} \usepackage{wrapfig} \usepackage{tikz} \usetikzlibrary{calc,decorations.markings} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% declarations for jss.cls %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% just as usual \author{Robin K. S. Hankin} \title{The residue theorem from a numerical perspective} %\VignetteIndexEntry{The residue theorem from a numerical perspective} %% for pretty printing and a nice hypersummary also set: %% \Plainauthor{Achim Zeileis, Second Author} %% comma-separated \Plaintitle{The residue theorem from a numerical perspective} %% for pretty printing and a nice hypersummary also set: \Plainauthor{Robin K. S. Hankin} %% an abstract and keywords \Abstract{Here I use the {\tt myintegrate()} function of the \pkg{elliptic} package to illustrate three classical theorems from analysis: Cauchy's integral theorem, the residue theorem, and Cauchy's integral formula.} \Keywords{Residue theorem, Cauchy formula, Cauchy's integral formula, contour integration, complex integration, Cauchy's theorem} \Keywords{Elliptic functions, residue theorem, numerical integration, \proglang{R}} \Plainkeywords{Elliptic functions, residue theorem, numerical integration, R} %% publication information %% NOTE: This needs to filled out ONLY IF THE PAPER WAS ACCEPTED. %% If it was not (yet) accepted, leave them commented. % \Volume{VOL} % \Issue{ISS} % \Month{MONTH} % \Year{YEAR} % \Submitdate{yyyy-mm-dd} % \Acceptdate{yyyy-mm-dd} % \Repository{https://doi.org/10.9999/nonexistent-article} %% The address of (at least) one author should be given %% in the following format: \Address{ Robin K. S. Hankin\\%\orcid{https://orcid.org/0000-0001-5982-0415}\\ University of Stirling\\ Scotland\\ E-mail: \email{hankin.robin@gmail.com} } %% It is also possible to add a telephone and fax number %% before the e-mail in the following format: %% Telephone: +43/1/31336-5053 %% Fax: +43/1/31336-734 %% for those who use Sweave please include the following line (with % symbols): %% need no \usepackage{Sweave.sty} %% end of declarations %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} <>= require(elliptic,quietly=TRUE) @ \setlength{\intextsep}{0pt} \begin{wrapfigure}{r}{0.2\textwidth} \begin{center} \includegraphics[width=1in]{\Sexpr{system.file("help/figures/elliptic.png",package="elliptic")}} \end{center} \end{wrapfigure} \section{Introduction} Cauchy's integral theorem and its corollaries are some of the most startling and fruitful ideas in the whole of mathematics. They place powerful constraints on analytical functions; and show that a function's local behaviour dictates its global properties. Cauchy's integral theorem may be used to prove the residue theorem and Cauchy's integral formula; these three theorems form a powerful and cohesive suite of results. In this short document I use numerical methods to illustrate and highlight some of their consequences for complex analysis. \subsection{Cauchy's integral theorem}. Augustin-Louis Cauchy proved an early version of the integral theorem in 1814; it required that the function's derivative was continuous. This assumption was removed in 1900 by \'Edouard Goursat at the expense of a more difficult proof; the result is sometimes known as the Cauchy-Goursat theorem and is now a cornerstone of complex analysis. Formally, in modern notation, we have: \noindent {\bf Cauchy's integral theorem}. If $f(z)$ is holomorphic in a simply connected domain $\Omega\subset\mathbb{C}$, then for any closed contour $C$ in $\Omega$, $$\int_{C}f(z)\,dz=0.$$ \\ To demonstrate this theorem numerically, I will use the integration suite of functions provided with the \pkg{elliptic} package which perform complex integration of a function along a path specified either as a sequence of segments [{\tt integrate.segments()}] or a curve [{\tt integrate.contour()}]. Let us consider $f(z)=\exp z$, holomorphic over all of $\mathbb{C}$, and evaluate $$\oint_C f(z)\,dz$$ where $C$ is the square $0\longrightarrow 1\longrightarrow 1+i\longrightarrow i\longrightarrow 0$ (figure~\ref{square}). Numerically: \begin{figure}\centering \begin{tikzpicture} % Axes \draw [help lines,->] (-1, 0) -- (2, 0); \draw [help lines,->] ( 0, -1) -- (0, 2); % Red path \begin{scope}[very thick,decoration={ markings, mark=at position 0.5 with {\arrow{>}}} ] \draw[red,postaction={decorate}] (0,0)--(1,0) node[black, midway, below]{\tiny A}; \draw[red,postaction={decorate}] (1,0)--(1,1) node[black, midway, right]{\tiny B}; \draw[red,postaction={decorate}] (1,1)--(0,1) node[black, midway, above]{\tiny C}; \draw[red,postaction={decorate}] (0,1)--(0,0) node[black, midway, left]{\tiny D}; \end{scope} % The labels \node at ( 1.70, -0.2){$x$ }; \node at (-0.24, 1.7){$iy$}; \end{tikzpicture} \caption{A square contour integral \label{square} on the complex plane} \end{figure} <<>>= integrate.segments(exp, c(0, 1, 1+1i, 1i), close=TRUE) @ Above we see that the result is zero (to within numerical precision), in agreement with the integral theorem. It is interesting to consider each leg separately. We have $$ A=e-1\qquad B=e(e^i-1)\qquad C=-e^i(e-1)\qquad D=-(e^i-1) $$ And taking B as an example: <<>>= analytic <- exp(1)*(exp(1i)-1) numeric <- integrate.segments(exp, c(1, 1+1i), close=FALSE) c(analytic=analytic, numeric=numeric, difference=analytic-numeric) @ showing agreement to within numerical precision. \subsection{The residue theorem} {\bf residue theorem}. Given $U$, a simply connected open subset of $\mathbb{C}$, and a finite list of points $a_1,\ldots,a_n$. Suppose $f(z)$ is holomorphic on $U_0=U\setminus\left\lbrace a_1,\ldots a_n\right\rbrace$ and $\gamma$ is a closed rectifiable curve in $U_0$. Then $$\oint_\gamma f(z)\,dz = 2\pi i\sum_{k=1}^n \operatorname{I}(\gamma,a_k)\cdot\operatorname{Res}(f,a_k)$$ where $\operatorname{I}(\gamma,a_k)$ is the winding number of $\gamma$ about $a_k$ and $\operatorname{Res}(f,a_k)$ is the residue of $f$ at $a_k$. \\ The canonical, and simplest, application of this is to derive the log function by integrating $f(z)=1/z$ along the unit circle, as per figure \ref{circular}. Here the residue at the origin is 1, so the integral round the unit circle is, analytically, $2\pi i$. Numerically: <<>>= u <- function(x){exp(pi*2i*x)} udash <- function(x){pi*2i * exp(pi*2i*x)} analytic <- pi*2i numeric <- integrate.contour(function(z){1/z}, u, udash) c(analytic=analytic, numeric=numeric, difference=analytic-numeric) @ \begin{figure}\centering \begin{tikzpicture} % Axes \draw [help lines,->] (-2, 0) -- (2, 0); \draw [help lines,->] ( 0, -2) -- (0, 2); % Red path \draw [ decoration = {markings, mark = at position 0 with {\arrow{>}}}, postaction = {decorate}, very thick, red] (0,0) circle (1cm); % The labels \node at ( 1.70, -0.2){$x$ }; \node at (-0.24, 1.7){$iy$}; \end{tikzpicture} \caption{A circular contour integral \label{circular} on the complex plane} \end{figure} again we see very close agreement. \subsection{Cauchy's integral formula} {\bf Cauchy's integral formula}. If $f(z)$ is analytic within and on a simple closed curve $C$ (assumed to be oriented anticlockwise) inside a simply-connected domain, and if $z_0$ is any point inside $C$, then $$f(z_0)=\frac{1}{2\pi i}\int_C\frac{f(z)\,dz}{z-z_0}.$$ We may use this to evaluate the Gauss hypergeometric function at a critical point. The Gauss hypergeometric function ${}_2F_1(a,b;c;z)$ is defined as $$1+\frac{ab}{c}\frac{z}{1!} + \frac{a(a+1)b(b+1)}{c(c+1)}\frac{z^2}{2!}+\cdots$$ Now, this series has a radius of convergence of 1~\citep{abramowitz1965}; but the function is defined over the whole complex plane by analytic continuation~\citep{buhring1987}. The \pkg{hypergeo} package~\citep{hankin2015} evaluates ${}_2F_1(a,b;c;z)$ for different values of $z$ by applying a sequence of transformations to reduce $\left|z\right|$ to its minimum value; however, this process is ineffective for $z=\frac{1}{2}\pm i\sqrt{3}/2$, these points transforming to themselves. Numerically: <>= library("hypergeo") z0 <- 1/2 + sqrt(3)/2i f <- function(z){hypergeo_powerseries(1/2, 1/3, 1/5, z)} f(z0) @ Above we see {\tt NA}, signifying failure to converge. However, the residue theorem may be used to evaluate ${}_2F_1$ at this point: <<>>= r <- 0.1 # radius of contour u <- function(x){z0 + r*exp(pi * 2i * x)} udash <- function(x){r * pi * (0+2i) * exp(pi * 2i * x)} (val_residue <- integrate.contour(function(z){f(z) / (z-z0)}, u, udash) / (pi*2i)) @ We can compare this value with that obtained by a more sophisticated [and computationally expensive] method, that of Gosper~\citep{hankin2015}: <<>>= (val_gosper <- hypergeo_gosper(1/2, 1/3, 1/5, z0)) abs(val_gosper - val_residue) @ Above we see reasonable numerical agreement. \section{Conclusions} \bibliography{elliptic} \end{document}