title: "On the computation of pi" auteur : Meiling WU output: html_notebook #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+PROPERTY: header-args :session :exports both * En demandant à la lib maths Mon ordinateur m'indique que π vaut /approximativement: #+begin_src python :results output :exports both from math import * print(pi) #+end_src #+RESULTS: : 3.141592653589793 * En utilisant la méthode des aiguilles de Buffon Mais calculé avec la *méthode des aiguilles de Buffon, on obtiendrait comme *approximation : #+begin_src python :results output :exports both 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=np.pi/2) print(2/(sum((x+np.sin(theta))>1)/N)) #+end_src #+RESULTS: : 3.128911138923655 * Avec un argument "fréquentiel" de surface Sinon, une méthode plus simple à comprendre et ne faisant pas intervenir d'appel à la fonction sinus se base sur le fait que si $X\sim U(0,1)$, alors $P[X^2+Y^2\leq 1] = \pi/4$ (voir [[https://en.wikipedia.org/wiki/Monte_Carlo_method]["Monte Carlo method" on Wikipedia]]). Le code suivant illustre ce fait : #+begin_src python :results output :exports both import matplotlib.pyplot as plt import numpy as np matplot_lib_filename = "fig.png" np.random.seed(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') plt.savefig(matplot_lib_filename) print("./fig.png") #+end_src #+RESULTS: : ./fig.png