Déterminer pi par le biais de la méthode de monte carlo ( langage c )

0/5 (14 avis)

Vue 17 397 fois - Téléchargée 440 fois

Description

Les explications concernant le code figure en commentaire dans le programme

Source / Exemple :


/********************************************************************************/
/*
/*  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 de bibliothèques */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/* Cette fonction va permettre de générer des nombres aléatoires */

int my_rand (void)
{
   static int first = 0;
   
   if (first == 0)
   {
      srand (time (NULL));
      first = 1;
   }
   return (rand ());
}

/* Programme principal */

int main()
{
    printf("              ****************************\n");
    printf("              *                          *\n");
    printf("              * Programme de Monte Carlo *\n");
    printf("              *    Cree par Shakan972    *\n");
    printf("              *       Le 08/02/07        *\n");
    printf("              *                          *\n");
    printf("              ****************************\n\n");
    
    float x, y, pi;
    float n, i, pts_dans_cercle, pts_tot, t;
    i=0;
    pts_dans_cercle=0;
    pts_tot=0;
    printf("Veuillez saisir le nombre d'iterations a realiser : ");
    scanf("%f",&n);
    printf("\n");
    while (i<=n)
    {
          my_rand();
          x=rand()/(RAND_MAX+1.0); /* Génération de points de coordonnées aléatoires compris dans l'intervalle [0,1] */
          x=x*x;
          my_rand();
          y=rand()/(RAND_MAX+1.0);
          y=y*y;
          if (x+y<1)
          {
                    pts_dans_cercle=pts_dans_cercle+1;
          }
          pts_tot=pts_tot+1;
          i=i+1;
          printf("Estimation de pi = %4f\n",(4*pts_dans_cercle)/(pts_tot));      
    }
    printf("\n");
    printf("Estimation de pi termine !!\n\n");
    system("PAUSE");
    return 0;
}

Conclusion :


Ce programme qui traite de la méthode de Monte Carlo existe également dans une version python mais vu que ce genre de programme n'avait pas été traité je me suis permis d'opérer la conversion afin de faire profiter les programmeurs utilisant le langage C.

Etant donné que c'est l'un de mes premiers programmes en C pour débutant que je présente je compte sur votre clémence ^^

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Taron31 Messages postés 199 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 28 février 2008
11 mars 2007 à 13:25
salut, je sais bien que l'algo en lui-même est bidon, mais je l'ai trouvé original, car il utilisait les probas, ce qui m'intéressait, j'ai donc voulu essayer d'optimiser un peu ce calcul, même si c'est assez inutil puisque d'autres algo plus performant existent...

sinon les \a c'était pour me prévenir lorsque le calcul était terminé ;)

++
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
10 mars 2007 à 22:42
Voila pour moi un exemple d'utilisation plutot inutile de l'assembleur:
L'algorithme est nul (8 secondes pour obtenir 3.14169955, soit 3 décimales correctes) donc c'est dommage de s'attarder à l'optimiser, on obtiendra une version beaucoup plus rapide en codant un meilleur algo dans un langage interprété.
Sinon, tes \a c'est plutot désagréable
Taron31 Messages postés 199 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 28 février 2008
10 mars 2007 à 22:30
ssalut j'ai réimplenté ton prog en utilisant le FPU avec le asm inline : http://touronster.blogspot.com/2007/03/dtermination-de-pi-avec-fpu-fun.html
cs_ptidiable Messages postés 16 Date d'inscription dimanche 17 avril 2005 Statut Membre Dernière intervention 21 mars 2007
18 févr. 2007 à 13:30
bah moi jtrouve sa vraiment interesant :-)

Si ont laisse tourner le programme assez lontent on arrive a une aproximation plutôt bonne

je vais laisser tourner toutes la nuit, je verais jusqu'où on arrive a trouver une resultat correct

Bravos a toi ;)
Maegis Messages postés 101 Date d'inscription vendredi 15 février 2002 Statut Membre Dernière intervention 6 août 2007
12 févr. 2007 à 15:47
Bien sur que la méthodé proposée ici n'est pas celle qui converge le plus rapidement possible ni la plus précise. (Je ne pense pas que ce soit le but non plus, dit moi si je me trompe Shakan972)

Mais elle est interressante cependant car elle vient d'une approche statistique. Tout repose cependant sur la fonction de génération de nombre aléatoires pour juger de la qualitée de l'approximation.

De toute façons avec les programmes basés sur la formule de Plouffe (qui permet de calculer les décimales de PI de manière indépendante) et utilisant moult "astuces" mathématiques qui tournent sur des supers calculateurs on ne peut peut-être pas rivaliser mais au moins montrer d'autres approches
Afficher les 14 commentaires

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.