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] ne minimise pas ou erreur de ma part? [Débutant]


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] ne minimise pas ou erreur de ma part?
    Bonjour tous,

    je suis en galere avec la fonction "lsqnonlin", il me semble que mon programme est bien fait mais la fonction ne me minimise pas l'erreur.
    J'ai donc plusieurs questions à vous posez, j'espere que vous pourrez m'aider.

    1°) la syntaxe à utiliser est bien celle ci si je souhaite avoir en sortie de residu ainsi que le vecteur de parametres de sortie?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [x,resnorm] = lsqnonlin(@myfun,vecteurEntree,-100000,+100000,1e-15)
    => dans mon repertoire j'ai fais une fonction myfun qui prend en entrée le vecteur "vecteurEntree"
    => en sortie cette fonction doit bien donner un vecteur qui est la différence entre les données experimentales et les données numerique l'on a calculé? il ne faut pas definir nous meme le residu d'apres ce que j'ai compris?
    => j'ai mis des limites car je ne veux pas que les valeurs contenues dans le vecteur soient < à -100000 et > à 100000
    => je veux que le residu en sortie de calcul soit inferieur à 1e-15

    2°) j'ai lancé mon programme avec cette syntaxe mais il ne fait que quelques iterations et me donne: residu = 1e-4 ce qui est le residu que j'avais dès le depart

    => en fait j'ai l'impression qu'il n'a pas pris en compte la donnée que je lui est filé: 1e-15 ??

    3°) vous trouverez ci dessous mon programme, peut etre que une de mes erreur viens tout simplement de la programmation
    ma fonction "myfun" est en fait un logiciel qui est lancé à partir de son .exe, avant de lancer le logiciel je réecris le fichier "data" qui lui sert pour ses calculs; une fois le calcul terminé je recupére les resultats qui se trouvent dans un fichier texte avec la fonction loadResults que j'ai fais.
    main.m
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Gammamg5si6=0.1;
    Amg5si6=-918;
    Bmg5si6=-64;
    Gammamg2si=0.2;
    Amg2si=7145;
    Bmg2si=2.4539;
    parametresInitiaux=[Gammamg5si6 Amg5si6 Bmg5si6 Gammamg2si Amg2si Bmg2si];
    normalisation=[1/Gammamg5si6 1/Amg5si6 1/Bmg5si6 1/Gammamg2si 1/Amg2si 1/Bmg2si];
    vecteurEntree=parametresInitiaux.*normalisation;
    [x,resnorm] = lsqnonlin(@myfun,vecteurEntree,-100000,+100000,1e-15)
    myfun.m
    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
     
    function F = myfun(vecteurEntree)
    Yexp=[5*10^-9 0.017];
    Gammamg5si6=0.1;
    Amg5si6=-918;
    Bmg5si6=-64;
    Gammamg2si=0.2;
    Amg2si=7145;
    Bmg2si=2.4539;
    normalisation=[Gammamg5si6 Amg5si6 Bmg5si6 Gammamg2si Amg2si Bmg2si];
    vecteurEntreeData=vecteurEntree.*normalisation;
    writeDataBase=writeDataFile(vecteurEntreeData(1),vecteurEntreeData(2),vecteurEntreeData(3)...
        ,vecteurEntreeData(4),vecteurEntreeData(5),vecteurEntreeData(6));
    if (writeDataBase==0)
        disp('error in dataBase writing');
    end
    system('monLogicielDeCalculQuiDonneResultatsTXT.exe');
    Ynum=loadResult();
    vectorOfDifferences=(Ynum-Yexp);
    F=vectorOfDifferences;
    writeDataFile.m
    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
     
    function test=writeDataFile(Gamma1,A1,B1,Gamma2,A2,B2)
    fid = fopen('dataExemple.txt','r');
    fidm = fopen('data.txt','w+');
    N = 21;
    for n = 1:N
        ligne = fgets(fid);
        fprintf(fidm,ligne);
    end
    ligne = fgets(fid);
    fprintf(fidm,'A 1.995e-28 %g %g %g 0 0 0 5 6 \n', Gamma1, A1, B1);
    ligne = fgets(fid);
    fprintf(fidm,'B 1.305e-28 %g %g %g 0 0 0 2 1 \n', Gamma2, A2, B2);
    while ~feof(fid) %fait la boucle en continu
        ligne = fgets(fid);
        fprintf(fidm, ligne);
    end
    fclose(fid);
    fclose(fidm);
    test=1;
    loadResults.m
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function NumericalData=loadResult()
    numericMeanRadius=load('RmFile.dat');
    numericVolumicFraction=load('FvFile.dat');
    numericalVector=[numericMeanRadius numericVolumicFraction];
    NumericalData=numericalVector;

  2. #2
    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 remarquer ce warning:

    Warning: Cannot solve problems with fewer equations than variables and with bounds. An error will be issued for this case in a future release.
    Ignoring bounds, using Levenberg-Marquardt method.

    je dois donc enlever les bornes? ça ne me pose pas trop de problemes mais comment dois je faire pour que la tolerance de 1e-15 soit prise en compte?

    pour le probleme de tolerence j'ai essayé cela:

    options = optimset('TolFun',1e-15);
    [x,resnorm] = lsqnonlin(@myfun,vecteurEntree,inferiorBound,superiorBound,options)

    mais ça ne change rien...

    EDIT:
    au fait pour resoudre le probleme des bornes j'ai mis non plus une valeur mais des vecteurs de bornes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    inferiorBound=ones(1,length(vecteurEntree));
    superiorBound=ones(1,length(vecteurEntree));
    inferiorBound=inferiorBound*-100000;
    superiorBound=superiorBound*100000;
    mais toujours le meme warning

  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 lsqcurvefit et fminsearch
    Bonjour tous,

    j'ai essayé avec lsqnonlin de résoudre un probleme de minimisation mais je suis en galere donc j'essai de me rabattre sur les fonctions:

    => lsqcurvefit
    => fminsearch

    le probleme est que j'ai lu l'aide de matlab et je n'ai toujours pas compris comment utiliser ces deux fonctions.

    que doit on mettre en parametre?

    1°) j'ai essayé cela pour lsqcurvefit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [x,resnorm]=lsqcurvefit(@myfun,vecteurParametreEntree)
    avec myfun une fonction qui me renvoi un residu de type "double", le probleme est que j'ai une erreur:
    => je dois avoir un 4argument, j'ai regardé l'aide et je ne sais pas quoi metre pour les deux autre arguments car je n'ai pas compris ce qu'es ce X et Y de l'aide

    2°) j'ai essayé cela pour fmeansearch
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [x,resnorm] = fminsearch(myfun(vecteurEntree),vecteurEntree)
    et voici le message d'erreur, je ne comprends pas qu'es ce que c'est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ??? Error using ==> fcnchk at 108
    FUN must be a function, a valid string expression, or an inline function object.
     
    Error in ==> fminsearch at 178
    funfcn = fcnchk(funfcn,length(varargin));
     
    Error in ==> methodeInverse at 25
    [x,resnorm] = fminsearch(myfun(vecteurEntree),vecteurEntree)
    EDIT:
    pour fminsearch j'ai peux etre trouvé la réponse. D'apres ce que j'ai lu sur le forum cette fonction ne permet que de faire de l'optimisation lineaire or moi je fais de l'optimisation non lineaire

    par contre lsqcurvefit devrait fonctionner...

  4. #4
    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
    j'ai bidouillé un peu de partout et à présent mon probleme est:

    Optimization terminated: the first-order optimality measure is less than 1e-4 times options.TolFun.

    pourtant j'ai mis une tolerence de 1e-15 et non 1e-4

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    options = optimset('TolFun',1e-15);
    [x,resnorm] = lsqnonlin(@myfun,parametresInitiaux*normalisation,xxmin,xxmax,options)

  5. #5
    Invité
    Invité(e)
    Par défaut
    À noter que ton message est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    the first-order optimality measure is less than 1e-4 times options.TolFun.
    Autrement-dit est plus petit que 1e-4 * 1e-15 = 1e-19

  6. #6
    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 tester manuellement et j'ai pu vérifier que mon residu est bien de l'ordre de 1e-4, lsqnonlin devrait donc continuer jusqu'a avoir un residu de 1e-15

    juste une chose pour la fonction "myfun":

    => la sortie de la fonction doit bien etre la difference entre mon vecteur objectif et mon vecteur reponse?

    si oui, voici ce que j'ai en sortie de myfun:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    outputMyFun =[
     
       0.000000307045000;
      -0.015354040000000]

  7. #7
    Invité
    Invité(e)
    Par défaut
    Attention, le résidus que tu obtiens à la fin et l'option TolFun (ou first-order optimality measure) que tu fixes n'ont rien à voir.
    Tu peux regarder ceci pour avoir un petit aperçu de sa signification.
    À noter que ce genre de message ne signifie pas obligatoirement qu'il y a un problème, c'est juste une indication sur les conditions de terminaison de la fonction.

  8. #8
    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 Winjerome Voir le message
    Attention, le résidus que tu obtiens à la fin et l'option TolFun (ou first-order optimality measure) que tu fixes n'ont rien à voir.
    Tu peux regarder ceci pour avoir un petit aperçu de sa signification.
    À noter que ce genre de message ne signifie pas obligatoirement qu'il y a un problème, c'est juste une indication sur les conditions de terminaison de la fonction.
    ah ok! je n'avais pas saisi cela
    j'ai pas bien compris ce que raconte le lien..., du coup comment dois je faire pour que mon optimisation ne s'arrete pas au premier pas de temps?

    => je dois utiliser une option autre que tolFun, mais laquelle? c'est tolFun qui me semblait la plus appropriée...

  9. #9
    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,

    peux-tu nous montrer ce que renvoie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    options = optimset('Display','iter','TolFun',1e-15);
    [x,resnorm] = lsqnonlin(@myfun,parametresInitiaux*normalisation,xxmin,xxmax,options)
    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.

  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
    oui, voici:


    First-Order Norm of
    Iteration Func-count Residual optimality Lambda step
    0 7 0.000235747 0 0.01
    Optimization terminated: the first-order optimality measure is less than 1e-4 times options.TolFun.


    je viens de tester avec d'autres parametres d'entree et voici ce que j'obtiens:
    pour un vecteur de depart ones(6,1)


    First-Order Norm of
    Iteration Func-count Residual optimality Lambda step
    0 7 9.4279 0 0.01
    Optimization terminated: the first-order optimality measure is less than 1e-4 times options.TolFun.

    x = 1 1 1 1 1 1
    resnorm = 9.427898949044323

    on voit clairement que le residu est superieur à 1e-4 mais pourtant le solveur s'arrete...

  11. #11
    Invité
    Invité(e)
    Par défaut
    Comme je te l'ai déjà dit dans mon dernier message, résidu obtenu et TolFun sont deux choses différentes.
    De plus lsqnonlin est une fonction de minimisation elle ne trouve pas un résidu égal à 0 à tous les coups l'exemple de la documentation te le montre clairement.

  12. #12
    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
    d'accord, merci d'avoir pris le temps de repondre.

    => connais tu une fonction "matlab" qui me permettrai de minimiser un residu ?

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par 21did21 Voir le message
    => connais tu une fonction "matlab" qui me permettrai de minimiser un residu ?
    Euh... c'est une blague?
    À ton avis, que signifie l'équation du début de sa documentation?

  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
    mdr, non c'est pas une blague

    j'ai compris que lsqnonlin est sensé faire cela, mais puisque ça ne fonctionne pas pour mon application, je voulais donc connaitre une fonction qui pourrait me faire quelque chose d'equivalent.

    de tout façon j'abandonne, je vais passer sur excel ou programmer moi meme un algo de minimisation, j'en ai marre de cette fonction pourrie


    A+ et merci tous pour votre aide

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

Discussions similaires

  1. Beuggouillage...je vois pas l'erreur
    Par Force_Rouge dans le forum C
    Réponses: 3
    Dernier message: 29/03/2006, 11h12
  2. Comprend pas une erreur
    Par vodevil dans le forum Langage
    Réponses: 3
    Dernier message: 21/01/2006, 04h00
  3. je ne trouve pas l'erreur ?
    Par nourdine dans le forum Langage
    Réponses: 7
    Dernier message: 04/01/2006, 23h51
  4. Je ne comprends pas mon erreur !
    Par oulahoup dans le forum ASP
    Réponses: 4
    Dernier message: 25/08/2005, 14h24
  5. Clé etrangere erreur 150 mais je vois pas l'erreur
    Par HurtMarley dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 03/05/2005, 16h57

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