Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

DÉTERMINATION APPROXIMATIVE DE PI À L'AIDE DE LA MÉTHODE DE MONTE CARLO


Information sur la source

Description

Cliquez pour voir la capture en taille normale
J'ai donné une explication du code en commentaire dans l'entête du programme
 

Source

  • # -*- 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()
# -*- 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()

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de aera group le 08/02/2007 09:05:06

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

signaler à un administrateur
Commentaire de Shakan972 le 09/02/2007 15:02:34

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. :)

signaler à un administrateur
Commentaire de aera group le 09/02/2007 17:30:42

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

signaler à un administrateur
Commentaire de Shakan972 le 09/02/2007 19:31:50

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. :)

signaler à un administrateur
Commentaire de vychnou le 15/02/2007 10:26:10

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!

signaler à un administrateur
Commentaire de xeolin le 14/04/2007 01:42:13

Bravo !

j'aime beaucoup les sources comme celle-ci, les algorithmes, même si le résultat est très aproximatif, la technique est très interessante ! 10/10

bravo !

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Tuto Swinnen : mouvement aléatoire ? [ par nemo43 ] Bonjour à tous,J'étudie le langage python - c'est un loisir - avec le livre de Gérard Swinnen (comme beaucoup de francophones je pense ). Je bloque su


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,562 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.