Problème de dichotomie

cindoo Messages postés 27 Date d'inscription vendredi 11 juin 2010 Statut Membre Dernière intervention 11 janvier 2012 - 10 janv. 2012 à 09:53
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 11 janv. 2012 à 14:44
Bonjour

J'ai un petit problème avec mon algorithme de dichotomie je ne comprend pas laquelle .
Merci de me répondre si vous trouvez l'erreur



public void dicho(double a, double b, double esp, double nbmax)
{
double ya = fonction(a);
double yb = fonction(b);
esp = Math.Pow(10, -Math.Abs(esp));
if (ya * yb > 0)
{
textBlock8.Text = "erreur";
}
for (int i = 1; i <= nbmax; i++)
{
double m = (a + b) / 2;
double y = fonction(m);
if (Math.Abs(y) <= esp)
{
textBlock8.Text = m.ToString();
i = (int)nbmax;
}
else if (y==0)
{

}
else if (y * ya < 0)
{
b = m;
yb = fonction(b);
}
else if (y * yb < 0)
{
a = m;
ya = fonction(a);
}
else if (i == nbmax)
{
textBlock8.Text = "zero non trouve";
}
}
}

16 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
10 janv. 2012 à 10:23
qu'est censée faire ta fonction ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cindoo Messages postés 27 Date d'inscription vendredi 11 juin 2010 Statut Membre Dernière intervention 11 janvier 2012
10 janv. 2012 à 10:29
c'est une fonction du type ax^2 + bx + c avec a b et c que je choisis dans des text box
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
10 janv. 2012 à 10:34
Quel est le rapport avec la dichotomie ?
Pas plus compris le but de ta fonction...

Merci pour le coloriage de la source, elle est pas top lisible...

que fait la fonction 'fonction' (Joli nom) ?

Il n'est pas normal dans une fonction de calcul, comme dicho a l'air de l'être, de manipuler les contrôles de ta form (textBlock8...)

Merci, donc, de bien vouloir éclairer un peu ma lanterne sur ce qu'est censé calculer dicho, je veux bien t'aider, mais je n'ai pas envie de chercher a comprendre un code, qui présente de surcroît une anomalie (sinon tu n'aurai pas posté ce message)



Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cindoo Messages postés 27 Date d'inscription vendredi 11 juin 2010 Statut Membre Dernière intervention 11 janvier 2012
10 janv. 2012 à 10:40
le but de mon projet est de calculer quand la fonction s'annule et de l'afficher...je dois rentrer mes valeur a b et c dans des textes box et ainsi avec la methode de dichotomie ca m'affiche le point sur lekel la fonction s'annule
dsl pour le coloriage je sais pas comment on fait :s
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
10 janv. 2012 à 10:58
tu cherches a résoudre un equation du second degré, c'est tout ?

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cindoo Messages postés 27 Date d'inscription vendredi 11 juin 2010 Statut Membre Dernière intervention 11 janvier 2012
10 janv. 2012 à 11:02
oui en utilisant la dichotomie
0
cindoo Messages postés 27 Date d'inscription vendredi 11 juin 2010 Statut Membre Dernière intervention 11 janvier 2012
10 janv. 2012 à 11:28
une petite idée du problème parce que la quand je calcule il me mette zero non trouve
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
10 janv. 2012 à 11:37
tu ne m'a pas répondu :

double ya = fonction(a);

qu'est fonction ?


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cindoo Messages postés 27 Date d'inscription vendredi 11 juin 2010 Statut Membre Dernière intervention 11 janvier 2012
10 janv. 2012 à 11:42
en l'ocurrence quand je teste la c pour la fonction x^2+2x+1 et il ne trouve pas quand ca s'annule.
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
10 janv. 2012 à 11:56
mais il ne va pas me répondre, le bougre !

quel est le code de la fonction fonction ? (drole de nom, en passant)

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cindoo Messages postés 27 Date d'inscription vendredi 11 juin 2010 Statut Membre Dernière intervention 11 janvier 2012
10 janv. 2012 à 11:59
je crois que c ca le code...



public double fonction(double x)
{
return xCarre * x * x + xSimple * x + nombre;
}
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
10 janv. 2012 à 12:26
ok...
faut vraiment que tu revoie le prototypage de tes fonctions et la structure générale de ton projet !

J'ai nettoyé un peu le code :

public double calculer(double a, double b, double c, double x) {
            return (a * x * x) + (b * x) + c;
        }

        public double resoudre_equation(double a, double b, double c, double min, double max, double seuil, int Essais) {
            double x;
            double resultat;
            double resultat_Min = calculer(a, b, c, min);
            double resultat_Max = calculer(a, b, c, max);

            for (int i = 1; i <= Essais; i++) {
                x = (min + max) / 2;
                resultat = calculer(a, b, c, x);
                if (Math.Abs(resultat) <= seuil)
                    return x; // Valeur en dessous le seuil de tolérance
                else if (resultat > resultat_Min) {
                    min = x;
                    resultat_Min = resultat;
                } else {
                    max = x;
                    resultat_Max = resultat;
                }
            }
            throw new Exception("Zéro non trouvé");
        }


ca ne solutionne pas ton problème, mais le code est simplifié...

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
10 janv. 2012 à 12:56
Partant d'un code nettoyé, le voilà corrigé :

public double calculer(double a, double b, double c, double x) {
            return (a * x * x) + (b * x) + c;
        }

        public double resoudre_equation(double a, double b, double c, double min, double max, double seuil, int Essais, Boolean First) {
            if (((b * b) - (4 * a * c)) < 0)
                throw new Exception("Pas de solution (Delta négatif)");

            double x;
            double resultat;

            for (int i=0; i<Essais; i++) {
                x = (min + max) / 2;
                resultat = calculer(a, b, c, x);
                if (Math.Abs(resultat) <= seuil)
                    return x; // Valeur en dessous le seuil de tolérance

                if (First)
                    if (resultat < 0)
                        min = x;
                    else
                        max = x;
                else
                    if (resultat > 0)
                        min = x;
                    else
                        max = x;
            }
            throw new Exception("Zéro non trouvé");
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try {
                MessageBox.Show(resoudre_equation(1, 1, 2, -10, 10, 0, 5000, true).ToString(),"Première solution");
                MessageBox.Show(resoudre_equation(1, 1, 2, -10, 10, 0, 5000, false).ToString(), "Seconde solution");
            }
            catch (Exception ex) {
                MessageBox.Show(ex.Message);
            }
        }


pourtant simple quand on a une courbe sous les yeux...


Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0
cindoo Messages postés 27 Date d'inscription vendredi 11 juin 2010 Statut Membre Dernière intervention 11 janvier 2012
11 janv. 2012 à 13:40
Merci pour votre aide
0
cindoo Messages postés 27 Date d'inscription vendredi 11 juin 2010 Statut Membre Dernière intervention 11 janvier 2012
11 janv. 2012 à 13:41
je n'ai pas compri a quoi corresponde le essais et le sueil??
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
11 janv. 2012 à 14:44
c'est ton nbmax et esp
j'ai tenté d'interpreter ton code...

si ce n'est pas leur role... tant pis ^^

seul permet d'ajuster un niveau de tolérance... pour valider un résultat si suffisamment proche de 0

essais permet d'éviter les boucles infinies en définissant un nombre maximal d'essais

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
0