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

MATLAB Discussion :

problème dans mon code méthode des descentes


Sujet :

MATLAB

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    233
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 233
    Points : 92
    Points
    92
    Par défaut problème dans mon code méthode des descentes
    Bonjour,

    J'ai une fonction main4 qui appelle la fonction descente1 dans le but de coder la méthode des descentes. Problème: le résultat est NaN...

    J'ai l'impression que le code ne rentre pas dans la fonction descente1...

    Pourriez-vous m'indiquez pourquoi svp?

    Ci-dessous le code de main4:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    clear all % efface tout en mémoire
    close all %ferme fenêtres graphiques
    clc %efface console
    format long
     
    tstart = tic; %start du temps
     
    x0=[2.2;2.2]; 
    eps=1e-6;
    [X,nb,XX]=descente1(x0,eps)
    plot(XX(1,:),XX(2,:), 'o-')
     
    telapsed = toc(tstart) %stop du temps
    et celui de descente1:

    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
    function [X,nb,XX]=descente1(X0,eps)
    %méthode de Newton
    X=X0;
    XT=X0; 
    XX=[X];
    nb=0; 
    err=1;
    maxiter = 200
    %choix du pas
    alpha=0.1
     
    while (err>eps && nb<maxiter)
            %direction de descente -gradient
            d=-df(X);
            %calcul de x(k+1)
            X=X+alpha*d;
            %calcul de l'erreur
            err=norm(X-XT);
            %iteration
            XT=X;
            %compte nb iteration
            nb=nb+1;
            %complète la matrice
            XX=[XX,X];
    end
    Merci d'avance!

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    si tu obtiens un résultat, même nan, c'est que le code rentre dans la fonction.

    Que fait la fonction df?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  3. #3
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Bonjour,

    Je plussoie le commentaire de Magelan : peux-tu nous montrer la fonction df stp ?

    Un NaN peut venir d'une division par zéro... qui peut se produire lors du calcul d'une dérivée mal codée par exemple...

    Cordialement,
    Je ne réponds pas aux MP techniques. Le forum est là pour ça.
    La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
    Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
    Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Citation Envoyé par tachmou Voir le message
    Un NaN peut venir d'une division par zéro...
    Il faut aussi que le numérateur soit nul sinon, matlab renvoie la limite (Inf).
    Citation Envoyé par La doc de NaN
    These operations produce NaN:

    • Any arithmetic operation on a NaN, such as sqrt(NaN)
    • Addition or subtraction, such as magnitude subtraction of infinities as (+Inf)+(-Inf)
    • Multiplication, such as 0*Inf
    • Division, such as 0/0 and Inf/Inf
    • Remainder, such as rem(x,y) where y is zero or x is infinity
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    233
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 233
    Points : 92
    Points
    92
    Par défaut
    Salut tout le monde!

    Merci pour votre aide!

    Voici ci-dessous df, dérivée de ma fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function [a] = df(X)
    a = zeros(2,1);
    x=X(1,1);
    y=X(2,1);
    a = [-400*x*(y-x.^2)-2*(1-x); 200*(y-x.^2)];
    et d2f, dérivée seconde:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function [a]=d2f(X)
    a=zeros(2,2);
    x=X(1,1);
    y=X(2,1);
    a=[1200*x.^2-400*y+2, -400*x; -400*x, 200];

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    En fait les nan sont obtenus car ton algo diverge : réduit ton pas (valeur de alpha).
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    233
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 233
    Points : 92
    Points
    92
    Par défaut
    Merci tout le monde!

    Ca marche avec un pas de 0.001!

    Par contre, si vous avez testé mon programme, que signifie les points sur la courbe? Que cette méthode n'est pas trop adaptée?

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Citation Envoyé par bilou_12 Voir le message
    Par contre, si vous avez testé mon programme, que signifie les points sur la courbe? Que cette méthode n'est pas trop adaptée?
    Ce sont les valeurs trouvées à chaque itération. Je n'ai pas vu de problèmes particulier, pourquoi dis-tu qu'elle est mal adaptée?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    233
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 233
    Points : 92
    Points
    92
    Par défaut
    Ce qui me parait suspect, c'est que la courbe s'épaissit après avoir touché le point (-1; 1.25) et descend sans cesse si on augmente le nbre d'itération...

  10. #10
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Salut,

    Merci pour ces précisions Magelan. J'étais occupé, je n'ai pas pu suivre le fil. Je n'ai pas testé ton code, mais si ça converge puis diverge, cela peut venir de deux raisons :

    * Soit tu avais une "impression" de convergence alors qu'il n'y a en fait pas d'optimum et en fait l'algo diverge constamment mais le faisait lentement à moment donné (mais d'après moi, si tu connais l'algo et que ta courbe est continue et que tu vois visiblement qu'il y a un "optimum", tu ne devrais pas être dans ce cas)

    * Soit tu t'es planté dans la programmation de la méthode...

    Bon, ce n'est que mon avis personnel, mais je n'ai pas le temps de vérifier. D'après moi, il doit y avoir une erreur dans ton code, ça me paraît le plus probable d'après ce que je lis.

    Cordialement,
    Je ne réponds pas aux MP techniques. Le forum est là pour ça.
    La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
    Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
    Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Je n'ai pas regardé dans le détail, mais en augmentant le nombre d'itérations, ça converge et au bout d'un certains nombres d'itération ça n'évolue presque plus (ou alors j'ai regardé trop vite!). Après le grossissement de la courbe, c'est normal : le principe de la descente c'est d'ajuster la direction de la recherche de la solution, donc c'est normal a priori qu'il y est un peu de variations.
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème dans mon code
    Par mrbou dans le forum ASP
    Réponses: 15
    Dernier message: 01/10/2008, 14h38
  2. Réponses: 3
    Dernier message: 15/03/2008, 15h15
  3. Problème dans mon code
    Par curro dans le forum Débuter
    Réponses: 14
    Dernier message: 29/08/2007, 01h46
  4. Réponses: 2
    Dernier message: 03/05/2007, 09h00
  5. Réponses: 13
    Dernier message: 17/10/2006, 15h35

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