\documentclass[12pt]{article} \SweaveOpts{echo=T,pdf=T,eps=F,eval=T,keep.source=T} \usepackage{Sweave} \usepackage{mathpazo} \usepackage{hyperref,url} \usepackage[a4paper,margin=1.5cm]{geometry} \begin{document} \title{Example Sweave document: estimating $\pi$} \author{Stephen J Eglen} \date{\today} \maketitle \section{Introduction} This is an example document created using the Sweave system (\url{http://www.statistik.lmu.de/~leisch/Sweave/}). Sweave is a tool for combining both \LaTeX\ documentation and R code within the same file. For this document, the master file is \url{estimate.Rnw}. This is processed by the Sweave system in R, which runs the R code to generate textual/graphical output, and also creates a \LaTeX\ document. The \LaTeX\ document is then typeset to create the pdf document. On unix/macintosh, the following commands should recreate the pdf file: \begin{verbatim} $ R CMD Sweave estimate.Rnw $ pdflatex estimate.tex \end{verbatim} \section{Task: estimate the value of $\pi$} Our task is to estimate the value of $\pi$ by simulating darts being thrown at a dartboard. Imagine that the person throwing the darts is not very good, and randomly throws each dart so that it falls uniformly within a square of side length $2r$, with the dartboard of radius $r$ centred within that square. If the player throws $n$ darts, and $d$ of them hit the dartboard, then for large enough $n$, the ratio $d/n$ should approximate the ratio of the area of the dartboard to the enclosing square, $ \pi r^2 / 4 r^2 \equiv \pi/4$. From this, we can estimate $\pi \approx 4d/n$. We start with an example, using R to draw both the dartboard and the surrounding square, together with $n=50$ darts. The radius of the dartboard here is 1 unit, although the value is not important. \setkeys{Gin}{width=0.6\textwidth} \begin{center} <>= r <- 1 n <- 50 par(las=1) plot(NA, xlim=c(-r,r), ylim=c(-r,r), asp=1, bty='n', xaxt='n', yaxt='n', xlab='', ylab='') axis(1, at=c(-r,0,r)); axis(2, at=c(-r,0,r)) symbols(x=0, y=0, circles=r, inch=F, add=T) x <- runif(n, -r, r); y <- runif(n, -r, r) inside <- x^2 + y^2 < r^2 d <- length(which(inside)) points(x, y, pch=ifelse(inside, 19, 4)) rect(-r, -r, r, r, border='blue', lwd=2) @ \end{center} A dart is drawn as a filled circle if it falls within the dartboard, else it is drawn as a cross. In this case the number of darts within the circle is \Sexpr{d}, and so the estimated value is $\pi \approx \Sexpr{4*d/n}$. The estimate of $\pi$ should improve as we increase the number of darts thrown at the dartboard. To verify this, we write a short function that, given the number of darts to throw, $n$, returns an estimate of $\pi$. <<>>= estimate.pi <- function(n=1000) { ## Return an estimate of PI using dartboard method ## with N trials. r <- 1 # radius of dartboard x <- runif(n, min=-r, max=r) y <- runif(n, min=-r, max=r) l <- sqrt(x^2 + y^2) d <- length(which(l>= replicate(9, estimate.pi()) @ Finally, for a given value of $n$, we can show 99 estimates of $\pi$, as clearly the estimate will vary from run to run. In the following plot, we compare the estimates of $\pi$ for three different values of $n$: \begin{center} <>= ns <- 10^c(2,3,4) res <- lapply(ns, function(n) replicate(99, estimate.pi(n))) par(las=1, bty='n') stripchart(res, method="jitter", group.names=ns, xlab="number of darts", ylab=expression(paste('estimate of ', pi)), vert=T, pch=20, cex=0.5) abline(h=pi, col='red') @ \end{center} As the number of darts increases, the estimate of $\pi$ gradually converges onto the actual value of $\pi$ (shown by the solid red line). \end{document}