Prblème Matlab: fmincon

Résolu/Fermé
Jaouad - 24 mars 2009 à 11:24
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 31 mars 2009 à 08:23
Bonjour,

J'ai un problème avec la fonction fmincon de matlab, j'ai le message d'erreur suivant:

??? Error using ==> fmincon
FMINCON cannot continue because user supplied objective function failed with the following error:
Error using ==> LogGarch_Student
Too many output arguments.

Pourtant ma fonction LogGarch_Student ne retourne qu'un seul scalaire!

Merci pour votre aide

7 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
24 mars 2009 à 14:48
Salut.
Donne nous ta fonction alors, et l'appel à fmincon.
1
FouadSami Messages postés 11 Date d'inscription mardi 24 mars 2009 Statut Membre Dernière intervention 30 mars 2009
24 mars 2009 à 15:12
***je suis nouveau sur le forum, j'ai peut être pas envoyer la réponse là où il fallait ! ***

Bonjour Char Snipeur,

- L'appel à fmincon est le suivant (dans une boucle):

[ coefficient( i , : ) , LogLik , verif( i ) , OUTPUT ] = fmincon( 'LogGarch_Norm' , condini ,[],[],[],[],LB,UB,[],OPTIONS ) ;

- La fonction à optimiser est:

[ loglikelihood ] = LogGarch_Norm( parameter )

avec : loglikelihood = ( nobs / 2 ) * log( 2 * pi ) + 0.5 * sum( log( h ) ) + 0.5 * sum( ( ( rdt - m ) .^ 2 ) ./ h )

parameter = [ m a0 a1 b1 ]

a0 a1 et b1 interviennent dans h

rdt est une variable globale définie dans un autre programme ( un vecteur nobs*1)

Bien cordialement.

Jaouad
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
24 mars 2009 à 16:35
J'avoue que j'en reste un peu dubitatif... Deux tests à te proposer :
[ coefficient( i , : ) , LogLik , verif( i ) , OUTPUT ] = fmincon( @LogGarch_Norm , condini ,[],[],[],[],LB,UB,[],OPTIONS ) ;
D'après l'exemple trouvé sur le site matlab, et une déclaration de fonction sans crochet :
loglikelihood = LogGarch_Norm( parameter )
1
FouadSami Messages postés 11 Date d'inscription mardi 24 mars 2009 Statut Membre Dernière intervention 30 mars 2009
24 mars 2009 à 17:22
J'ai essayé ta proposition, mais ça ne change rien !

Ce qui est étonnant c'est que lorsque je laisse tomber les contraintes et j'optimise avec fminsearch, le problème ne se pose pas, mais sans les contraintes c'est autre chose.

Je vais continuer à chercher de mon côté, j'espère que ce n'est pas un problème interne à matlab. j'ai découvert qu'il a une faille (0^0=1) mais j'ai pas envie d'en trouver d'autres.

Merci quand même pour ton aide

A+
0
FouadSami Messages postés 11 Date d'inscription mardi 24 mars 2009 Statut Membre Dernière intervention 30 mars 2009
24 mars 2009 à 15:05
Bonjour Char Snipeur,

- L'appel à fmincon est le suivant (dans une boucle):

[ coefficient( i , : ) , LogLik , verif( i ) , OUTPUT ] = fmincon( 'LogGarch_Norm' , condini ,[],[],[],[],LB,UB,[],OPTIONS ) ;

- La fonction à optimiser est:

[ loglikelihood ] = LogGarch_Norm( parameter )

avec : loglikelihood = ( nobs / 2 ) * log( 2 * pi ) + 0.5 * sum( log( h ) ) + 0.5 * sum( ( ( rdt - m ) .^ 2 ) ./ h )

parameter = [ m a0 a1 b1 ]

a0 a1 et b1 interviennent dans h

rdt est une variable globale définie dans un autre programme ( un vecteur nobs*1)

Bien cordialement.

Jaouad
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
24 mars 2009 à 15:46
LogGarch_Norm doit retourner un scalaire, es tu tu sur que c'est le cas ? comme tu dit que rdt est un vecteur...
affiche la taille pour être sur.
Si tu utilise LogGarch_Norm directement est-ce que l'erreur apparaît ?
0
FouadSami Messages postés 11 Date d'inscription mardi 24 mars 2009 Statut Membre Dernière intervention 30 mars 2009
24 mars 2009 à 16:00
Ce n'est pas le fait que rdt soit un vecteur qui pose problème, parce que je fait, après transformation, la somme de ses éléments et donc j'ai un scalaire.

j'ai bien exécuté la fonction LogGarcj_Norm toute seule et elle me retourne un scalaire ( valeur négative avec virgule).

Merci Char Snipeur pour tes efforts !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
24 mars 2009 à 19:11
Salut

Je passe juste vite fait pour signaler un truc que je comprends pas trop...

message 0
Error using ==> LogGarch_Student
Too many output arguments.
message 2
[ coefficient( i , : ) , LogLik , verif( i ) , OUTPUT ] = fmincon( 'LogGarch_Norm' , condini ,[],[],[],[],LB,UB,[],OPTIONS ) ;

- La fonction à optimiser est:

[ loglikelihood ] = LogGarch_Norm( parameter )
Y a comme un truc pas cohérent...

Bonne soirée
0
FouadSami Messages postés 11 Date d'inscription mardi 24 mars 2009 Statut Membre Dernière intervention 30 mars 2009
30 mars 2009 à 19:42
Salut Sacabouffe,

Tu dis qu'il y a une incohérence. T'as raison, LogGarch_Norm ou LogGarch_Student !!!

Ce sont deux fonctions objectif. Je voulais optimiser l'une l'autre.

Merci pour la remarque.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
25 mars 2009 à 08:16
Bien vu Sacabouffe !
0^0 = 1... pour toi ça devrais donné quelle valeur ? moi, je dirai 1 ou NAN au pire. Si tu dit 0^0 c'est zéro multiplier par zéro zéro fois (c'est à dire que tu ne fais rien), tu as bien 1.
0
FouadSami Messages postés 11 Date d'inscription mardi 24 mars 2009 Statut Membre Dernière intervention 30 mars 2009
30 mars 2009 à 19:45
A non Char Snipeur, 0^0 ne fait pas 1. Preuve: 0^0 = 0^(a-a) = 0^(a) / 0^(a) = 0/0 qui indéfini, donc NaN.

Pour une fois t'as pas raison ;)
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297 > FouadSami Messages postés 11 Date d'inscription mardi 24 mars 2009 Statut Membre Dernière intervention 30 mars 2009
31 mars 2009 à 08:23
cf message de sacabouffe.
Avec ta démonstration, si tu pose b=0^a
b/b=1;
Ce que je dis, c'est que si 0^0 ne donne pas NaN, une des meilleurs valeurs pour continuité, c'est 1.
0
Sacabouffe Messages postés 9427 Date d'inscription dimanche 19 août 2007 Statut Membre Dernière intervention 29 mai 2009 1 832
25 mars 2009 à 10:31
Salut

Comme ça avant de le faire, j'aurais dit que Matlab donnerait NaN vu qu'en toute rigueur c'est pas défini (exp(0*(log(0)), je note log la fonction logarithme népérien pour garder la cohérence avec Matlab), mais après avoir essayé, il donne 1. Donc apparemment la définition de 0^0 pour Matlab a été prise comme celle du prolongement par continuité en 0 de la fonction x^x.
lim_{x→0} x*log(x)=0
Donc
lim_{x→0} exp(x*log(x))=1

Bonne journée
0