Détermination approximative de pi à l'aide de la méthode de monte carlo

Soyez le premier à donner votre avis sur cette source.

Vue 8 624 fois - Téléchargée 347 fois

Description

J'ai donné une explication du code en commentaire dans l'entête du programme

Source / Exemple :


# -*- coding: cp1252 -*-

##################################
#                                #
#   Programme : Monte Carlo.py   #
#   Crée par : Shakan972         #
#   Date de création : 7/02/07   #
#                                #
##################################

###################################################################################
#
#   Ce programme permet à l'aide de la méthode de Monte Carlo
#   de déterminer de manière approximative pi
#   Pour cela on trace un carré dans lequel figure un arc de cercle
#   Puis l'on génère une série de points de coordonnées (x,y) dans ce carré
#   Et à chaque fois le programme détermine si les points sont dans ou hors
#   de l'arc de cercle à l'aide du calcul se réferrant à cette méthode puis enfin
#   on fait le rapport du nombre de points dans le cercle (multiplié par 4)
#   avec le nombre de points total ce qui au final permet la détermination
#   approximative de pi.
#
###################################################################################

#Importation des bibliothèques

from Tkinter import *
from random import *

#Fonction permettant d'effectuer une pause

def stop():
    global flag
    flag=0
    
#Fonction permettant de démarrer le programme ou bien de le reprendre si il a été stoppé

def demarrer():
    global flag
    if flag==0:
        flag=1
        generateur_nbre_aleat()

#Cette fonction permet de différencier les points étant soit dans l'arc de cercle ou bien hors de l'arc de cercle
#La couleur du point tracé varie donc en fonction de la position du point dans le carré 

def points_aleat(x,y):
    global pts_dans_cercle
    if (x-100)**2+(y-100)**2<90000:
        pts_dans_cercle=pts_dans_cercle+1
        can1.create_oval(x-2,y-2,x,y,fill='green')
    else:
        can1.create_oval(x-2,y-2,x,y,fill='red')

#Cette fonction permet le tirage de points de coordonnées aléatoires dans le cercle 

def generateur_nbre_aleat():
    global x,y,pts_dans_cercle,pts_total,pi,flag
    x=randint(100,400)
    y=randint(100,400)
    points_aleat(x,y)
    pts_total+=1
    pi=float((pts_dans_cercle*4.)/(pts_total))
    result.configure(text = "Estimation de pi = "+str(pi))
    pts_cercle.configure(text= "Nombre de points dans le cercle = "+str(pts_dans_cercle))
    pts_tot.configure(text="Nombre de point total déjà placés = "+str(pts_total))
    if flag<>0:
        fen1.after(1,generateur_nbre_aleat)

#Programme principal
    
x=0
y=0
pts_dans_cercle=0
pts_total=0
pi=0
flag=0
    
fen1=Tk()
fen1.title("Détermination approximative de pi à l'aide de la méthode de Monte Carlo")
can1=Canvas(fen1,width=500,height=500)

can1.grid(row=0,column=0,columnspan=2)

#Création du carré et de l'arc de cercle figurant dans ce dernier

carre=can1.create_rectangle(100,100,400,400,width=1)

fra1=Frame(fen1)
fra1.grid(row=0,column=3,columnspan=2)

Button(fra1,text="Démarrer",command=demarrer).grid(row=1,column=0,pady=5)
Button(fra1,text="Arrêter",command=stop).grid(row=2,column=0,pady=5)
Button(fra1,text="Quitter",command=fen1.destroy).grid(row=3,column=0,pady=5)
result=Label(fen1)
result.grid(row=1,column=0,sticky=E)
pts_cercle=Label(fen1)
pts_cercle.grid(row=2,column=0,sticky=E)
pts_tot=Label(fen1)
pts_tot.grid(row=3,column=0,sticky=E)

fen1.mainloop()

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

aera group
Messages postés
390
Date d'inscription
mercredi 23 août 2006
Statut
Membre
Dernière intervention
8 novembre 2010
8 -
Le programme est interressant et assez bien constuit ! Mais tu pourrait améliorer ton interface graphique en ajoutant par exemple une barre de menu et en créant une fenêtre dans laquelle tu pourrait mettre l'explication du principe etc ... Tu devrais également essayer de tracer l'arc de cercle !
Je te met 8/10 !

___________
Aéra group
Shakan972
Messages postés
44
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
17 avril 2015
-
Je prend note de ta critique et tâcherai d'apporter les modifications nécessaires le plus rapidement possible ^^
En tout cas merçi pour ta note et bon coding. :)
aera group
Messages postés
390
Date d'inscription
mercredi 23 août 2006
Statut
Membre
Dernière intervention
8 novembre 2010
8 -
En tout cas, la valeur de pi est très aproximative : statistiquement, plus on place de point plus on devrais se raprocher de la valeur réel de pi. Or après avoir placer 103188 points, ton programme estime pi à 3.12935612668 (on est encore loing des 3.14159265359). Néamoins, je trouve la méthode de calcule assez interressante !!!

Bonne continuation

___________
Aéra group
Shakan972
Messages postés
44
Date d'inscription
samedi 21 mai 2005
Statut
Membre
Dernière intervention
17 avril 2015
-
Pour tout te dire il est clair que je ne témoignerai pas en faveur de cette méthode de calcul de pi étant donné l'existence de méthode plus efficace et moins tordu ( je parle là d'une remarque que l'on m'a faite concernant la source que j'ai réalisé en C ^^) mais j'avais besoin de voir la méthode à l'oeuvre visuellement parlant j'ai donc fait ce petit programme très rigolo et tout de même révélateur de la fonction de calcul de pi de cette technique probabiliste qu'est la méthode de Monte Carlo.

Donc je pense m'être bien expliqué et j'espère réaliser de meilleurs programmes mathématiques celui n'étant qu'une simple surprise parmis les incroyables possibilités qui existent dans cette étrange monde que sont les mathématiques. :)
cs_vychnou
Messages postés
124
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
11 mai 2009
11 -
Très intéressant, voir une méthode probabiliste à l'oeuvre :)
Tu pourrais renommer ton fichier en .pyw vu que la console ne sert à rien ici.
Bravo!

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.