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] problème d'optimisation


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 12
    Points
    12
    Par défaut [lsqnonlin] problème d'optimisation
    Bonjour,

    j'ai fait le programme d'optimisation suivant mais je n'arrive pas à avoir de résultat:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    function F = myfun(lamda)
    %--------------------------------------------------------------------------
    % @description:	Attempt to estimate the parameter of the market price 
     
    %model of yields. We do this by using curve fitting to the observed data.
    % 
    %	Xdata: 	  - vector of times to maturity .
    %	ydata	  - vector of observed yields-to-maturity that correspond to
    %				the matching value by the yields-to-maturity correspinf to 
    %               the vasicek model wich has the following form:
    % R(T) = R(alpha) +(r0 - (beta - R(alpha)) *
    % (1- exp (- beta*T))/ (beta *T) + 
    %  ((sigma^2)*(1- exp (- beta*T))^2)/(4*(beta^3)*T).
    % 
    %
    %where R(alpha)= (beta - ((lamda * sigma)/ alpha)- ((sigma^2)/ (2*(alpha^2)))
    % and T is time to maturity.
    % 
    %				xdata	= [0.5 1 2 3 5 7 10];
    %				ydata	=[0.079 0.0782 0.0791 0.0793 0.0791 0.0802 0.0798];
    %--------------------------------------------------------------------------				
     
     
    xdata = [0.5 1 2 3 5 7 10];
    ydata = [0.079 0.0782 0.0791 0.0793 0.0791 0.0802 0.0798];
     
    alpha = 0.035364; 
    beta = 0.0713;
    sigma = 0.0110;
    r = 0.012;
     
     
    Ralpha =@(lamda) (beta -(lamda*sigma)/alpha)-(sigma.^2)/(2*(alpha.^2));
     
    F =@(lamda,xdata,alpha,beta,sigma,r) Ralpha(lamda) +...
    ((1-exp(-beta*xdata))./(beta*xdata))*(r - Ralpha(lamda))+...
    ((sigma.^2)./(4*(beta.^3)*xdata).*((1-exp(-xdata)).^2));
     
     
    lamda0 = - 0.03; %  initialisation of the parameter lamda%
     
    [lamda,resnorm] = lsqnonlin(@myfun,lamda0);
    mais en tournant le programme le message d'erreur suivant s'affiche
    ??? Error using ==> blsprice at 98
    Volatilities cannot be negative.
    
    Error in ==> myfun at 2
    z = blsprice(36.12,35,0.07,7/52,x) - 2.15;
    Error in ==> lsqnonlin at 203
                initVals.F = feval(funfcn{3},xCurrent,varargin{:});
    
    Error in ==> fit2 at 44
    [lamda,resnorm] = lsqnonlin(@myfun,lamda0);
    
    Caused by:
        Failure in initial user-supplied objective function evaluation. LSQNONLIN cannot continue.
    je n'ai pas compris où est le problème. est ce que vous pouvez m'aider.

  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,

    J'ai l'impression que la ligne de code pointe par le message d'erreur :
    Citation Envoyé par mounabs Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    z = blsprice(36.12,35,0.07,7/52,x) - 2.15;
    N'apparaît pas dans le code de myfun. Donc lsqnonlin n'utilise peut-être pas la bonne fonction myfun

    Que renvoie :
    ?
    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
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par tallent_e Voir le message
    Ah ! je vois que ton message est aussi sur Wilmott.
    Polter t'y apporte une réponse qui a du sens ....
    sincèrement je n'est rien compris de son message mais j'ai fait une modification sur le code en changeant la fonction utilisée de lsqnonlin a LSQCURVEFIT car mon objectif c'est le curve fitting à une courbe réelle. j'ai lu le help de la fonction et je l'ai suivit à la lettre . le code est alors comme suit
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    function F = myfun(x,xdata)
     
    %--------------------------------------------------------------------------
    % @description:	Attempt to estimate the parameter of the market price 
     
    %model of yields. We do this by using curve fitting to the observed data.
    % 
    %	Xdata: 	  - vector of times to maturity .
    %	ydata	  - vector of observed yields-to-maturity that correspond to
    %				the matching value by the yields-to-maturity correspinf to 
    %               the vasicek model wich has the following form:
    % ydata = R(alpha) +(r0 - (beta - R(alpha)) *
    % (1- exp (- beta*T))/ (beta *T) + 
    %  ((sigma^2)*(1- exp (- beta*T))^2)/(4*(beta^3)*T).
    % 
    %
    %where R(alpha)= (beta - ((lamda * sigma)/ alpha)- ((sigma^2)/ (2*(alpha^2)))
    % and T is time to maturity.
    % 
    %				xdata	= [0.5 1 2 3 5 7 10];
    %				ydata	=[0.079 0.0782 0.0791 0.0793 0.0791 0.0802 0.0798];
    %--------------------------------------------------------------------------				
     
    alpha = 0.035364; 
    beta = 0.0713;
    sigma = 0.0110;
    taux = 0.012;
    xdata = [0.5 1 2 3 5 7 10];
    ydata = [0.079 0.0782 0.0791 0.0793 0.0791 0.0802 0.0798];
     
    F =(beta -(x *sigma)/alpha)-(sigma.^2)/(2*(alpha.^2))+...
    ((1-exp(-beta*xdata))./(beta*xdata))*(taux - (beta -(x *sigma)/alpha)-(sigma.^2)/(2*(alpha.^2)))+...
    ((sigma.^2)./(4*(beta.^3)*xdata).*((1-exp(-xdata)).^2));
     
     
     
     
    x0 = - 0.03; %  initialisation of the parameter lamda%
     
    x = lsqcurvefit(@myfun,x0,xdata,ydata);
    mais j'ai toujours un message d'erreur compréhensible maintenant mais je ne comprend pas le pourquoi car ce qu'il affiche dans le message d'erreur je l'ai fait :
    ??? Input argument "x" is undefined.
    
    Error in ==> fit2 at 31
    F =(beta -(x *sigma)/alpha)-(sigma.^2)/(2*(alpha.^2))+...
    que faire ?

  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
    salut!
    voici la syntaxe qu'il faut utiliser:
    [x,resnorm] = lsqcurvefit(@(parametresInitiaux,xdata),@calculs,parametresInitiaux,xdata,ydata)
    1°) parametresInitiaux est un vecteur qui contient les varaibles que tu veux optimiser
    2°) xdata est le vecteur "abscisse" des données que tu veux fitter
    3°) ydata est le vecteur "ordonnées" des données que tu veux fitter
    X sera ton résultat (les paramètres optimisés)
    je ne peux pas t'en dire beaucoup plus car je ne me rappel pas de tous les details mais je pense qu'avec ceci tu devrais y arriver.
    A+


    ps: quand je regarde ton code je vois que tu n'as pas utilisé cette syntaxe donc essaie avec celle ci


    EDIT:
    dans ton message d'erreur il y a marqué que la variable x n'a pas été définie donc je pense que c'est pas une erreur avec la syntaxe de lsqnonlin mais plutot que tu n'as pas donné de valeur numerique à "x"

    => tu ne voulais pas enployé la variable "xdata" plutot que "x" comme tu l'as fait ??

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Une question: ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x0 = - 0.03; %  initialisation of the parameter lamda%
     
    x = lsqcurvefit(@myfun,x0,xdata,ydata);
    Est-il contenu dans le même .m que le reste?
    Si c'est le cas, je t'invite à regarder ce message

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Bonjour,

    Une question: ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x0 = - 0.03; %  initialisation of the parameter lamda%
     
    x = lsqcurvefit(@myfun,x0,xdata,ydata);
    Est-il contenu dans le même .m que le reste?
    Si c'est le cas, je t'invite à regarder ce message
    oui tout le code est dans le même fechier .m. j'ai vu le message que vous m'avez indiqué. mais je n'est pas trouvé une solution pour mon problème

  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
    as tu testé avec cette syntaxe (celle que je t'ai dis plus haut) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [x,resnorm] = lsqcurvefit(@(parametresInitiaux,xdata),@calculs,parametresInitiaux,xdata,ydata)

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mounabs Voir le message
    oui tout le code est dans le même fechier .m. j'ai vu le message que vous m'avez indiqué. mais je n'est pas trouvé une solution pour mon problème
    Et qu'as-tu essayé de faire? Ce n'est pas compliqué d'appliquer ce qui est dit dans mon message si?

  9. #9
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Et qu'as-tu essayé de faire? Ce n'est pas compliqué d'appliquer ce qui est dit dans mon message si?
    oui je l'ai lu.
    mon équation est bien défini.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    F =(beta -(x *sigma)/alpha)-(sigma.^2)/(2*(alpha.^2))+...
    ((1-exp(-beta*xdata))./(beta*xdata))*(taux - (beta -(x *sigma)/alpha)-(sigma.^2)/(2*(alpha.^2)))+...
    ((sigma.^2)./(4*(beta.^3)*xdata).*((1-exp(-xdata)).^2));
    et j'ai bien initialisé le paramètre recherché 'x' par x0 = - 0.03.
    ou est le problème alors.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Je me répète:
    Citation Envoyé par Winjerome Voir le message
    ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x0 = - 0.03; %  initialisation of the parameter lamda%
     
    x = lsqcurvefit(@myfun,x0,xdata,ydata);
    Est contenu dans le même .m que le reste
    Et plus précisément dans la fonction myfun elle-même
    Dernière modification par Invité ; 14/12/2011 à 15h45.

  11. #11
    Membre à l'essai
    Inscrit en
    Janvier 2010
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 23
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Je me répète:

    Et plus précisément dans la fonction myfun elle-même
    désole mais je n'est pas compris ce que vous voulez dire

Discussions similaires

  1. Problème d'optimisation combinatoire. Enfin je crois
    Par Arpivu dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 30/07/2007, 11h01
  2. algo problème d'optimisation (trajet)
    Par gugumon dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 22/06/2006, 17h35
  3. Réponses: 9
    Dernier message: 27/04/2006, 15h02
  4. Problème d'optimisation
    Par jozes dans le forum Langage
    Réponses: 8
    Dernier message: 15/02/2006, 15h41
  5. Recherche de pistes pour un problème d'optimisation
    Par TiKeuj dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 15/08/2005, 15h50

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