begin process at 2012 02 08 21:40:22
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > APPROXIMATION PI PAR LA MÉTHODE DE MONTE CARLO

APPROXIMATION PI PAR LA MÉTHODE DE MONTE CARLO


 Description

programme qui donne une estimation de pi selon la méthode de monte carlo
******************************************** **********************/
/***      Approximation de pi par la méthode de monte carlo     ***/
/***                       crée par blackbird                   ***/
//-principe :
//--> un cercle est circonscrit dans un carré.
//    la surafce du cercle / la surface du carré = pi / 4
//--> on remplit le carré par des points (surafce du carré)
//    et on compte le nombre de points dans le cercle (surface
//    du cercle).
//    leurs rapport = pi / 4
//--> plus le nombre de points est élévé plus on s'approche de la
//    valeur de pi
/********************************************** ********************/

Source

  • /******************************************************************/
  • /*** Approximation de pi par la méthode de monte carlo ***/
  • /*** crée par blackbird ***/
  • //-principe :
  • //--> un cercle est circonscrit dans un carré.
  • // la surafce du cercle / la surface du carré = pi / 4
  • //--> on remplit le carré par des points (surafce du carré)
  • // et on compte le nombre de points dans le cercle (surface
  • // du cercle).
  • // leurs rapport = pi / 4
  • //--> plus le nombre de points est élévé plus on s'approche de la
  • // valeur de pi
  • /******************************************************************/
  • #include <stdio.h>
  • #include <stdlib.h>
  • #include <time.h>
  • #include <conio.h>
  • #include <ctype.h>
  • #include <windows.h>
  • int main() {
  • int Rep;
  • float NbrePoint,CoordonneeX,CoordonneeY;
  • float NbrePointDansCercle = 0 ,Compteur = 1;
  • LARGE_INTEGER Debut,Fin,Frequence;
  • double Duree;
  • //
  • //saisie du nombre de points total.
  • //
  • printf("Donner le nombre de points total :\n");
  • scanf("%f",&NbrePoint);
  • //
  • QueryPerformanceFrequency(&Frequence);
  • QueryPerformanceCounter(&Debut);
  • //
  • //extraire aléatoirement un point de coordonnées X et Y
  • //si X²+Y² < 1 donc le point est dans le cercle
  • //sinon elle est dans le carré.
  • //
  • srand(time(NULL));
  • do {
  • CoordonneeX = rand()/(RAND_MAX+1.0);
  • CoordonneeY = rand()/(RAND_MAX+1.0);
  • if (CoordonneeX * CoordonneeX + CoordonneeY * CoordonneeY < 1)
  • NbrePointDansCercle ++;
  • printf("PI = %10f\n",4*NbrePointDansCercle / NbrePoint);
  • Compteur++;
  • }while(Compteur<=NbrePoint);
  • //
  • QueryPerformanceCounter(&Fin);
  • Duree = (1000.0 * (Fin.QuadPart - Debut.QuadPart) / Frequence.QuadPart );
  • printf("\n Ex%ccut%c en %0.3f secondes\n",130,130,Duree/1000);
  • printf("\n\nTaper sur Entr%ce pour continuer.\nTaper sur une autre pour quitter\n\n\n",130);
  • Rep = _getch();
  • if (__toascii(Rep) == 13) {system("cls");main();}
  • else exit(EXIT_SUCCESS);
  • }
/******************************************************************/
/***      Approximation de pi par la méthode de monte carlo     ***/
/***                       crée par blackbird                   ***/
//-principe : 
//--> un cercle est circonscrit dans un carré.
//    la surafce du cercle / la surface du carré = pi / 4
//--> on remplit le carré par des points (surafce du carré)
//    et on compte le nombre de points dans le cercle (surface 
//    du cercle).
//    leurs rapport = pi / 4
//--> plus le nombre de points est élévé plus on s'approche de la 
//    valeur de pi
/******************************************************************/


#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <conio.h>
#include <ctype.h>
#include <windows.h>



