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é:
Nom : 14972821584846_Sans titre.png
Affichages : 39
Taille : 332,8 Ko

Voici mon code:
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;
}
Les résultats que me rend ma console sont:

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 !