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 :

[fminsearch] utilisation de limit


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 80
    Points : 16
    Points
    16
    Par défaut [fminsearch] utilisation de limit
    Bonjour a tous,

    un petit soucis est a l'origine de cette visite.
    Par avance, pardon pour les accents manquants, je n'en ais pas sur le clavier.

    Pour repondre a un probleme de regression (continuite des derivees de plusieurs ordres), j utilise la fonction limit dans une fonction f a miniser via fminsearch.

    Et la, gros soucis : le programme tourne en boucle, la fonction limite me sort une expression 1309209029302/9284290. Je pense que le probleme que le probleme vient de la, mais je ne sais comment le resoudre.

    Au plaisir de vous lire,

    Xe4b4ct

  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,

    ce serait peut-être plus clair si tu nous montrais ton code?
    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 à l'essai
    Inscrit en
    Mai 2009
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 80
    Points : 16
    Points
    16
    Par défaut
    Re,

    et voici les bouts de code en question :

    - dans le .m principal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    k1=fminsearch(@EpouseNMC,0,options)
    - la fonction EpouseNMC
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function f12=EpouseNMC(k)
    syms a
    global w1 w2 usim dsim
    f1=1/w1^2*((limit((k*a^(k-1)*dsim(3)-k*(1-a)^(k-1)*usim(1)),a,1,'left')-diff([usim(1) usim(2)],1))+(limit((k*a^(k-1)*dsim(3)-k*(1-a)^(k-1)*usim(1)),a,0,'right')-diff([dsim(3) dsim(2)],1)));
    f2=1/w2^2*((limit((k*(k-1)*a^(k-2)*dsim(3)+k*(k-1)*(1-a)^(k-2)*usim(1)),a,1,'left')-diff([usim(1) usim(2) usim(3)],2).^2+(limit((k*(k-1)*a^(k-2)*dsim(3)+k*(k-1)*(1-a)^(k-2)*usim(1)),a,0,'right')-diff([dsim(3) dsim(2) dsim(1)],2).^2)));
    f12=f1+f2;
    C'est le k que je cherche a connaitre via la fonction fminsearch.

    Voila tout. En esperant que cela aidera.

    Xe4b4ct

  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
    A mon avis, le principal problème est que tu mélanges du calcul symbolique avec fminsearch qui est une fonction de calcul numérique. La sortie de EpouseNMC devrait être une valeur numérique et non une variable symbolique.

    De plus l'utilisation d'une fonction symbolique comme limit risque très certainement de ralentir les calculs car fminsearch doit faire appel de nombreuses fois à EpouseNMC.
    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 à l'essai
    Inscrit en
    Mai 2009
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 80
    Points : 16
    Points
    16
    Par défaut
    Bonsoir Magelan,

    desole pour le retard a la reponse, mais le WE reste sacre et j ai eu pas mal de boulot aujourd'hui.

    Oui, vous avez raison, le probleme vient de l'utilisation d une forme symbolique dans une fminsearch.

    Je me permets de vous solliciter pour savoir si :
    - il existe un autre moyen de calculer les limites des derivees premieres et secondes (f1 et f2), - je pense ici a passer par des vecteurs plutot que par des fonctions ...
    - un equivalent de fminsearch en symbolique, - je seche sur ce sujet.

    A suivre, mais ce soucis d'optimisation commence a me prendre du temps

    Mathieu

  6. #6
    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
    Bonjour,

    il existe un autre moyen de calculer les limites des derivees premieres et secondes (f1 et f2), - je pense ici a passer par des vecteurs plutot que par des fonctions
    Oui, par différence finie. C'est d'ailleurs ce que font les fonctions fminunc et fminconc par défaut

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 80
    Points : 16
    Points
    16
    Par défaut pa d amelioration avec double
    Bonjour a tous,

    de retour apres quelques temps.

    J'ai essaye d ajouter la fonction double (voir code) mais ca ne marche toujours pas: aucun message d'erreur mais l optimisation tourne en boucle ou ne se fait pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function f12=EpouseNMC(k)
    syms a
    global w1 w2 usim dsim
    f1=double(1/w1^2*((limit((k*a^(k-1)*dsim(3)-k*(1-a)^(k-1)*usim(1)),a,1,'left')-diff([usim(1) usim(2)],1))+(limit((k*a^(k-1)*dsim(3)-k*(1-a)^(k-1)*usim(1)),a,0,'right')-diff([dsim(3) dsim(2)],1))));
    f2=double(1/w2^2*((limit((k*(k-1)*a^(k-2)*dsim(3)+k*(k-1)*(1-a)^(k-2)*usim(1)),a,1,'left')-diff([usim(1) usim(2) usim(3)],2).^2+(limit((k*(k-1)*a^(k-2)*dsim(3)+k*(k-1)*(1-a)^(k-2)*usim(1)),a,0,'right')-diff([dsim(3) dsim(2) dsim(1)],2).^2))));
    f12=f1+f2;
    Des idees ?

  8. #8
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 881
    Points : 3 429
    Points
    3 429
    Par défaut
    Citation Envoyé par xe4b4ct Voir le message
    ...mais l optimisation tourne en boucle ou ne se fait pas.
    c'est pas très explicite tout ça
    quel sortie d'optimisation as tu ?

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 80
    Points : 16
    Points
    16
    Par défaut
    Bonjour a tous,

    j'ai essaye avec un nouveau code pour la fonction EpouseNMC

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function f12=EpouseNMC(k)
    syms a k
    global w1 w2 usim dsim
    f1=vpa(1/w1^2*((limit((k*a^(k-1)*dsim(3)-k*(1-a)^(k-1)*usim(1)),a,1,'left')-diff([usim(1) usim(2)],1))+(limit((k*a^(k-1)*dsim(3)-k*(1-a)^(k-1)*usim(1)),a,0,'right')-diff([dsim(3) dsim(2)],1))));
    f2=vpa(1/w2^2*((limit((k*(k-1)*a^(k-2)*dsim(3)+k*(k-1)*(1-a)^(k-2)*usim(1)),a,1,'left')-diff([usim(1) usim(2) usim(3)],2).^2+(limit((k*(k-1)*a^(k-2)*dsim(3)+k*(k-1)*(1-a)^(k-2)*usim(1)),a,0,'right')-diff([dsim(3) dsim(2) dsim(1)],2).^2))));
    f12=f1+f2;
    Et la, le message d'erreur est le suivant:
    The following error occurred converting from sym to double:
    Error using mupadmex
    Error in MuPAD command: DOUBLE cannot convert the input expression
    into a double array.
    If the input expression contains a symbolic variable, use the VPA
    function instead.
    
    Error in fminsearch (line 191)
    fv(:,1) = funfcn(x,varargin{:});
    
    Error in inter_inter_k (line 103)
                            k1=fminsearch(@EpouseNMC,1,options)
    Je commence a être dans mes derniers retranchement du peu de compétences en MATLABet programmation.

    Au plaisir de vous lire et de répondre a vos questions pour résoudre ce soucis.

  10. #10
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 881
    Points : 3 429
    Points
    3 429
    Par défaut
    déjà je vois un problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function f12=EpouseNMC(k)
    syms a k
    k est une variable interne de ta fonction ou un paramètre de celle ci ??
    là tu écrases le paramètre passé à ta fonction par une variable symbolique

  11. #11
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 80
    Points : 16
    Points
    16
    Par défaut
    Bonjour le fab,

    merci pour cette premiere piste.
    Code change, nouveau lancement du code principal.

    Plus de message d'erreur mais l optimisation est tres lente voir ne se fait pas: toujours busy depuis 10 minutes, mais sans message d'erreurs.

    D'autres pistes ...

  12. #12
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 881
    Points : 3 429
    Points
    3 429
    Par défaut
    que met tu dans tes options ?
    je te suggère de rajouter 'display','iter' à minima pour y voir plus clair

  13. #13
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 80
    Points : 16
    Points
    16
    Par défaut
    les options sont :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    options=optimset('TolFun',1e-10,'TolX',1e-10,'MaxFunEvals',50000,'MaxIter',50000);
    Des options qui marchent tres bien pour de nombreux codes deja ecrits.

    Voila

  14. #14
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 80
    Points : 16
    Points
    16
    Par défaut
    Merci pour ce coup de main, j ai découvert un truc avec 'Display','iter'

    Après deux itérations, la valeur de la fonction est -Inf ... donc le code tourne en boucle et s'enfonce plus bas.

    Je pense qu'il y a une erreur dans la fonction, mais laquelle ?

    Edit: modifie pour attentat a l orthographe

    Pour plus de transparence, ce que ca rend:

     Iteration   Func-count     min f(x)         Procedure
         0            1          15.1485         
         1            2             -Inf         initial simplex
         2            4             -Inf         contract outside
         3            7             -Inf         shrink
         4           10             -Inf         shrink
         5           13             -Inf         shrink
         6           16             -Inf         shrink
         7           19             -Inf         shrink
         8           22             -Inf         shrink
         9           25             -Inf         shrink
        10           28             -Inf         shrink

  15. #15
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 881
    Points : 3 429
    Points
    3 429
    Par défaut
    salut

    as tu testé (manuellement dans la MCW) ta fonction EpouseNMC sur des valeurs de K (pour vérifier que la sortie soit valide)

    cette fonction a t'elle des contraintes (kmin, kmax, ....)
    si oui tu peux t'orienter vers fmincon plutôt

    Des options qui marchent tres bien pour de nombreux codes deja ecrits.
    oui enfin ça, ça veut rien dire !!
    ces options dépendent beaucoup de la fonction à optimiser
    le mieux est de laisser dans un premier temps les option par défaut en mettant l'option display (tu peux aussi aller voir l'option plotfcn) et ensuite, éventuellement, on modifies les paramètres d'optimisation en fonction de ce que l'on constate (en général soit une optimisation qui sort trop vite (et pas assez précisément) soit au contraire une optimisation interminable)

    Fabien

  16. #16
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 80
    Points : 16
    Points
    16
    Par défaut
    Bonjour Fabien,

    Merci pour tes conseils.

    Bilan du test manuel (je perds mes bases de bon sens, desole) : la fonction donne des sorties numeriques pour k >=1.
    Pour d autres valeurs, c'est NaN ou -Inf.

    Je pense:
    - tester les valeurs de k problematiques,
    - les interdire via une option dans la fonction d optimisation (si vous avez une idee pour le faire).

    Merci a tous de prendre de votre temps pour m'aider.

    Mathieu

  17. #17
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 881
    Points : 3 429
    Points
    3 429
    Par défaut
    Citation Envoyé par xe4b4ct Voir le message
    - les interdire via une option dans la fonction d optimisation (si vous avez une idee pour le faire).
    là je pense qu'il va falloir changer de fonction -> fminbnd, fmincon ...

  18. #18
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 80
    Points : 16
    Points
    16
    Par défaut Nouveaux essais
    Re-bonjour,

    voici les nouveaux avancements:

    • avec la fonction fminbnd


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    k1=fminbnd(@EpouseNMC,2,10^1000,options)
    Error using fprintf
    Function is not defined for 'sym' inputs.
    
    Error in fminbnd (line 228)
        fprintf('%5.0f   %12.6g %12.6g %s\n',funccount,xf,fx,procedure)
    
    Error in inter_inter_k (line 105)
                            k1=fminbnd(@EpouseNMC,2,10^1000,options)
    
    • avec la fonction fmincon: je vais galerer severement a zapper les valeurs A et b presentees dans l'aide et qui n'ont pas lieu d etre utilisees ici, avant d utiliser les bornes superieure et inferieure pour k.


    On approche cependant de la resolution du probleme ...

  19. #19
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 881
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 881
    Points : 3 429
    Points
    3 429
    Par défaut
    1/ je pense qu'il faut que tu t'assure que la sortie de ta fonction ne soit pas symbolique du tout ! est ce vraiment le cas ?
    parce que ne vois pas pourquoi tu n'aurais pas le droit d'utiliser du symbolique à l’intérieur de ta fonction, tant que la sortie est un double

    2/ rien de plus simple, tu met des vecteurs vide à la place de A et b : []

    remarque : dans les bornes tu peux mettre inf à la place de 10^1000, ça reviens au même

  20. #20
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 80
    Points : 16
    Points
    16
    Par défaut
    Bonjour Fabien,

    pour vous repondre:
    1/ la fonction n'est plus symbolique, enfin j en suis presque persuade: la valeur de sortie est un nombre. mais si il y a un test pour en etre sur, je veux bien le faire.
    2/ merci pour l'astuce.

    Les meilleurs essais ont ete obtenus par ces codes:
    • Code principal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                            k1=fminsearch(@EpouseNMC,10,options);
    • Code secondaire - fonction EpouseNMC:

    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
    26
    27
    28
    function f12=EpouseNMC(k)
    syms a
    global w1 w2 usim dsim
        %f1=vpa(1/w1^2*((abs(limit((k*a^(k-1)*dsim(3)+k*(1-a)^(k-1)*usim(1)),a,1,'left')-diff([usim(1) usim(2)],1)))+abs((limit((k*a^(k-1)*dsim(3)+k*(1-a)^(k-1)*usim(1)),a,0,'right')-diff([dsim(3) dsim(2)],1)))));
        %f2=vpa(1/w2^2*((abs(limit((k*(k-1)*a^(k-2)*dsim(3)+k*(k-1)*(1-a)^(k-2)*usim(1)),a,1,'left')-diff([usim(1) usim(2) usim(3)],2)).^2+(abs(limit((k*(k-1)*a^(k-2)*dsim(3)+k*(k-1)*(1-a)^(k-2)*usim(1)),a,0,'right')-diff([dsim(3) dsim(2) dsim(1)],2).^2)))));
        %f12=f1+f2;
     
    if k>2
    % Limite interpolation    
    i_lim1down=limit((k*a^(k-1)*dsim(3)-k*(1-a)^(k-1)*usim(1)),a,0,'right');
    i_lim1up=limit((k*a^(k-1)*dsim(3)-k*(1-a)^(k-1)*usim(1)),a,1,'left');
    i_lim2down=limit((k*(k-1)*a^(k-2)*dsim(3)+k*(k-1)*(1-a)^(k-2)*usim(1)),a,0,'right');
    i_lim2up=limit((k*(k-1)*a^(k-2)*dsim(3)+k*(k-1)*(1-a)^(k-2)*usim(1)),a,1,'left');
     
    % Limite donnees
    d_lim1down=diff([dsim(3) dsim(2)],1);
    d_lim1up=diff([usim(1) usim(2)],1);
    d_lim2down=-diff([dsim(3) dsim(2) dsim(1)],2);
    d_lim2up=-diff([usim(1) usim(2) usim(3)],2);
     
    f1=1/w1^2*vpa((i_lim1down-d_lim1down).^2+(i_lim1up-d_lim1up).^2);
    f2=1/w2^2*vpa((i_lim2down-d_lim2down).^2+(i_lim2up-d_lim2up).^2);
    f12=f1+f2;
    else
        f12=Inf
    end
     
    end
    Qui fait la meme chose que le precedent, mais en plus detaille.

    J ai utiliser une astuce on contraignant k dans la fonction a optimiser. Ca va eut etre en faire bondir cetrains.

    Et les resultats sont cela: la minimisation reduit toujours k au minimum a chaque fois. Et ce n'est pas ca. J ai verifie le calcul des derivees, ils sont bons.

    Je pense qu'ils un soucis quelque part dans mes calculs. Je les reprends et je vous tiens au courant.
    Libre a vous de proposer d autres idees lumineuses.

    Mathieu

Discussions similaires

  1. Utilisation et limitation de la Fonction Copy()
    Par Jinx_ dans le forum Langage
    Réponses: 4
    Dernier message: 30/01/2010, 10h08
  2. utilisation de LIMIT
    Par kawther dans le forum Langage
    Réponses: 1
    Dernier message: 16/04/2007, 01h03
  3. utilisation du LIMIT
    Par vanou dans le forum Requêtes
    Réponses: 2
    Dernier message: 28/03/2007, 12h06
  4. [ Hibernate ] Utilisation de limit possible ?
    Par cicolas dans le forum Hibernate
    Réponses: 2
    Dernier message: 13/06/2006, 11h29

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