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 :

[lsqnonlin] fonction s’arrête de suite


Sujet :

MATLAB

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut [lsqnonlin] fonction s’arrête de suite
    salut tous,
    j'ai besoin de votre aide pour l'utilisation de la fonction lsqnonlin car les resultats que j'ai me paraissent bizarres. J'ai surement dû faire une erreur dans la façon d'utiliser cette fonction...?


    CONTEXTE:
    j'ai deux séries de données : "experimentales" et "numeriques" . Je je voudrais minimiser l'écart entre ces deux données.
    Le vecteur experimental contient 5 données, j'ai donc fait une fonction nommée "calculs" qui me donne les mêmes 5 données mais numeriquement et qui fait la différence entre les deux vecteurs.

    => au final la fonction "calculs" me renvoie:
    METHODE:
    Afin de minimiser cette grandeur:
    j'ai utilisé la fonction "lsqnonlin" de la toolbox optimisation de matlab mais ça ne fonctionne pas :
    => il doit y avoir quelque chose que je n'ai pas compris dans l'utilisation de cette fonction

    LA SYNTAXE UTILISEE:
    voici la syntaxe que j'ai utilisé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    parametresInitiaux=[5 4.4 2];
    options = optimset('Display','iter','TolFun',1e-8)
    [x,resnorm] = lsqnonlin(@calculs,parametresInitiaux,lb,ub,options);
    avec la fonction calculs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function RESIDU=calculs(parametresI)
    %ici je fais des calculs qui prennent les parametres en entrée
    residuVect=abs(Y_exp-Y_num);
    RESIDU=residuVect';
    DONNEES DE SORTIE:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    
    Optimization completed: The final point is the initial point.
    The first-order optimality measure, 0.000000e+000, is less than
    options.TolFun = 1.000000e-008.
    
    Optimization Metric                                   Options
    relative first-order optimality =  0.00e+000         TolFun =  1e-008 (selected)
    
    l'algorithme me fait que 4 iterations (juste de quoi determiner le gradient de ma fonction car j'ai 3 variables) et me dit que le premier resultat qu'il a le resultat final.

    => je ne comprends pas ceci car je sais que les parametres d'entres que j'ai donné sont carrément faux...

  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,

    Que vaut resnorm après exécution du programme?
    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é
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    je vais relancer un calcul et je te tiens informé, merci d'avoir pris le temps de repondre

  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
    Et tant qu'à faire, peux-tu nous montrer tout ce qui est affiché par lsqnonlin?
    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 éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    les calculs sont finis, voici ce que j'ai en sortie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
                                             Norm of      First-order 
     Iteration  Func-count     f(x)          step          optimality   CG-iterations
         0          4     0.000757721                             0
     
    Initial point is a local minimum.
     
    Optimization completed because the size of the gradient at the initial point 
    is less than the selected value of the function tolerance.
     
    <stopping criteria details>
    si je clique sur "stopping criteria details" voici ce que j'ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Optimization completed: The final point is the initial point.
    The first-order optimality measure, 0.000000e+000, is less than
    options.TolFun = 1.000000e-014.
     
    Optimization Metric                                   Options
    relative first-order optimality =  0.00e+000         TolFun =  1e-014 (selected)
    et voici le contenu le "resnorm"

    0.000757721157131718


    ps: merci de ton aide magelan (c'est important pour moi et je ne comprends pas ce qui se passe)

  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
    Comme indiqué par lsqnonlin, ton initialisation est en fait un minimum local (la valeur de f(x) est très petite). Il faut bien comprendre que lsqnonlin ne peut trouver que des minimas locaux, pas de minimum global, donc la solution trouvée dépendra en grande partie du point de départ.

    As-tu essayé de modifier cette initialisation en changeant parametresInitiaux?
    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 éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    oui, j'ai essayé de changer les paramètres initiaux et j'ai la même sortie par lsqnonlin...
    j'ai donc changé la tolérance (j'ai mis 1e-14) et toujours la meme réponse...


    en fait je pense que j'ai fais une erreur dans la syntaxe ou je n'ai pas bien compris ce que devait renvoyer la fonction "calculs" (je lui fais renvoyer un vecteur différence et c'est peut etre pas ceci qu'il faut faire..)

  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 21did21 Voir le message
    oui, j'ai essayé de changer les paramètres initiaux et j'ai la même sortie par lsqnonlin...
    Exactement la même sortie? Si oui, effectivement, il y a sûrement un problème d'écriture du code, il faudrait que tu nous le montre.

    Citation Envoyé par 21did21 Voir le message
    en fait je pense que j'ai fais une erreur dans la syntaxe ou je n'ai pas bien compris ce que devait renvoyer la fonction "calculs" (je lui fais renvoyer un vecteur différence et c'est peut etre pas ceci qu'il faut faire..)
    Si c'est la différence que tu veux minimiser, alors il faut bien la calculer.

    Sinon peut-être que la fonction lsqcurvefit serait plus appropriée dans ton cas?
    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 éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    je lui fais renvoyer un vecteur différence
    Attention à ce que la fonction renvoie une valeur réelle et non pas un vecteur, pour des arguments donnés (cela n'a pas de sens de minimiser une valeur vectorielle).
    Ceci dit, tu as tout à fait le droit de vectoriser la fonction (qui renvoie alors un vecteur quand on lui fournit un vecteur d'argument - et non pas un argument vecteur)

    residuVect=abs(Y_exp-Y_num)
    La valeur absolue n'est pas dérivable, alors que lsqnonlin attend une fonction C2 il me semble.

    Si tu remplaces cette ligne par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EcartResidu=sum((Y_exp-Y_num).^2);
    cela devrait regler les 2 problemes (fonction non derivable + output réel et non vectoriel)

    EDIT:
    Ok, excusez moi, j'aurais du lire l'aide avant. Pas besoin de sommer dans f(). Ca sert à rien non plus de prendre la valeur absolue... Cela dit cela me choque, puisque l'on perd la possibilité de vectoriser f().

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    je vais regarder toutes vos pistes et donner plus de precisions.

    => je vous tiens informé dans la soirée le temps que je lance plusieurs calculs

    merci

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par VV33D Voir le message
    Attention à ce que la fonction renvoie une valeur réelle et non pas un vecteur, pour des arguments donnés (cela n'a pas de sens de minimiser une valeur vectorielle).
    en lisant la doc j'avais cru comprendre le contraire...
    je vais essayer de renvoyer donc une valeur scalaire

  12. #12
    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
    La fonction peut retourner un vecteur :
    Citation Envoyé par La documentation de lsqnonlin
    fun should return a vector of values and not the sum of squares of the values. (The algorithm implicitly sums and squares fun(x).)
    et comme indiqué, il ne faut pas renvoyer la somme quadratique car c'est lsqnonlin qui s'occupe de la calculer.
    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.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    c'est bien ce qu'il me semblait.... merci pour la confirmation magelan

    => donc à priori ce que je lui donne en sortie à ma fonction c'est OK

    => je vais retester de calculer avec des autres données en entrée, je vous dirait ce que ça donne en sortie

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    je viens de faire un autre calcul et voici le résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                       Norm of      First-order 
     Iteration  Func-count     f(x)          step          optimality   CG-iterations
         0          4     0.000607091                             0
     
    Initial point is a local minimum.
    Optimization completed because the size of the gradient at the initial point 
    is less than the selected value of the function tolerance.
    et le critere d'arret:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Optimization completed: The final point is the initial point.
    The first-order optimality measure, 0.000000e+000, is less than
    options.TolFun = 1.000000e-014.
     
    Optimization Metric                                   Options
    relative first-order optimality =  0.00e+000         TolFun =  1e-014 (selected)

    le residu est de :

    0.000607091324520324

    cette fois il est plus petit, ça veut dire que l'autre n'était pas le minimum (j'ai pris des valeurs initiales très proches); je pense que je dois modifier dasn les options une tolérence mais je ne sais pas laquelle,
    => j'ai deja essayé tolFun mais apparemment ce n'est pas celle ci...

  15. #15
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    tolX

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    Citation Envoyé par VV33D Voir le message
    tolX
    je vais tester de modifier ceci aussi, merci.

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Points : 877
    Points
    877
    Par défaut
    re salut,

    j'ai tous essayé et toujours le meme probleme :

    => lsqnonlin ne fait pas plus d'une iteration !

    => autrement dit, il ne fait pas diminuer le contenu de "resnorm"

    pourtant je suis certain que c'est possible, car moi même à la main, j'y arrive...

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

Discussions similaires

  1. Fonction max, vname et array (suite)
    Par valesole dans le forum Débutez
    Réponses: 0
    Dernier message: 22/04/2015, 16h43
  2. Arrêt application suite à invocation d'un Timer
    Par setni dans le forum Android
    Réponses: 8
    Dernier message: 24/03/2015, 00h56
  3. [lsqnonlin] Supprimer message d'arrêt
    Par Matersss dans le forum MATLAB
    Réponses: 2
    Dernier message: 27/02/2014, 13h05
  4. Réponses: 3
    Dernier message: 06/03/2009, 19h05
  5. [Débutant] Fonction pour calcul d'une suite récurrente
    Par moimoi89 dans le forum MATLAB
    Réponses: 2
    Dernier message: 31/10/2007, 17h08

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