int main() {

	int Rep;

	float NbrePoint,CoordonneeX,CoordonneeY;
	float NbrePointDansCercle = 0 ,Compteur = 1;
	
	LARGE_INTEGER Debut,Fin,Frequence;
	double Duree;

	//
	//saisie du nombre de points total.
	//
	printf("Donner le nombre de points total :\n");
	scanf("%f",&NbrePoint);
	//

	QueryPerformanceFrequency(&Frequence);
	QueryPerformanceCounter(&Debut);

	//
	//extraire aléatoirement un point de coordonnées X et Y
	//si X²+Y² < 1 donc le point est dans le cercle
	//sinon elle est dans le carré.
	//
	srand(time(NULL));
	do {
		CoordonneeX = rand()/(RAND_MAX+1.0);
		CoordonneeY = rand()/(RAND_MAX+1.0);
		if (CoordonneeX * CoordonneeX + CoordonneeY * CoordonneeY < 1)
			NbrePointDansCercle ++;
		printf("PI = %10f\n",4*NbrePointDansCercle / NbrePoint);
			Compteur++;
	}while(Compteur<=NbrePoint);
	//
    
	QueryPerformanceCounter(&Fin);
	Duree = (1000.0 * (Fin.QuadPart - Debut.QuadPart) / Frequence.QuadPart );
	printf("\n		Ex%ccut%c en %0.3f secondes\n",130,130,Duree/1000);

	printf("\n\nTaper sur Entr%ce pour continuer.\nTaper sur une autre pour quitter\n\n\n",130);
       Rep = _getch();
	   if (__toascii(Rep) == 13)  {system("cls");main();}
	   else exit(EXIT_SUCCESS);
}




 Sources du même auteur

PROBLÈME DE N DAMES
Source avec Zip GÉNÉRER DES CLÉS RSA

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

Commentaires et avis

Commentaire de lynxtyle le 04/03/2008 11:36:07

Petite chose que j'apprécis pas beaucoup c'est le titre donné dans le code : "Approximation de pi par la méthode de monte carlo crée par blackbird"
tu pourrais au moins par humilité mettre : "Approximation de pi par blackbird grace à la méthode de monte carlo"

Tu peux aussi retirer des includes stdlib.h car tu n'y fait jamais appel...

Après coté performances (vu que tu utilise le QueryPerformance c'est que tu dois la rechercher) tu as le printf qui est très gourmand en temps d'exécution... donc donner le résultat qu'à la fin te ferait gagner beaucoup de temps d'exécution ! (et pas qu'un peu si tu souhaite obtenir une approximation précise) Mais si tu souhaite pouvoir afficher périodiquement l'approximation actuel implémente un peu de directx ou opengl à ton application (ainsi le gros de exécution de l'affichage est pris en charge par le processeur de ta carte graphique... c'est performant et en plus tu peux avoir à l'écran un truc sympa et surtout ça rend fou les prof à l'université, qui ne connaissent pas la programmation de moteur graphique, quand ils voyent même pas de différence de temps d'exécution entre avec et sans l'affichage périodique du résultat actuel^^)

Enfin pour ce qui s'intêresse à pi cette méthode statistique n'est pas la plus performante mais elle à l'avantage d'avoir son résultat facilement réutilisable et de pouvoir être facilement déployé sur un réseau :

srand(time(NULL));
do {
CoordonneeX = rand()/(RAND_MAX+1.0);
CoordonneeY = rand()/(RAND_MAX+1.0);
if (CoordonneeX * CoordonneeX + CoordonneeY * CoordonneeY < 1)
NbrePointDansCercle ++;
Compteur++;
}while(Compteur<=NbrePoint);

et on sauvegarde NbrePointDansCercle et Compteur qu'on peut par exemple récupérer par réseau depuis tout plein d'ordinateur... le serveur n'ayant plus qu'à faire le calcul final (c'est aussi une partie très sympa à étudier vu que le but est de rechercher le plus grand nombre significatif de pi... donc les tailles de variables classiques sont dépassées ce qui peu être résolu avec un tableau...)
on rajoute au projet le multithread et on en fait un écran de veille en remplaçant "while(Compteur<=NbrePoint);" par temps que la souris bouge pas... puis envois des 2 variables sur un serveur web... ça peu faire un projet sympa^^ mais ça restera tout de même une méthode très peu performante pour calculer pi ;)

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,624 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales