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

avec Java Discussion :

Méthode de résolution d'une équation degré 3


Sujet :

avec Java

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Méthode de résolution d'une équation degré 3
    Bonjour,

    j'ai un problème, je dois créer un programme permettant de trouver les racines d'un polynome de degré 3. Pour trouver la première racine, je dois utiliser la dichotomie. La méthode que j'ai faite fonctionne, mais seulement quand je définis les coefficients du polynome dans la méthode P3. Si je rentre les coefficients dans la console, je renconte une erreur et j'aimerai bien savoir pourquoi.

    Voici ma méthode dichotomie:



    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
    public class Polynôme {
     
     public static double P7 (double X){
      double P7 = Math. pow(X, 7) - 64  ; // On définit ici le polynôme P7(X)
      return P7;  
     }
     
     public static  double dichotomie(double a,double b,int compteur){
     
      if (P7(a) * P7(b)< 0){
      double m = (a+b)/2; //m est le milieu de [a,b]  
      double epsilon= 0.00001; //pour la précision
      System.out.println("\n\t Appel récursif numéro "+compteur );
      System.out.println("\t On considère à présent l'intervalle : ["+a+" , "+b+"]" ) ; // on affiche un résultat intermédiaire afin de voir si l'intervalle choisi est bon
     
       if(Math.abs(P7(m))<epsilon){ // Math.abs() permet de prendre la valeur absolue  
       return m;
       }
       else  if (P7(a)*P7(m)>0){
          compteur ++;
          return dichotomie (m,b,compteur);
          }
             else compteur ++;
            return dichotomie (a,m,compteur);
      }
      else System.out.println("\t Erreur !! L'intervalle ["+a+" , "+b+"] ne contient aucune solution !!!" );
      return 0; // 0 équivalent à l'ensemble vide
      }
     
     public static void main (String[]args){
     
       double res = dichotomie(-1, 2 ,0); // Il faut choisir ici un intervalle où il y a une solution sinon erreur.
       System.out.print("\n\t La racine réelle de P7(X) est X* = " +res);
      }
    }



    et voici ma classe équation de degré 3:


    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    import static java.lang.System.out;
     
    public class Rac3 {
     
     public static double P3 (double X){
     
     
      String txt1 = es.LireCh("coeff A = " );
      double a3 = Double.valueOf(txt1).doubleValue();  // pour JDK 1.1
     
      String txt2 = es.LireCh("coeff B = " );
      double a2 = Double.valueOf(txt2).doubleValue();
     
      String txt3 = es.LireCh("coeff C = " );
      double a1 = Double.valueOf(txt3).doubleValue();
     
      String txt4 = es.LireCh("coeff D = " );
      double a0 = Double.valueOf(txt4).doubleValue();
     
     
      double P3 =  a3 * Math.pow(X, 3) + a2*  Math.pow(X, 2) + a1 * X + a0;// On définit ici le polynôme P3(X)
      return P3;
     }
     
     public static  double dichotomie(double a,double b,int compteur){
     
       if (P3(a) * P3(b)< 0){
       double m = (a+b)/2; //m est le milieu de [a,b]  
       double epsilon= 0.00001; //pour la précision
       System.out.println("\n\t Appel récursif numéro "+compteur );
       System.out.println("\t On considère à présent l'intervalle : ["+a+" , "+b+"]" ) ; // on affiche un résultat intermédiaire afin de voir si l'intervalle choisi est bon
     
        if(Math.abs(P3(m))<epsilon){ // Math.abs() permet de prendre la valeur absolue  
        return m;
        }
        else  if (P3(a)*P3(m)>0){
           compteur ++;
           return dichotomie (m,b,compteur);
           }
              else compteur ++;
             return dichotomie (a,m,compteur);
       }
       else System.out.println("\t Erreur !! L'intervalle ["+a+" , "+b+"] ne contient aucune solution !!!" );
       return 0; // 0 équivalent à l'ensemble vide  
     }
     
     public static void main(String[]args){
     
       out.println("\n\n" );
       out.println ("\t ------------------------------------------------------------------------ " );
       out.println ("\t|                                                                        |" );
       out.println ("\t|  TPP 02: Résolution de polynôme type a3 X^3 + a2 X^2 + a1 X + a0 = 0   |" );
       out.println ("\t|                                                                        |" );
       out.println ("\t ------------------------------------------------------------------------ " );
     
       double res = dichotomie(-1,2,0);
       System.out.println(res);
     
     
     
     
      /* Suite du TPP
     System.out.println(" Le polynôme à résoudre est : " +a3+" X^3 + "+a2+ " X^2 + " +a1+" X + "+a0+ "= 0" );
       double rac1, rac2, rac3;
       out.println();
       double delta= b*b - 4*a*c;
       if (a == 0){
        rac1 = (-c/b);
        out.printf("Le polynome admet une racine reelle: \nx= "+rac1);
       }
        else if (delta>0) {
        rac1 = (-b-sqrt(delta))/(2*a);
        rac2 = (-b+sqrt(delta))/(2*a);
      out.println("l'equation admet deux solutions reelles: \nx1= "+rac1+" et x2= "+rac2);
       } else  
        if (delta==0) {
         rac1 = -b/(2*a);
         out.printf("Le polynome a donc une racine reelle double qui est :  %e \n", rac1);
        }
        else  {
         rac1 = -b/2*a;
         delta = abs(delta);  /*  Pourqoui l'emploi  de la val. absolue  de 'delta' ici ?  
         rac2 = sqrt(delta)/2*a;
         out.println("Le polynome admet deux racines complexes qui sont: \nx1= "+rac1+" -i "+ rac2+" et x2= "+rac1+" +i "+ rac2);  
        }
       
       }
      es.attente();
      }
     */
      }
     }


    Merci de m'aider à faire cela

  2. #2
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    Salut, que veux-tu dire par ça ne fonctionne pas ? As-tu des messages erreurs ?
    Tu peux déjà essayer d'afficher toutes tes variables d'entrées pour vérifier qu'elles sont bonnes (a3, a2, etc.), c'est peut-être un problème de cast.

    (Et pour info ça n'a rien à voir avec la persistance )
    Vive les roues en pierre

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    ce n'est pas un message d'erreur, il me demande les variables et quand je rentre la derniere il me redemande la première etc...

  4. #4
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    Par défaut
    En fait, à chaque appel de P3() tu redemandes d'entrer les valeurs donc c'est normal. A priori, tu devrais sortir tout ça de ta méthode P3() et ne l'exécuter qu'une seule fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    String txt1 = es.LireCh("coeff A = " );
    double a3 = Double.valueOf(txt1).doubleValue(); // pour JDK 1.1
     
    String txt2 = es.LireCh("coeff B = " );
    double a2 = Double.valueOf(txt2).doubleValue();
     
    String txt3 = es.LireCh("coeff C = " );
    double a1 = Double.valueOf(txt3).doubleValue();
     
    String txt4 = es.LireCh("coeff D = " );
    double a0 = Double.valueOf(txt4).doubleValue();
    Tu peux stocker a0, a1 etc. dans ta classe où encore les passer en argument à P3(). Ca te donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    public static double P3 (double X, double a0,  double a1,  double a2,  double a3){
    double P3 = a3 * Math.pow(X, 3) + a2* Math.pow(X, 2) + a1 * X + a0;// On définit ici le polynôme P3(X)
    return P3;
    }
    puis tu fais ta lecture sur l'entrée par exemple ici, ou dans une autre méthode (d'autre part tu fais plusieurs fois les même calculs c'est pas vraiment optimisé, tu devrais stocker tes résultats) :
    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
     
    public static double dichotomie(double a,double b,int compteur){
     
    String txt1 = es.LireCh("coeff A = " );
    double a3 = Double.valueOf(txt1).doubleValue(); // pour JDK 1.1
    String txt2 = es.LireCh("coeff B = " );
    double a2 = Double.valueOf(txt2).doubleValue();
    String txt3 = es.LireCh("coeff C = " );
    double a1 = Double.valueOf(txt3).doubleValue();
    String txt4 = es.LireCh("coeff D = " );
    double a0 = Double.valueOf(txt4).doubleValue();
     
    double p3a = P3(a, a0, a1, a2, a3);
    double p3b = P3(b, a0, a1, a2, a3);
     
    if (p3a * p3b< 0){
    double m = (a+b)/2; //m est le milieu de [a,b]
     
    double p3m = P3(m, a0, a1, a2, a3);
     
    double epsilon= 0.00001; //pour la précision
    System.out.println("\n\t Appel récursif numéro "+compteur );
    System.out.println("\t On considère à présent l'intervalle : ["+a+" , "+b+"]" ) ; // on affiche un résultat intermédiaire afin de voir si l'intervalle choisi est bon
     
    if(Math.abs(p3m)<epsilon){ // Math.abs() permet de prendre la valeur absolue
    return m;
    }
    else if (p3a*p3m>0){
    compteur ++;
    return dichotomie (m,b,compteur);
    }
    else compteur ++;
    return dichotomie (a,m,compteur);
    }
    else System.out.println("\t Erreur !! L'intervalle ["+a+" , "+b+"] ne contient aucune solution !!!" );
    return 0; // 0 équivalent à l'ensemble vide
    }
    Etant donné que tu rappelles dichotimie() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return dichotomie (m,b,compteur);
    il te redemandera les valeurs, mais là je crois que c'est ce que tu veux non ?
    Vive les roues en pierre

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/02/2015, 10h02
  2. Réponses: 2
    Dernier message: 25/02/2010, 19h04
  3. 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, 18h47
  4. Résolution d'une équation
    Par johnvox dans le forum Delphi
    Réponses: 6
    Dernier message: 13/02/2007, 11h04
  5. Résolution d'une équation par Gauss
    Par rahmani01 dans le forum MATLAB
    Réponses: 3
    Dernier message: 03/11/2006, 23h15

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