begin process at 2010 02 10 10:29:01
  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 OPERATION SUR LES MATRICES CARREES AVEC CLASSE GENERIQUE par chouhad
Source avec une capture OPÉRATIONS SUR MATRICES C++ par Minilogus
[DEV-C++] CALCUL DE LA RACINE CARRÉE D'UN RÉEL par Jhep
PROGRAMME QUI CALCUL LE PPCM ET LE PGCD par AnoSantino
EVALUER UNE EXPRESSION MATHÉMATIQUE par begueradj

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

Comparez les prix


HTC Hero

Entre 550€ et 550€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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 : 1,108 sec (3)

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