diff --git a/module2/exo1/module2/exo1/toy_document_en.Rmd b/module2/exo1/module2/exo1/toy_document_en.Rmd index d2d0fb1828d9be2ea212112ca237379b65b0c9c1..b7c1a551aa4245f193e9fc6ab830ae6702905496 100644 --- a/module2/exo1/module2/exo1/toy_document_en.Rmd +++ b/module2/exo1/module2/exo1/toy_document_en.Rmd @@ -1,43 +1,28 @@ -1 On the computation of π -1.1 Asking the maths library -My computer tells me that π is approximatively -In [1]: from math import * -print(pi) -3.141592653589793 -1.2 Buffon’s needle -Applying the method of Buffon’s needle, we get the approximation -In [2]: import numpy as np -np.random.seed(seed=42) -N = 10000 -x = np.random.uniform(size=N, low=0, high=1) -theta = np.random.uniform(size=N, low=0, high=pi/2) -2/(sum((x+np.sin(theta))>1)/N) -Out[2]: 3.1289111389236548 +# On the computation of π +# Nicholas +# October 21, 2025 -1.3 Using a surface fraction argument -A method that is easier to understand and does not make use of the sin function is based on the -fact that if X ∼ U(0, 1) and Y ∼ U(0, 1), then P[X -2 + Y -2 ≤ 1] = π/4 (see "Monte Carlo method" -on Wikipedia). The following code uses this approach: -In [3]: %matplotlib inline -import matplotlib.pyplot as plt -np.random.seed(seed=42) +# Asking the math library +pi +## [1] 3.141593 + +# Buffon’s needle +set.seed(42) +N = 100000 +x = runif(N) +theta = pi/2 * runif(N) +2 / (mean(x + sin(theta) > 1)) +## [1] 3.14327 + +# Using an area fraction argument +set.seed(42) N = 1000 -x = np.random.uniform(size=N, low=0, high=1) -y = np.random.uniform(size=N, low=0, high=1) -accept = (x*x+y*y) <= 1 -reject = np.logical_not(accept) -fig, ax = plt.subplots(1) -ax.scatter(x[accept], y[accept], c='b', alpha=0.2, edgecolor=None) -ax.scatter(x[reject], y[reject], c='r', alpha=0.2, edgecolor=None) -ax.set_aspect('equal') +df = data.frame(X = runif(N), Y = runif(N)) +df$Accept = (df$X**2 + df$Y**2 <= 1) + +library(ggplot2) +ggplot(df, aes(x = X, y = Y, color = Accept)) + + geom_point(alpha = .2) + coord_fixed() + theme_bw() -It is then straightforward to obtain a (not really good) approximation to π by counting how -many times, on average, X -2 + Y -2 -is smaller than 1: -In [4]: 4*np.mean(accept) -Out[4]: 3.1120000000000001 -{r}## [1] 3.156 \ No newline at end of file +4 * mean(df$Accept) +## [1] 3.156