Volume d’une sphère

On considère un nuage de points \((x, y)\) dans un plan 2D. Les variables \(x\) et \(y\) sont indépendantes et uniformément reparties entre -1 et 1.

  1. En utilisant la fonction np.random.rand, créer un nuage de \(M\) points et tracer ce nuage. On pourra prendre \(M=1000\)

  2. Tracer dans une autre couleur les points dans un cercle de rayon 1.

  3. En prenant \(M\) assez grand (par exemple \(10^8\)), calculer la probabilité d’être dans le cercle. En déduire une estimation de la surface d’un disque de rayon 1.

  4. Même question que la question 3, mais dans un espace de dimension \(N\). Par exemple \(N=5\). On écrira une fonction.


Solution

import numpy as np
import matplotlib.pyplot as plt

M = 1000
X, Y = 2*np.random.rand(M)-1, 2*np.random.rand(M)-1

fig = plt.figure()
ax = fig.subplots(1, 1)
ax.set_aspect(1)

ax.plot(X, Y, 'o')

mask = X**2 + Y**2<=1

ax.plot(X[mask], Y[mask], 'o')
[<matplotlib.lines.Line2D at 0x7f27539ec2b0>]
../_images/37e3c59d1197ae4b0bbed098bbf0ae4871b86c32cc1b2f31d2bb7573fdafed3d.png
M = 100000000
X, Y = 2*np.random.rand(M)-1, 2*np.random.rand(M)-1
# Il est aussi possible d'utiliser la fonction np.random.uniform(-1, 1, size=M)


mask = (X**2 + Y**2)<=1 # C'est un tableau de Booléens. 
vol = 2**2 * np.mean(mask) 
# Le volume est celui du carré (=2^2) 
# multiplié par la probabilité d'être dans le disque
# Lors des opération de somme (ou moyenne) d'un tableau de Booléens, 
# numpy va considérer que `False` vaut 0 et `True` 1.
print(f'Le volume est estimé à {vol:.5f}')
Le volume est estimé à 3.14139
def volume(M, N=2):
    P = 2*np.random.rand(M, N)-1
    Psquare = np.sum(P**2, axis=1)
    vol = 2**N * np.mean(Psquare<1)
    return vol

vol5 = volume(10000000, N=5)

print(f"Le volume d'une hyper-sphère de dimension 5 est estimé à {vol5:.5f}")
Le volume d'une hyper-sphère de dimension 5 est estimé à 5.26305