DÉTERMINER PI PAR LE BIAIS DE LA MÉTHODE DE MONTE CARLO ( LANGAGE C )

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 9 févr. 2007 à 12:24
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
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/41420-determiner-pi-par-le-biais-de-la-methode-de-monte-carlo-langage-c

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 14
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
ncoder Messages postés 244 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 6 avril 2008 1
10 févr. 2007 à 11:52
La méthode que Shakan972 donne peut etre utile pour tester des fonctions qui renvoient des nombres aléatoires : plus on se rapproche de PI en un nombre petit d'itérations, plus la fonction donne effectivement des nombres aléatoires (le plus possible).

Non ?

Et y a-t-il d'autres manières pour le vérifier ?

Merci
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
9 févr. 2007 à 20:04
bonsoir

c'est des maths niveau terminale

sur wikipedia il est dit:
Pi peut etre calculé par la formule
Pi/4 = 4arctan(1/5) - arctan(1/239)

ce qui est facilement vérifié par :
argument_de( (5+i)^4 x (i-239) )
= argument_de(-114244 -114244i)
= 5Pi/4
= 4arctan(1/5) - arctan(1/239) + Pi

donc puisque
5Pi/4 = 4arctan(1/5) - arctan(1/239) + Pi
Pi/4 = 4arctan(1/5) - arctan(1/239)

s'en suit le développement en série entière de la fonction arctangeante (à chercher sur wikipedia par exemple), qui est facile à programmer mais donc l'explication mathématique est plutôt niveau post bac
Shakan972 Messages postés 43 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 17 avril 2015
9 févr. 2007 à 17:25
Donc je suppose que tu connaissais la méthode évoqué dans mon programme sinon pourrais-tu me parler un peu plus de cet algorithme je te prie je trouve cela intéressant :)
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
9 févr. 2007 à 16:43
l'algo est très simple
on a une surface: un carré de 4 cm2, et un cercle inscrit dans ce carré donc de rayon 1 donc de surface Pi cm2
si on crée un point au hasard à l'intérieur de ce carré on a
(Pi chances)/4 de tomber sur un point à l'intérieur du cercle, et donc si on multiplie par 4 le rapport points-dedans points-en-dehors on tend vers Pi selon la loi de probabilité

je trouve ça tordu mais rigolo

pour calculer pi un des meilleurs algorithme est celui que donne wikipedia

mais pour l'apprécier à sa juste valeur il faut utiliser une lib comme gmp (librairie pour gérer les grands nombres) ou créer
soi-même un équivalent
Shakan972 Messages postés 43 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 17 avril 2015
9 févr. 2007 à 15:59
En fait j'ai initialiser 2 fois le générateur de nombres en pensant que si je procédais à une seule initialisation la valeur du tirage affecté à x serait la même dans y.

Voilà pourquoi maintenant c'est vrai que j'ai bêtement suivi cette logique et il se pourrait que mon raisonnement soit inutile je te l'accorde mais pour revenir à l'efficacité de mon algo je te trouve un peu dur dans le sens ou un seul programme mis à part le mien traite de la détermination approximative de pi.

L'autre programme en effet que j'ai trouvé en C sur cette partie du site traite du développement limité.

Mais bon pas de problème j'accepte ta critique et je tâcherai de produire des algorithmes plus efficaces.

Sur ce bonne journée et bonne continuation :)
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
9 févr. 2007 à 15:28
Pourquoi ne pas appeler srand une seule fois au début, comme tout le monde le fait?

Cet algorithme est inefficace car il met très longtemps à s'approcher de PI par rapport à d'autres algorithmes.
Par contre, je vois pas ce qui est rigolo, j'ai sans doute loupé un truc
Shakan972 Messages postés 43 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 17 avril 2015
9 févr. 2007 à 14:57
Pour répondre à ta question vecchio56 cette fonction me permet d'initialiser le générateur de nombres aléatoires dans un intervalle [1,0] à chaque nouvelle itération de la boucle.

Sinon acx01b Tu dis mon algo quelque peu inefficace et très rigolo pourrais-tu je te prie développer ta critique ça m'aiderait à avancer ^^

Merçi.
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
9 févr. 2007 à 12:29
/*salut
cet algo est terriblement inefficace mais très rigolo !!*/


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

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


/* 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;
int n, i, pts_dans_cercle;
pts_dans_cercle=0;
printf("Veuillez saisir le nombre d'iterations a realiser :");
scanf("%d",&n);
srand (time (NULL));
i=n;
while (i) {
x=(float)rand()/RAND_MAX;
x*=x;
y=(float)rand()/RAND_MAX;
y*=y;
if (x+y<=1.0) pts_dans_cercle++;
i--;
}
printf("Estimation de pi = %f\n",(float(4*pts_dans_cercle)/n);
printf("\n");
printf("Estimation de pi termine !!\n\n");
system("PAUSE");
return 0;
}
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
9 févr. 2007 à 12:24
A quoi sert ta fonction my_rand?