Méthode de Monte Carlo et évaluation probabiliste du nombre pi

Aujourd’hui, je vais parler de la méthode de Monte Carlo. C’est une technique probabiliste qui utilise des procédés aléatoires.

Le moyen classique de déterminer le nombre pi est de prendre une ficelle avec laquelle on entoure la circonférence d’un cylindre ou d’une sphère dont la valeur est divisée par le diamètre.

Le hasard peut cependant donner une approche du nombre pi. Par exemple, je définis un repère orthonormé où le point origine 0 sera le centre d’un cercle de rayon R, et le rayon vaudra 1. Le cercle est lui-même inscrit dans un carré ayant un côté valant 2R.

Par conséquent, l’aire du disque vaut pi×R² et l’aire du carré vaut 4R².

sqcirc

Supposons ensuite qu’un point apparaisse au hasard tel que ses coordonnées x et y appartiennent à l’intervalle [-1;1], c’est-à-dire que le point reste rigoureusement dans les limites du carré. Le point généré aléatoirement apparaît soit dans le disque, soit dans la zone carrée extérieure au disque lui-même.

La probabilité pour que le point soit dans le cercle est de (4 – pi) / pi = 0,2732395, et la probabilité pour que le point soit extérieur au cercle est de 1 – (4 – pi)/pi = 0,72676.

Avec ces informations, il est possible de déterminer pi à partir des scores obtenus par la génération de points aléatoires.

Algorithme :

  • On génère aléatoirement des coordonnées x et y pour définir un point.
  • On calcule la distance entre ce point aléatoire et le point origine (0;0).
  • La distance OP = racine carrée de ((x – 0)² + (y – 0)²) = racine carrée de (x² + y²).
  • Si la distance est inférieure à R, alors le point appartient au disque.
  • Mais si la distance est supérieure à R, alors le point est extérieur au disque.
  • On comptabilise le nombre de points appartenant au disque et ceux extérieurs au disque.
  • À partir de ces nombres de points aléatoires, on détermine la valeur probabiliste de pi.

 

Voici le code source d’un script Perl que j’ai conçu :

#!/usr/bin/perl
$str = «  »;
for ($try = 1; $try <= 20; $try++)
{
$cercle = 0; $carre = 0;
 for ($n = 1; $n <= 1000000; $n++)
{
$x = rand(1) * (-1) ** int(1 + rand(2));
$y = rand(1) * (-1) ** int(1 + rand(2));
# Calcul de la distance entre le point généré avec x et y dans [-1;1] et l’origine de O;i;j

$segment = sqrt($x ** 2 + $y ** 2);

if ($segment <= 1)
{
$cercle++;
}
if ($segment > 1)
{
$carre++;
}

}  # end for

$quotient = $cercle / $carre;
$valeur = 4 * $quotient / ($quotient + 1);
print « Résultat de l’expérience de Monte Carlo : $valeur \n »;
$str = « $str $valeur »;
}
print « Série : $str \n »;
Pour résumer, une série de 20 valeurs du nombre pi où chaque valeur a nécessité la génération d’un million de points aléatoires a conduit au résultat suivant :

Résultat de l’expérience de Monte Carlo : 3.139772
Résultat de l’expérience de Monte Carlo : 3.140688
Résultat de l’expérience de Monte Carlo : 3.14104
Résultat de l’expérience de Monte Carlo : 3.141588
Résultat de l’expérience de Monte Carlo : 3.141472
Résultat de l’expérience de Monte Carlo : 3.140552
Résultat de l’expérience de Monte Carlo : 3.138912
Résultat de l’expérience de Monte Carlo : 3.142956
Résultat de l’expérience de Monte Carlo : 3.141696
Résultat de l’expérience de Monte Carlo : 3.14062
Résultat de l’expérience de Monte Carlo : 3.14042
Résultat de l’expérience de Monte Carlo : 3.141084
Résultat de l’expérience de Monte Carlo : 3.142708
Résultat de l’expérience de Monte Carlo : 3.142796
Résultat de l’expérience de Monte Carlo : 3.140104
Résultat de l’expérience de Monte Carlo : 3.141116
Résultat de l’expérience de Monte Carlo : 3.14304
Résultat de l’expérience de Monte Carlo : 3.143192
Résultat de l’expérience de Monte Carlo : 3.142144
Résultat de l’expérience de Monte Carlo : 3.144828
Série :  3.139772 3.140688 3.14104 3.141588 3.141472 3.140552 3.138912 3.142956 3.141696 3.14062 3.14042 3.141084 3.142708 3.142796 3.140104 3.141116 3.14304 3.143192 3.142144 3.144828

 

  • Statistiquement, le nombre pi vaut 3,142 plus ou moins 0,001408.
  • Et par conséquent, le nombre pi est compris dans l’intervalle [3,140592 ; 3,143408], ce qui est correct.

Les tests probabilistes sont intéressants lorsqu’il arrive que des équations ne peuvent pas être résolues, ou parce qu’on désire gagner du temps. Cette technique probabiliste peut aider à déterminer des surfaces et des volumes qui peuvent être très compliqués à résoudre par calcul direct. Dans la page wikipedia sur la méthode de Monte Carlo, on peut y lire que «le véritable développement des méthodes de Monte-Carlo s’est effectué sous l’impulsion de John von Neumann et Stanislas Ulam notamment, lors de la Seconde Guerre mondiale et des recherches sur la fabrication de la bombe atomique. Notamment, ils ont utilisé ces méthodes probabilistes pour résoudre des équations aux dérivées partielles».

 

 

© 2014 John Philip C. Manson

 

Publicités