Bonjour,
J'essaie de faire un exercice en C++ basé sur l'intégration de Montecarlo mais je tombe sur des résultats incohérents. Le but est de trouver l'aire d'une surface se trouvant entre diverses fonctions. La séparation "en blocs" se fait assez facilement.
Voici le graphique de l'énoncé:
Voici mon code:
Les résultats que me rend ma console sont:Code:#include <iostream> #include <cstdlib> #include <ctime> #include <cmath> using namespace std; // Fonction montecarlo d'intégrale double integrate (double (*f)(double), double borneLeft, double borneRight, double borneDown, double borneUp, int n) { srand((unsigned int)time(NULL)); int Nu = 0; int No = 0; for (int i = 0; i < n; i++) { // Génération de x entre borneLeft et borneRight double x = (((double)rand()/RAND_MAX)*(borneRight-borneLeft))+borneLeft; // Génération de y entre borneDown et borneUp double y = (((double)rand()/RAND_MAX)*(borneUp-borneDown))+borneDown; // Si surface sous y = 0 if (y <= 0) { if (y > f(x)) { Nu++; } else if (y < f(x)) { No++; } // Si surface au-dessus de y = 0 } else { if (y > f(x)) { No++; } else if (y < f(x)) { Nu++; } } } return (borneRight-borneLeft)*(borneUp-borneDown)*((double)Nu/((double)Nu+(double)No)); } // Fonctions à intégrer // Fct 1 double fct1 (double x) { return ((2/27)*(x*x*x))+2; } // Fct 2 double fct2 (double x) { return ((-2/27)*(x*x*x))-2; } // Fct 3 double fct3 (double x) { return 2*(sqrt( 1-( (x*x)/9 ) ) ); } int main() { double a = 3; double b = 2; int k = 10000; // Intégration de fct 1 double integrale1 = integrate(fct1, -a, 0, 0, b, k); // Intégration de fct 2 double integrale2 = integrate(fct2, -a, 0, -b, 0, k); // Intégration de fct 3, dessus double integrale3 = integrate(fct3, 0, a, 0, b, k); // Intégration de fct 3, desssous double integrale4 = integrate(fct3, 0, a, -b, 0, k); // Total cout << "L'intégrale vaut " << integrale1+integrale2+integrale3+integrale4 << endl; cout << integrale1 << endl; cout << integrale2 << endl; cout << integrale3 << endl; cout << integrale4 << endl; return 0; }
L'intégrale vaut 16.755
6
6
4.755
0
Ces résultats sont incohérents. J'ai déjà trouvé un soucis mais je ne sais pas comment le résoudre: la fonction3 (bloc sous y=0) dépend d'une racine est donc toujours > 0 tandis que y généré est < 0.
Je pense qu'il y a d'autres soucis mais je ne peux pas les identifier.
La bonne réponse est, d'après mon prof, de 18,4.
merci beaucoup d'avance !
-----