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 :

Trouver le zéro d'une fonction


Sujet :

C++

  1. #1
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Juin 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 15
    Points : 4
    Points
    4
    Par défaut Trouver le zéro d'une fonction
    Bonjour,

    Je souhaiterais savoir s'il existe en C++ une fonction qui permette de trouver directement le zéro d'une fonction.

    Je vous remercie par avance,

    Cordialement.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Bonjour,
    En C++ uniquement, non, par contre, dans l'une des nombreuses bibliothèques de mathématiques, certainement.

    Regarde du coté de boost, notamment Boost.Math
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Juin 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Merci pour votre réponse.

    J'ai regardé dans la bibliothèque Boost Math.
    Je n'ai pas trouvé de fonction permettant de résoudre une équation, je suis cependant débutante en C++.

    Sachant que je souhaiterais que la fonction me rende une solution numérique (donc non exacte), connaissez-vous un autre moyen de faire ?

    Je vous remercie par avance,

    Cordialement.

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Et bien, programmer le calcul.

    Certes, c'est bien de ne pas réinventer la roue, mais vient un moment où c'est plus rapide, et surtout plus formateur.

    Quelle est ta situation précise?
    Dois-tu pouvoir déterminer {x de R | f(x)=0} pour toute fonction f qu'on te donnerai?
    Si oui, comment te la donnerait-on? par sa forme analytique (f(x)=2x²-1) ou par une fonction précodée?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Juin 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Je voudrais rentrer la fonction par une forme analytique.
    La fonction est :

    f(x(k))=-x(k)*exp(-(x(k)+t)) +10.

    Je voudrais trouver la valeur x(0) de x qui annule la fonction pour t=0.
    Puis la valeur x(1) de x qui annule la fonction pour t=x(0).
    Puis la valeur x(2) de x qui annule la fonction pour t=x(0)+x(1).
    etc.

    Je voudrais que les valeurs x(0), x(1) et x(2) soient numériques avec une précision de 15 chiffres après la virgule.

    Merci par avance.

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Premièrement, la précision à 15 chiffres, ce n'est pas facilement possible. (cf le format flottant
    Il faut te tourner vers des outils spécialisés.

    Enfin, négligeons ce détail.
    Quand je disais la forme analytique, je voulais désigner ceci (ou pire encore):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main() {
        string equation = "f(x(k))=-x(k)*exp(-(x(k)+t)) +10";
        cout << equation << " a pour zéro : " << search_zero(equation) << endl;
        return 0;
    }
    Commençons par le début, sais-tu comment t'y prendre mathématiquement parlant? Autrement dit, si tu n'avais qu'un crayon, que ferais-tu?

    Il ne faut pas oublier qu'un ordinateur est une calculette géante, super rapide, mais qui fais ce qu'on lui dit.
    Et qu'un programme n'est qu'une manière de lui dire que faire.

    La seule vraie limite d'un langage est: "Il n'est possible de programmer que ce qu'on peut expliquer."

    tu cherches donc la solution de -x*exp(-(x+t)) +10 == 0
    c'est-à-dire 10 = x * exp(-(x+t))
    commence par ecrire une petite fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double f(double x, double t) {
        return -x * exp(-(x+t)) +10;
    }
    Ton problème devient alors d'écrire la fonction double chercher_zero(double x, double t); qui devrait retourner le zero de f pour un x et un t donné.


    Pour l'usage futur, tu peux envisager ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class exponentielle {
    private:
        double decalage;
    public:
        explicit exponentielle(double d) : decalage(d) {}
        double operator()(double x, double t) const {
            return -x * exp(-(x+t)) + decalage;
        }
    };
    //exemple d'usage
    int main() {
        exponentielle e10(10);
        std::cout << " à t=0, f(4) = " << e10(4) << std::endl;
    }
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Tu veux le faire analytiquement ou numériquement ?

    Numériquement, boost propose plusieurs élément, donc le premier est le classique algorithme de Newton : http://www.boost.org/doc/libs/1_53_0...ls1/roots.html

    Analytiquement, l'exercice est de type totalement différent, et définir un ensemble de fonction que tu veux pouvoir traiter (tu pourras pas toutes les traiter ... ça serait trop beau) est la première étape. La seconde est de coder de quoi faire comprendre à l'ordinateur la fonction, puis finalement les algorithmes qui vont résoudre ton problème.

    La base de ce second type de problème c'est de la compilation et de la manipulation d'AST. Tu donnes une expression au programme, il l'analyse et créé un AST, ensuite tu traites cet AST pour en déduire le résultat. C'est un exercice assez complexe, plus que celui de proposer une implémentation basique de l'algorithme de Newton.

  8. #8
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Juin 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Merci pour votre réponse.

    Je voudrai une solution numérique. Je vais donc utiliser la fonction Boost.
    J'ai téléchargé la librairie Boost.

    Je ne vois pas comment accéder à la fenêtre Options pour rajouter les répertoires d'installation (pour que Visual C++ trouve la bibliothèque Boost).

    Pouvez-vous m'indiquer comment accéder à cette fenêtre ?

    Merci d'avance.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Dans l'Explorateur de solutions, sélectionne ton projet, puis clique sur le premier bouton en haut de l'Explorateur de solutions. Tu auras alors accès à la fenêtre des propriétés du projet.

  10. #10
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Juin 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 15
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Merci pour votre réponse.

    Lors de la création d'un projet, je souhaiterais savoir quel modèle déjà installé je dois choisir ?

    J'ai essayé en choississant le projet Win32. Quand je réalise un Debug, on me dis que le projet est obsolète.

    Cela vient-il du fait que j'ai choisi le mauvais projet ?

    Merci d'avance.

  11. #11
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    A priori, il vaut mieux choisir un projet vide, voire un projet console.

    Le premier étant vide, il n'a aucun problème possible, mais tout est à faire.
    Le projet console, lui, contient un minimum de code et aucune extension.

    Un projet win32 contient un certain nombre de dépendance pour utiliser le code spécifique à windows.
    Mieux vaut se limiter au code pour C++ quand on débute.


    Cela dit, "le projet est obsolete" signifie tout simplement qu'il n'a pas été recompilé depuis les derniers changements. cherche la commande/le bouton Reconstruire ou Rebuild.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

Discussions similaires

  1. Trouver rapidement les zéros d'une fonction
    Par nahouto dans le forum MATLAB
    Réponses: 17
    Dernier message: 23/01/2009, 13h32
  2. Trouver le minimum d'une fonction à 3 variables
    Par QuintusII dans le forum MATLAB
    Réponses: 13
    Dernier message: 08/12/2008, 14h19
  3. Trouver l'erreur dans une fonction
    Par Seth77 dans le forum Langage
    Réponses: 4
    Dernier message: 28/06/2006, 16h38
  4. Différentes méthodes de détermination du zéro d'une fonction
    Par Desperados dans le forum Mathématiques
    Réponses: 4
    Dernier message: 30/05/2006, 22h29
  5. Réponses: 6
    Dernier message: 12/05/2006, 15h20

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