IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Calcul d'une intégrale [Débutant(e)]


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 45
    Points
    45
    Par défaut Calcul d'une intégrale
    salut,

    je suis debutant en c++, et je veux faire un fonction me calculant une integrale par la methode des trapezes...
    J'ai donc defini une fonction dont un des parametres est une fonction au sens mathématique.
    Dans ma fonction (au sens c++) j ai une boucle dans laquelle ma focntion mathématique doit prendre une nouvelle valeurà chaque increment.
    Voilà donc comment j ai programme la chose...:

    ma fonction : 4 parametres : la fonction mathematique, la borne inf, la borne sup et le nombre de segments avec lequel on discretise le domaine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    float Integration_Trapeze(float f, float a, float b, float n)
    	{
    		float I=0; /*valeur de l'intégrale*/
    		float h=(b-a)/n; /*pas d'intégration*/
    		float x=a;
    		float fa=0; //initialisation
    		float fb=0; //initialisation
     
    		for (int i=0; i<n; i=i+1)
    		{
    			fa=f;
    			x=x+h; fb=f;
    			I=0.5*h*(fa+fb);
    		};
    		return(I);
    }
    Ma classe main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream> 
    #include <cmath> 
    using namespace std;
     
    float Integration_Trapeze(float, float, float, float);
     
    int main(void)
    {
    float x=0; //initialisation
    float f=x*x; //definition de la fonction
    float I=Integration_Trapeze(f, 0, 2, 10);
    cout<<"integrale = "<<I<<"\n";
    }
    Voilà, si quelqu un peut me filer un coup de main ou un endroit ou je pourrais trouver l info ca serait sympa...
    Tant que j y suis autre question, comment appeler le nombre Pi en c++ ?

    Merci

  2. #2
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 45
    Points
    45
    Par défaut oubli
    oui j ai un peu oublie d expliciter clairement le problème : c est tout simplement que ma fonction ne change pas de valeur dans la boucle !

  3. #3
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    Bien le bonjour,

    le premier argument de Integration_Trapeze est un float. Lors de l'appel, ce float vaut 0. Oui, il vaut 0*0.
    Ce que tu passes à Integration_Trapeze est donc la valeur 0. Ce n'est pas une fonction au sens mathématique (qui soit dit en passant n'existe pas en C++).

    Ensuite dans la boucle dans Integration_Trapeze tu fais toutes les opérations que tu veux, mais tu as toujours f qui vaut 0.

    Et pour pi, un simple #define PI 3.14159 peut suffire. Sinon tu as la constante flottante M_PI qui vaut 3.14159 déclarée dans <cmath>

  4. #4
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    pas mieux, tu auras toujours 0 comme ça.
    sinon c'est plus de l'algorithmie qu'un problème de prog je pense (cf. forum algorithmes)

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Une solution à ton problème serait de passer en paramètre une fonction (au sens C++), plutôt qu'un flottant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    // Définition du type des fonctions que tu vas utiliser
    typedef float (*TypeFonction)(float);
     
    float Integration_Trapeze(TypeFonction f, float a, float b, float n)
    	{
    		float I=0; /*valeur de l'intégrale*/
    		float h=(b-a)/n; /*pas d'intégration*/
    		float x=a;
    		float fa=0; //initialisation
    		float fb=0; //initialisation
     
    		for (int i=0; i<n; i=i+1)
    		{
    			fa=f(x);
    			x=x+h; fb=f(x);
    			I=0.5*h*(fa+fb);
    		};
    		return(I);
    }
     
    float Carre(float x)
    {
        return x * x;
    }
     
    int main(void)
    {
        float I=Integration_Trapeze(&Carre, 0, 2, 10);
        cout<<"integrale = "<<I<<"\n";
    }

  6. #6
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 45
    Points
    45
    Par défaut
    ok je vous remercie la dernière reponse me semble interessante mais je n'ai pas tout compris !
    Est ce que quelqu'un pourrait m expliquer ces lignes de commandes ou du moins me dire dans quelle rubrique je pourrais trouver des infos me permettant de les utiliser correctement:

    // Définition du type des fonctions que tu vas utiliser
    typedef float (*TypeFonction)(float);
    et

    int main(void)
    {
    float I=Integration_Trapeze( &Carre, 0, 2, 10);
    cout<<"integrale = "<<I<<"\n";
    }

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    La première ligne défini un type de donnée du type :
    Pointeur sur une fonction prenant un paramètre de type float, et retournant une valeur de type float. Ce type sera nommé TypeFonction.

    La seconde prend l'adresse de la fonction Carre (définie plus bas), et la passe à la fonction Integration_Trapeze. Comme la fonction Carre correspond au type TypeFonction, ça marche.

    Le troisième point intéressant est la ligne :
    Que l'on peut écrire plus explicitement (la première écriture est un raccourci qui ne marche pas dans tous les cas) :
    Cette ligne prend le pointeur de fonction passé en paramètre à Integration_Trapeze, et appelle la fonction pointée en lui passant x en paramètre.

    Si tu n'as pas encore vu les pointeurs tout court, je te conseille si tu as encore du mal à comprendre d'attendre de les avoir vu et de prendre ce code comme une recette de cuisine pour l'instant.

    Autre point : Pourquoi utiliser des floats et non des doubles ? Surtout pour une opération comme l'intégration, où l'on ajoute plein de petites valeurs, il me semble plus judicieux d'utiliser des doubles, dont la précision est meilleure. A moins que tu sois en expert en calcul numérique, et que tu aies prouvé que la fonction que tu intègre et la méthode d'intégration que tu utilises peuvent se satisfaire de floats.

    Si ce n'est pas le cas, et que tu te destines à faire pas mal de calcul numérique, je te conseille au moins de parcourir What Every Computer Scientist Should Know About Floating-Point Arithmetic, histoire d'avoir une idée des problèmes qu'on peut rencontrer dans un monde ou (a+b)+c peut donner une valeur différente de a+(b+c).

  8. #8
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 84
    Points : 45
    Points
    45
    Par défaut
    ok je te remercie, j ai lu un tutorial present sur le site à propos des pointeurs, j'ai pu à peu près comprendre comment ça marche.
    J'ai mis en oeuvre ta proposition et ca fonctionne.
    Mais j'aurai une autre question....:
    A la base mon idee etait la suivante, je voulais definir dans un seul fichier un ensemble de fonction permettant de calculer des integrales par diverses methodes.
    Et je voulais pouvoir ensuite utiliser ces fonctions dans un code defini dans un autre fichier.cpp.
    Si j'essaye de faire ca avec le code que tu m as passe (donc je mets le fonction Integration_Trapeze() dans un autre fichier, j'ai un message d'erreur : " 'Integration_Trapeze' : cannot convert parameter 1 from 'double (__cdecl *)(double)' to 'double' "

    NB : je travaille avec Visual C++ Express.

    Autre question :
    si je veux que l utilisateur puisse taper sa fonction mathematique dans le script de commande plutot que de devoir rentrer dans le code, j'avais pense à utiliser à peu près le même principe que tu m as explique à savoir :
    l'utilisateur rentre une expression par exemple 3*x+cos(x) de type double
    je met un pointeur de type double
    et dans ma fonction appelee Fonction mon parametre sera l adresse de l'expression. Qu en penses-tu ?

    Ci-joint le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #include <iostream> 
    #include <cmath> 
    using namespace std;
     
    #define PI 3.14159 
    double Integration_Trapeze(double, float, float, int);
    double Fonction(double);
     
    double Fonction(double x)
    { 
    	return(x*x);
    }
     
    typedef double (*TypeFonction)(double);//pointeur de type fonction retournant un float et ayant un float comme parametre
     
    double Integration_Trapeze(TypeFonction f, float a, float b, int n)
    	{
    		double I=0; /*valeur de l'intégrale*/
    		float h=(b-a)/n; /*pas d'intégration*/
    		for (int i=0; i<n; i=i+1)
    		{
    			double x=a+i*h;
    			double fa=(*f)(x);
    			x=x+h; double fb=(*f)(x);
    			I=I+0.5*(fa+fb)*h;
    		};
    		return(I);
    }
     
    int main(void)
    {
    double I=Integration_Trapeze(&Fonction, 0, 1, 20);
    cout<<"integrale = "<<I<<"\n";
    }
    Merci encore.


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calcul d'une intégrale sous SAS
    Par yemal dans le forum Macro
    Réponses: 7
    Dernier message: 18/07/2011, 21h42
  2. calcul d'une intégrale avec indicatrice
    Par Stalinou dans le forum MATLAB
    Réponses: 4
    Dernier message: 11/04/2011, 21h07
  3. Calcul d'une intégrale double d'une matrice
    Par code_source dans le forum MATLAB
    Réponses: 4
    Dernier message: 12/01/2011, 14h59
  4. Calcul d'une intégrale double par la méthode des quadratures
    Par deubelte dans le forum Mathématiques
    Réponses: 5
    Dernier message: 10/05/2009, 12h40
  5. calcul d'une intégrale
    Par bahiatoon dans le forum Mathématiques
    Réponses: 1
    Dernier message: 14/01/2009, 11h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo