# **1 À propos du calcul de π**
## **1.1 En demandant à la lib maths**
Mon ordinateur m’indique que π vaut _approximativement_

\textcolor{blue}{ln[1]}: \textcolor{green}{from} \textcolor{blue}{math} \textcolor{green}{import *}
    \textcolor{green}{print} (pi)

3.141592653589793

## **1.2 En utilisant la **méthode** des aiguilles de Buffon**

Mais calculé avec la **méthode** des ...[\textcolor{blue}{aiguilles de Buffon}](https://fr.wikipedia.org/wiki/Aiguille_de_Buffon)..., on obtiendrait comme **approximation** :

\textcolor{blue}{In [2]}: \textcolor{green}{import} \textcolor{blue}{numpy} \textcolor{green}{as} \textcolor{blue}{np}
    np.random.seed(seed\textcolor{grey}{=42})
    N = \textcolor{grey}{10000}
    x\textcolor{grey}{=} np.random.uniform(size\textcolor{grey}{=}N, low\textcolor{grey}{=0}, high\textcolor{grey}{=1})
    theta \textcolor{grey}{=} np.random.uniform(size\textcolor{grey}{=}N, low\textcolor{grey}{=0}, high\textcolor{grey}{=0}pi\textcolor{grey}{/2})
    \textcolor{grey}{2/}(\textcolor{green}{sum}((x\textcolor{grey}{+}np\textcolor{grey}{.}sin(theta))\textcolor{grey}{>1})\textcolor{grey}{/}N)
    
    \textcolor{red}{Out[2]:} 3.1289111389236548
    
##**1.3 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 ∼ U(0, 1) et Y ∼ U(0, 1) alors P[X2 + Y2 ≤ 1] = π/4 (voir
... [\textcolor{blue}{méthode de Monte Carlo sur Wikipedia}](https://fr.wikipedia.org/wiki/M%C3%A9thode_de_Monte-Carlo#D%C3%A9termination_de_la_valeur_de_%CF%80) .... Le code suivant illustre ce fait :

\textcolor{blue}{ln [3]}\textcolor{grey}{:}\textcolor{green}{%matplotlib} inline
    \textcolor{green}{impor} \textcolor{blue}{matplotlib.pyplot} \textcolor{green}{as} \textcolor{blue}{plt}
    
    np.random.seed(seed\textcolor{grey}{=42})
    N \textcolor{grey}{= 1000}
    x \textcolor{grey}{=} np.random.uniform(size\textcolor{grey}{=}N, low\textcolor{grey}{=0}, high\textcolor{grey}{=1})
    y \textcolor{grey}{=} np.random.uniform(size\textcolor{grey}{=}N, low\textcolor{grey}{=0}, high\textcolor{grey}{=1})
    accept \textcolor{grey}{=} (x\textcolor{grey}{*}x\textcolor{grey}{+}y\textcolor{grey}{*}y) \textcolor{grey}{<= 1}
    reject \textcolor{grey}{=} np.logical_not(accept)
    
    fig, ax \textcolor{grey}{=} plt.subplots(\textcolor{grey}{1})
    ax.scatter(x[accept], y[accept], c\textcolor{grey}{=}'b', alpha\textcolor{grey}{=0.2}, edgecolor\textcolor{grey}{=}\textcolor{green}{None=})
    ax.scatter(x[reject], y[reject], c\textcolor{grey}{=}'r', alpha\textcolor{grey}{=0.2}, edgecolor\textcolor{grey}{=}\textcolor{green}{None=})
    ax.set_aspect(\textcolor{red}{'equal'})
    
    
    Il est alors aisé d’obtenir une approximation (pas terrible) de π en comptant combien de fois,
en moyenne, X2 + Y2 est inférieur à 1 :

\textcolor{blue}{ln [4]:} \textcolor{grey}{4*}np.mean(accept)

\textcolor{red}{Out[4]:} 3.1120000000000001
