π et la méthode de Monte-Carlo Résumé La méthode de Monte-Carlo consiste à calculer certaines valeurs, ici le nombre π, à l’aide de tirages au hasard. Ce document présente la méthode appliquée à π, ainsi que le code source python permettant de calculer une estimation de π et de tracer le graphique correspondant. La méthode de Monte-Carlo appliquée à π Prenons un cercle inscrit dans un carré de côté 2r. La surface du cercle est πr2, celle du carré est 4r2. 𝑆𝑢𝑟𝑓𝑎𝑐𝑒 D’où, 𝜋 = 4 𝑆𝑢𝑟𝑓𝑎𝑐𝑒𝑐𝑒𝑟𝑐𝑙𝑒. 𝑐𝑎𝑟𝑟é Tirons deux nombres x et y au hasard entre -1 et +1 et vérifions1 si le point (x, y) est ou non à l’intérieur du cercle. Répétons l’opération un grand nombre de fois. 𝜋 = 4 lim 𝑛→∞ 𝑛𝑜𝑚𝑏𝑟𝑒 𝑑𝑒 𝑝𝑜𝑖𝑛𝑡𝑠 𝑑𝑎𝑛𝑠 𝑙𝑒 𝑐𝑒𝑟𝑐𝑙𝑒 . 𝑛𝑜𝑚𝑏𝑟𝑒 𝑡𝑜𝑡𝑎𝑙 𝑑𝑒 𝑝𝑜𝑖𝑛𝑡𝑠 Cette méthode est en réalité très peu efficace. Le nombre de décimales exactes obtenu n’augmente pas forcément avec le nombre de tirages. Nb de tirages Estimation de 𝜋 10 3,6 100 3,2 1 000 3,164 10 000 3,154 100 000 3,14136 1 Pour un cercle de rayon r centré sur (0, 0), si la puissance du point par rapport au cercle P = x2 + y2 – r2 est positive, le point est à l’extérieur du cercle. Page 1/2 Code python ''' Méthode de Monte-Carlo appliquée au calcul de pi ''' from math import pi, sin, cos import random as rd from matplotlib import pyplot as plt, mathtext from decimal import Decimal as D, getcontext() #garantit la répétabilité des tirages rd.seed(4224821) #fonction lambda pour calcul de la puissance du point / cercle puiss = lambda x, y, r : x*x + y*y - r*r #trace le cercle de rayon 2 x0 = list() y0 = list() pas = 2 * pi / 400 delta = 0. for k in range(401): x0.append(2*cos(delta)) y0.append(2*sin(delta)) delta += pas plt.scatter(0., 0., c='k', marker="o", linewidths=2) plt.plot(x0, y0, color="k", lw=2) #demande le nombre de points à traiter : nb nb = 0 while nb <= 0: txt = input("Saisir le nombre d'itérations : ") if txt.isdigit(): nb = int(txt) else: nb = 0 #on tire nb points au hasard et on calcule combien sont à l'intérieur #les points à l’intérieur sont rouges, les points à l'extérieur sont bleus nb_inside = 0 pimc = 0. for i in range(nb + 1): x = D(rd.uniform(-2., 2.)) y = D(rd.uniform(-2., 2.)) if puiss(x, y, 2) < 0: #puissance négative : point à l’intérieur nb_inside += 1 color = "r" else: color = "b" plt.scatter(x, y, c=color, marker="o", linewidths=2) #calcul de la valeur approchée de pi #le rapport nb_inside / nb est approximativement égal à pi/4 pimc = D(4 * nb_inside) / D(nb) #valeur approchée de pi print(f'Valeur approchée de pi : {pimc}') plt.axis('scaled') plt.title('Méthode de Monte-Carlo', pad=15.) plt.gca().xaxis.set_ticks(range(-2, 3)) plt.gca().yaxis.set_ticks(range(-2, 3)) plt.xlim(-2., 2.) plt.ylim(-2., 2.) plt.figtext(0.22,0.01, str(nb) + " points : " + r'$\pi \approx $' + str(pimc), color="k", size="large") plt.show() ### fin du programme ### Page 2/2