Page 2/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 ###