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 :

Résolution d'une equation.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut Résolution d'une equation.
    Bonsoir

    Je débute tout juste dans le langage C. Pour un projet info, on doit resoudre une equation de degré 4 par la methode dichotomique. Je connais cette methode sur le papier mais je n'arrive pas à la traduire en C.

    Quelqu'un pourrait il m'aiguiller à ce sujet ?

    Autre question, j'ai essayé de résoudre une equation de degré 4=0 de façon linéaire. Je défini un plage de recherche ( par exemple de -10 à 10 ), ensuite je defini une précision( combien de chiffre àprès la virgule ) et je met tout ça dans le boucle for en disant de calculer pour chaque valeur comprise dans la plage.
    Un exemple :
    Je demande de calculer de -2 à 2 avec une précision de 0.1. il va calculer avec les valeurs -2, -1.9, -1.8, 1.7..............................1.9, 2.
    Ayant très peu de chance de tombé sur une valeur juste, je ne trouve pas comment faire pour afficher les solutions de l'équation avec la précision?

    Voici le bout de code que j'ai commencé :
    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
    35
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    void resoudre()
          {
          float a,b,c,d,e,borne_inf,borne_sup,precision,x,resultat;
     
          a=2;
          b=5;
          c=6;
          d=8;
          e=4;
          borne_inf=-4;
          borne_sup=6;
          precision=0.0001;
     
          x=borne_inf;
          for(x=borne_inf; x<borne_sup; x+=precision)
          {
                           if(resultat<precision&&resultat>(0-precision))
                           {
                           printf("%f est un resultat\n",x);
                           }
          resultat=(a*(pow(x,4))+b*(pow(x,3))+c*(pow(x,2))+d*x+e);
          }
    }
     
    int main ()
    {
        resoudre();
     
        system("PAUSE");
        return 0;
    }
    Merci d'avance à tous !

    Pierre

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    salut, bienvenue sur le forum
    Concernant la précison, ce n'est pas comme ça qu'il faut faire : tu calcules 2 itéres x1 et x2 et si |x1-x2| < eps tu t'arrêtes, où eps est la précision de ton résultat. Dans ton cas, tu peux poser eps = 0,1 par exemple (en général, on s'arrête avec eps = 1e-13)

    utilises des doubles et non des floats

    tu as écrit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(resultat<precision&&resultat>(0-precision))
    autant écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(fabs(resultat-precision)<eps) /* tu te donnes une valeur pour eps */

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut
    Je ne suis pas sur d'avoir tout compris........
    J'ai essayé de remplacer ce que tu m'a donné mais ça me sort des valeurs bizarre.
    fabs() c'est une fonction ?

    Merci d'avance

    Pierre

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    Citation Envoyé par piieerre Voir le message
    Je ne suis pas sur d'avoir tout compris........
    J'ai essayé de remplacer ce que tu m'a donné mais ça me sort des valeurs bizarre.
    fabs() c'est une fonction ?

    Merci d'avance

    Pierre
    quand tu fais eps = |x1 - x2| tu calcule la précision en faisant la différence entre la dernière valeur obtenue et l'avant dernière, plus tu t'approches de cette précision plus celà veut dire que tu es proche de la solution

    fabs () est une fonction de math.h c'est la valeur absolue d'un double.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut
    Bonjour et merci de vos reponses.

    J'ai bien compris votre solution, mais je n'arrive pas à la traduire en C.
    Mon problème est que comment donner au dernier et avant dernièr resultat afin de les comparer et ensuite arrèter le calcul et afficher les resultats?
    Quelqu'un peut il me conseiller sur la démarche a suivre en partant sur le bout de code de départ.

    Merci d'avance

    Pierre

  6. #6
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for(x=borne_inf; x<borne_sup; x+=precision)
          {
                           if(resultat<precision&&resultat>(0-precision))
                           {
                           printf("%f est un resultat\n",x);
                           }
          resultat=(a*(pow(x,4))+b*(pow(x,3))+c*(pow(x,2))+d*x+e);
          }

    Une petite remarque en passant. Il me semble plus logique de calculer "resultat" puis de rechercher à l'afficher s'il est suffisamment proche de zéro et non l'inverse !!! En plus, dans ton code, comme "resultat" n'est pas initialisée, le premier test if n'a pas de sens.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 14
    Par défaut
    Voici le code modifié avec vos information.
    La seul chose que j'ai pas modifié car je n'ai pas encore compris pour le traduire en C, c'est la variable "eps" et |x1-x2]. Je ne sais pas trop ou placer 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    void resoudre()
          {
          double a,b,c,d,e,borne_inf,borne_sup,precision;
          double x;
          double resultat;
          a=2;
          b=5;
          c=6;
          d=8;
          e=4;
          borne_inf=-10;
          borne_sup=10;
          precision=0.001;
          resultat=0;
          x=borne_inf;
          for(x=borne_inf; x<borne_sup; x+=precision)
          {
           resultat=(a*(pow(x,4))+b*(pow(x,3))+c*(pow(x,2))+d*x+e);            
     
           if(fabs(resultat<precision)&&fabs(resultat>(0-precision)))
           {
           printf("%lf est un resultat\n",x);
           }
     
          }
    }
     
    int main ()
    {
        resoudre();
     
        system("PAUSE");
        return 0;
    }
    Merci d'avance

    Pierre

Discussions similaires

  1. Résolution d'une équation trigonométrique
    Par tlemcenvisit dans le forum Algorithmes et structures de données
    Réponses: 21
    Dernier message: 20/08/2009, 17h47
  2. résolution d'une equation en c
    Par kawther dans le forum C
    Réponses: 15
    Dernier message: 22/07/2007, 15h48
  3. Résolution d'une équation
    Par johnvox dans le forum Delphi
    Réponses: 6
    Dernier message: 13/02/2007, 10h04
  4. programme fortran90 qui calcule les racines d'une equation de deg 3 ?
    Par casier dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 10/06/2006, 17h30
  5. résolution d'une image
    Par nabil dans le forum VB 6 et antérieur
    Réponses: 23
    Dernier message: 29/08/2005, 20h12

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