DÉTERMINER PI PAR LE BIAIS DE LA MÉTHODE DE MONTE CARLO ( LANGAGE C )
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 2010
-
9 févr. 2007 à 12:24
Taron31
Messages postés199Date d'inscriptionvendredi 16 avril 2004StatutMembreDernière intervention28 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.
Taron31
Messages postés199Date d'inscriptionvendredi 16 avril 2004StatutMembreDernière intervention28 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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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és199Date d'inscriptionvendredi 16 avril 2004StatutMembreDernière intervention28 février 2008 10 mars 2007 à 22:30
cs_ptidiable
Messages postés16Date d'inscriptiondimanche 17 avril 2005StatutMembreDernière intervention21 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és101Date d'inscriptionvendredi 15 février 2002StatutMembreDerniè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és244Date d'inscriptionvendredi 6 mai 2005StatutMembreDernière intervention 6 avril 20081 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és280Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention 8 juillet 20146 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és43Date d'inscriptionsamedi 21 mai 2005StatutMembreDernière intervention17 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és280Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention 8 juillet 20146 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és43Date d'inscriptionsamedi 21 mai 2005StatutMembreDernière intervention17 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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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és43Date d'inscriptionsamedi 21 mai 2005StatutMembreDernière intervention17 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és280Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention 8 juillet 20146 9 févr. 2007 à 12:29
/*salut
cet algo est terriblement inefficace mais très rigolo !!*/
/* 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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 9 févr. 2007 à 12:24
11 mars 2007 à 13:25
sinon les \a c'était pour me prévenir lorsque le calcul était terminé ;)
++
10 mars 2007 à 22:42
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
10 mars 2007 à 22:30
18 févr. 2007 à 13:30
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 ;)
12 févr. 2007 à 15:47
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
10 févr. 2007 à 11:52
Non ?
Et y a-t-il d'autres manières pour le vérifier ?
Merci
9 févr. 2007 à 20:04
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
9 févr. 2007 à 17:25
9 févr. 2007 à 16:43
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
9 févr. 2007 à 15:59
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 :)
9 févr. 2007 à 15:28
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
9 févr. 2007 à 14:57
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.
9 févr. 2007 à 12:29
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;
}
9 févr. 2007 à 12:24