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

Mathématiques Discussion :

Algorithme de calcul pour la Méthode Ferrari


Sujet :

Mathématiques

  1. #1
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 49
    Points
    49
    Par défaut Algorithme de calcul pour la Méthode Ferrari
    Bonjour,

    Depuis quelques jours, j'écris un algorithme pour calculer des solutions d'un polynôme d'ordre quatre via la méthode de Ferrari :
    http://fr.wikipedia.org/wiki/M%C3%A9thode_de_Ferrari
    Après un débugage afin d'obtenir la bonne solution donnée dans l'exemple de wikipédia, j'ai voulu tester d'autres exemples pour être sur et ai donc utilisé la résolution de Maple et regardé si mon programme Matlab donnait les mêmes résultats et ce n'est pas le cas. En fait, dans certains cas j'ai le bon résultats et dans d'autres non.
    J'aurais donc voulu savoir si certains d'entre vous aurez un site avec un algorithme faisant la même chose histoire de comparer. Ou bien si quelqu'un se sent de regarder dans le mien que je posterai dans ce cas. Car j'ai beau cherché, je ne trouve pas mon erreur.

    Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je n'utilise pas Matlab, donc, malheureusement, je ne pourrai rien faire.
    Si vous trouvez tantôt des résultats bons, tantôt des résultats faux, cela pourrait être une erreur de logique. J'ai lu la méthode, et ce n'est pas vraiment simple, surtout que le traitement diffère en fonction de certaines conditions. Je pense que la seule méthode pour trouver où se situe le problème est de mettre des impressions intermédiaires, et profiter du fait que c'est bon pour certaines équations et faux pour d'autres, en mettant les deux traitement en parallèle, le branchement différent apparaîtra forcément.
    Etes-vous sûr que vous ne comparez jamais une valeur en flottant à une autre avec un opérateur du type "égal"?

  3. #3
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 49
    Points
    49
    Par défaut
    Alors, tout d'abord, je tiens à préciser que je débute en programmation et que ceci est mon premier programme. Du coup, je ne comprends pas trop la remarque sur le flottant. Car en effet, je fais des comparaisons. Par exemple, pour le calcul de b0, je fais une comparaison de a0 avec 0 et si a0=0, je calcule b0 avec la formule adéquate, et sinon, je calcule b0 avec l'autre formule comme expliqué dans le lien wikipédia (vers la fin de la démonstration).

    Sinon, c'est en effet ce que je fais, j'affiche les expression intermédiaires. J'ai donc recherché quelques exemples sur le net qui détaillent et regarde si mes valeurs intermédiaires correspondes, ce qui fût le cas pour les quelques exemples trouvé (1 ou 2 en plus de celui de wikipédia de mémoire) pour lesquels mon résultat final est correct. Mais il n'y en a pas des masses des exemples bien fait.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Concernant la comparaison de flottants avec "égal", cela a fait l'objet de plusieurs discussions, en général assez animées, voire franchement désagréables.
    Pour l'instant, croyez-moi, au lieu de faire le test "a égal b" faites le test "valeur absolue (a-b) plus petit que epsilon".
    Epsilon étant un nombre que vous déterminez de façon pas trop bête, en fonction de la précision utilisée etc.
    Pour vérifier en l'absence d'exemples, il suffit d'écrire n'importe quelle équation, puis calculer sa valeur (égale zéro) pour chacune des racines calculées.
    Ceci dit, vous pouvez m'envoyer le code, naturellement je regarderai.

  5. #5
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 318
    Points : 52 958
    Points
    52 958
    Par défaut
    Citation Envoyé par elglantosimpatico Voir le message
    Alors, tout d'abord, je tiens à préciser que je débute en programmation et que ceci est mon premier programme. Du coup, je ne comprends pas trop la remarque sur le flottant.
    => Pourquoi 0.3-0.2-0.1 est-il différent de 0 ?

  6. #6
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 49
    Points
    49
    Par défaut
    En fait, le test n'est pas a=b, mais a=0 et la méthode de calcul pour b dépend de cette égalité.
    Merci pour la proposition, je vais vous envoyer ça.
    Et merci pour le lien, je vais aussi regarder cela.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Je n'ai pas vu de différence entre les fichiers de suffixe asv et m, Mais comme je ne connais pas Matlab, c'est peut-être normal.
    Je ne connais pas la fonction nthroot().

    Mais il y a plusieurs choses que je remarque.
    Il n'y a aucun contrôle de validité des paramètres a, b, c etc. En particuliers il faut vérifier que certains sont non nuls, parce qu'il sont des dénominateurs dans des divisions. Cette vérification est toujours indispensable.
    J'ai pris l'exemple de l'équation du second degré.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    delta=b^2-4*a*c
     
    if delta > 0
        x1 = (-b+sqrt(delta))/2;
        x2 = (-b-sqrt(delta))/2;
    elseif delta == 0
        x1 = -q/2;
        x2 = u^3;
    else
        x1 = (-q+i*sqrt(delta))/2;
        x2 = (-q-i*sqrt(delta))/2;
    end
    Vous testez si delta est positif, OK, c'est le cas général.
    Puis si delta est nul, en pratique, cela n'arrive jamais.
    Püis, donc delta est négatif. dans tous les langages que je connais, sqrt(Nombre_négatif) se plante.
    je suppose que 'i' est tq i² == -1.
    Mais êtes-vous sûr que cela puisse s'écrire comme cela? Moi, j'aurais plutôt écrit ... = sqrt(i² * delta).
    Le calcul est faux il faut diviser encore par a.
    .. x2 = u^3; me parait étonnant.

    J'ai lu le calcul de l'équation de 4è degré, mais je n'ai rien vu de particulier d'autre que pour celle du 2è degré.

  8. #8
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonsoir,

    Citation Envoyé par elglantosimpatico Voir le message
    Après un débugage afin d'obtenir la bonne solution donnée dans l'exemple de wikipédia, j'ai voulu tester d'autres exemples pour être sur et ai donc utilisé la résolution de Maple et regardé si mon programme Matlab donnait les mêmes résultats et ce n'est pas le cas.
    Je pense que ce n'est pas une bonne idée de comparer maple (calcul formel) et matlab (calcul numérique). Le premier ne fait aucune approximation, aucune erreur d'arrondi. Ce n'est pas du tout le cas du second.

    Vu l'algorithme, je pense que vous devriez tout de même trouver des résultats très proches de ceux de maple. Quelles sont les différences exactement?

    Avez-vous testé a posteriori que les solutions données par votre algorithme sont bien solutions de votre équation?

  9. #9
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Je n'ai pas vu de différence entre les fichiers de suffixe asv et m, Mais comme je ne connais pas Matlab, c'est peut-être normal.
    Je ne connais pas la fonction nthroot().

    Mais il y a plusieurs choses que je remarque.
    Il n'y a aucun contrôle de validité des paramètres a, b, c etc. En particuliers il faut vérifier que certains sont non nuls, parce qu'il sont des dénominateurs dans des divisions. Cette vérification est toujours indispensable.
    J'ai pris l'exemple de l'équation du second degré.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    delta=b^2-4*a*c
     
    if delta > 0
        x1 = (-b+sqrt(delta))/2;
        x2 = (-b-sqrt(delta))/2;
    elseif delta == 0
        x1 = -q/2;
        x2 = u^3;
    else
        x1 = (-q+i*sqrt(delta))/2;
        x2 = (-q-i*sqrt(delta))/2;
    end
    Vous testez si delta est positif, OK, c'est le cas général.
    Puis si delta est nul, en pratique, cela n'arrive jamais.
    Püis, donc delta est négatif. dans tous les langages que je connais, sqrt(Nombre_négatif) se plante.
    je suppose que 'i' est tq i² == -1.
    Mais êtes-vous sûr que cela puisse s'écrire comme cela? Moi, j'aurais plutôt écrit ... = sqrt(i² * delta).
    Le calcul est faux il faut diviser encore par a.
    .. x2 = u^3; me parait étonnant.

    J'ai lu le calcul de l'équation de 4è degré, mais je n'ai rien vu de particulier d'autre que pour celle du 2è degré.
    Bonjour,

    En fait, il semblerait que les fichiers .asv ne soient pas à jour par rapport aux .m (je donc aller chercher la signification de ces .asv).

    En fait, dans le .m, il y a ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if delta > 0
        x1 = (-b+sqrt(delta))/(2*a);
        x2 = (-b-sqrt(delta))/(2*a);
    elseif delta == 0
        x1 = -b/(2*a);
        x2 = x1;
    else
        x1 = (-b+i*sqrt(abs(delta)))/(2*a);
        x2 = (-b-i*sqrt(abs(delta)))/(2*a);
    end
    Qui donc donne la racine de la valeur absolue de "delta" pour n'avoir aucun problème. Et "nthroot" sert a prendre la nème racine réelle du nombre. Car pour les racine cubique, si j'écrivais ^(1/3), il me donnait la racine imaginaire.

    Citation Envoyé par Aleph69 Voir le message
    Bonsoir,
    Vu l'algorithme, je pense que vous devriez tout de même trouver des résultats très proches de ceux de maple. Quelles sont les différences exactement?
    Alors, tout d'abord, j'ai seulement utilisé la résolution de l'équation sous Maple. Ensuite, j'ai transposé mon algorithme sous Maple aux différences suivantes : j'utilise la fonction "solve" pour avoir les résultats de l'équation d'ordre 3 et de celles d'ordre 2. De cette façon, je suis sur que si erreur il y a, cela vien de mon algorithme pour le polynôme d'ordre 4. Et donc, à la fin, j'ai bien une différence sous Maple selon que je résolve directement mon équation ou que je passe par mon algorithme.


    Citation Envoyé par Aleph69 Voir le message
    Bonsoir,
    Avez-vous testé a posteriori que les solutions données par votre algorithme sont bien solutions de votre équation?
    Non, a testé.

    Merci pour vos conseils.

  10. #10
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 318
    Points : 52 958
    Points
    52 958
    Par défaut
    Citation Envoyé par Aleph69 Voir le message
    Je pense que ce n'est pas une bonne idée de comparer maple (calcul formel) et matlab (calcul numérique). Le premier ne fait aucune approximation, aucune erreur d'arrondi. Ce n'est pas du tout le cas du second.
    En effet, sauf si on compare Maple à la Symbolic Math Toolbox de MATLAB qui incorporait jusqu'à peu le moteur de... Maple (aujourd'hui rempacé par MuPAD)

    Citation Envoyé par elglantosimpatico Voir le message
    En fait, il semblerait que les fichiers .asv ne soient pas à jour par rapport aux .m (je donc aller chercher la signification de ces .asv).
    Les fichiers .asv sont des fichiers de suavegarde automatique que MATLAB actualise à intervalle régulier (toutes les n minutes) avec le contenu du fichier équivalent ouvert dans le MATLAB Editor (=> http://www.mathworks.com/help/techdo...ml#brxijj0-102).

  11. #11
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 49
    Points
    49
    Par défaut
    Alors,

    Si je rentre une des racines obtenues dans l'équation, je suis bien loin de 0 comme résultats. De plus, que ce soit sous Maple ou Matlab, l'algorithme donne le même résultats, toujours différents de celui avec la fonction solve normale de Matlab. Ou bien encore avec ceci :
    http://www.wolframalpha.com/input/?i...49x+%2B3+%3D+0
    Je continue d'inspecter.

  12. #12
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    Dans de nombreuses écoles, on persuade les élèves que les polynômes sont des fonctions sympathiques, ce qui est peut-être vrai du point de vue du calcul formel. Mais ce que la plupart des gens ignorent, c'est qu'en calcul numérique, ce sont les pires "sales bêtes". Il existe des méthodes de résolution qui sont moins mauvaises que les autres (par exemple par les valeurs propres de la matrice compagnon), mais les méthodes usuelles de recherche des zéros d'une fonction quelconque conduisent parfois à des instabilités terribles.
    Jean-Marc Blanc

  13. #13
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par FR119492 Voir le message
    Salut!
    Dans de nombreuses écoles, on persuade les élèves que les polynômes sont des fonctions sympathiques, ce qui est peut-être vrai du point de vue du calcul formel. Mais ce que la plupart des gens ignorent, c'est qu'en calcul numérique, ce sont les pires "sales bêtes". Il existe des méthodes de résolution qui sont moins mauvaises que les autres (par exemple par les valeurs propres de la matrice compagnon), mais les méthodes usuelles de recherche des zéros d'une fonction quelconque conduisent parfois à des instabilités terribles.
    Jean-Marc Blanc
    Tout à fait, à la base je résolvais mon problème en cherchant les zéro de la fonction mais vu les problèmes engendrés, je me suis dit que le faire avec la méthode Ferrari serait mieux, et me voila^^.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Pour la résolution de l'équation du 4è degré, j'ai cru comprendre qu'il s'agisait d'un exercice théorique.

    Si j'avais à le faire, je préférerais la méthode de Gauss qui consiste à considérer qu'au voisinage d'un racine, la courbe est très proche de la tangente en ce point. Donc on calcule la dérivés et on trouve la (une) racine par approximations successives.
    Naturellement là, il ne s'agit pas d'une méthode générale, mais d'une méthode pour résoudre une fonction donnée.

  15. #15
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Bonjour,
    Pour la résolution de l'équation du 4è degré, j'ai cru comprendre qu'il s'agisait d'un exercice théorique.

    Si j'avais à le faire, je préférerais la méthode de Gauss qui consiste à considérer qu'au voisinage d'un racine, la courbe est très proche de la tangente en ce point. Donc on calcule la dérivés et on trouve la (une) racine par approximations successives.
    Naturellement là, il ne s'agit pas d'une méthode générale, mais d'une méthode pour résoudre une fonction donnée.
    En fait, j'ai lut que cette méthode donnait généralement de mauvais résultats si utilisée numériquement.

    Par contre, j'ai peut être un idée du problème. Après avoir lut le lien donné par Dut, je me rends compte que en effet, il est possible que mes quelques tests d'égalité causent problème. Dans le lien, ils parlent de eps et vous, vous avez conseillé de mettre un test impliquant epsilon. Qu'est-ce? Un nombre très petit permettant de "ratisser" un peu autour de zero?

  16. #16
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    Le mieux est d'utiliser la fonction roots qui existe dans Matlab, Scilab et Octave.
    Jean-Marc Blanc

  17. #17
    Invité
    Invité(e)
    Par défaut
    Concernant la résolution d'équations il y 2 approches différentes
    1- On cherche à résoudre une équation d'une certaine forme, par exemple polynome du 4è degré, avec des paramètre quelconques.
    2- On doit résoudre un problème qui comporte la résolution numérique d'une équation qu'on le sait pas résoudre numériquement.
    La première option, est en fait théorique, puisqu'il y a fort peu de chances qu'un programme puisse l'appliquer telel-quelle.
    La seconde option est beaucoup plus fréquente. Dans ce cas, on a fait une étude de la fonction, limites (domaine de validité) etc. Il y un certain nombre de moyens d'approche, à choisir suivant les cas, mais dans tous les cas de figure on peut obtenir de bons résultats.
    Si vous retrouvez l'auteur qui a écrit que "cette méthode donnait généralement de mauvais résultats ...", demandez lui ce qu'il propose comme alternative.

    Vous savez, eps, epsilon, toto, machin etc, c'est un petit nombre, rien d'autre.
    Il ne s'agit pas de "ratisser" mais de faire un programme qui marche.
    Recherchez les différents sujets qui traitent de la même question, et vous aurez toutes les réponses, et même les réponses inverses.

  18. #18
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par FR119492 Voir le message
    Salut!
    Le mieux est d'utiliser la fonction roots qui existe dans Matlab, Scilab et Octave.
    Jean-Marc Blanc
    Merci, je ne connaissais pas cette fonction qui fait exactement ce que je voulais. Quelle est la limite validité d'une telle fonction?
    Cela dit, je vais quand même essayer de faire fonctionner mon programme en utilisant "epsilon" pour voir si cela fonctionne dans mon cas.

  19. #19
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    Quelle est la limite validité d'une telle fonction?
    Elle fonctionne assez bien (moins mal que les autres) si le problème n'est pas trop mal conditionné.

    Exemple: Si tu développes (x-10^6)^4=0, ça ne marchera pas, mais aucune méthode numérique ne marchera.

    Jean-Marc Blanc

  20. #20
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 104
    Points : 49
    Points
    49
    Par défaut
    Bonjour,

    Et bien je pense finalement avoir un algorithme qui fonctionne.
    Mon erreur était dans la définition d'un des paramètres. Une puissance oubliée qui faisait que cela ne fonctionnait pas dans certains cas.
    De plus, comme conseillé, j'ai rajouté des epsilon pour les tests car sans cela, j'avais des erreurs. par contre, j'ai dû mettre les tests à 30*epsilon car les erreurs additionnées faisaient que seulement epsilon ne fonctionnait pas.
    Je vous remercie donc pour vos conseils.

    Par contre, le calcul de Matlab et Maple étant différents, selon vous, le même algorithme sous Maple serait-il plus précis?
    Si je pose la question, c'est pour deux raisons :
    1) Parce que jusque là, lorsque je le transpose sous Maple, je n'ai pas besoin d'epsilon pour avoir le bon résultat.
    2) L'algorithme sous Maple sans les epsilon donc) donne les mêmes résultats que la fonction "solve" sous Maple et que mon algorithme sous Matlab mais parfois sensiblement différents des résultats avec la fonction "roots" de Matlab.

    Edit : si il y en a qui sont intéressés. Je peux leur donner mon algorithme.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Algorithme de calcul d'albédo de surface pour 2 images
    Par RomGar dans le forum Traitement d'images
    Réponses: 0
    Dernier message: 06/06/2008, 14h15
  2. Algorithme qui calcule la racine de F(x) par la méthode de dichotomie
    Par autoin dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 09/01/2008, 15h28
  3. Y-a t-il plusieurs algorithmes de calcul de l'amortissement d'un prêt?
    Par kouka dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 12/09/2007, 14h33
  4. Algorithme d'indexation pour moteur de recherche
    Par caspertn dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 24/04/2006, 17h57

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