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 :

Appel de variable dans une fonction déjà défini dans un prog principal [Débutant]


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 127
    Par défaut Appel de variable dans une fonction déjà défini dans un prog principal
    (Re-)Bonjour à tout le monde,

    Voilà j'ai un autre problème, enfin disons que j'aimerai tester dans une première étape la qualité de l'optimisation avec ou sans contrainte sous Matlab quand je connais les vraies valeurs.

    1er problème :

    Je dispose d'un vecteur de taille n appelé u.
    J'ai une fonction K dépendant du temps t et de cette valeur u qui elle est fixée dans une boucle quand je cherche le minimum de K.

    J'ai crée ma fonction 'fun' K(t) mais elle dépend de u aussi (en fait de u(i) pour être précis).
    Le problème c'est que je n'arrive pas à mettre tout ça en place pour avoir le minimum de ma fonction K et surtout la valeur de t pour laquelle j'attends ce minimum.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function K=mygen(t)
     
    K=((u-m1)./S11)-t.*(S12./S11).*m1+t.*m2+(1./2)*((((u-m1)./S11)-t.*(S12./S11).^2).*S11+2.*((u-m1)./S11)-t.*(S12./S11).*t.*S12+(t.^2).*S22);
    que j'appelle là dedans:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i=1:n
        t0=0;
        u=u(i);
        [t(i),fval(i)] = fminunc(@mygen,t0);
    end
    2ème problème:

    Dans la réalité je ne peux que connaitre K(s,t) <- matrice et je vais chercher pas que le minimum, toujours pour u donné, de K(s,t).
    Je cherche s et t tel que la dérivée première de K(s,t) en s soit égale à u(i) et la dérivée seconde de K(s,t) en t soit égale à 0.

    Je n'arrive pas à formaliser le problème sous Matlab ...


  2. #2
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 127
    Par défaut
    Bonjour tout le monde,

    Alors j'ai remarqué que le problème venait de ma fonction 'fun' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function K=mygen(t)
     
    K=((10-m1)./S11)-t.*(S12./S11).*m1+t.*m2+(1./2).*((((10-m1)./S11)-t.*(S12./S11).^2).*S11+2.*((10-m1)./S11)-t.*(S12./S11).*t.*S12+(t.^2).*S22);
    Car dedans j'utilise des variables que j'ai définis dans mon code principal mais je ne sais pas comment dire à l'ordinateur que m1 = l'ancien m1 sans avoir à retaper la valeur à chaque fois.

    Voici le code erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ??? Undefined function or variable 'm1'.
     
    Error in ==> mygen at 3
    K=((10-m1)./S11)-t.*(S12./S11).*m1+t.*m2+(1./2).*((((10-m1)./S11)-t.*(S12./S11).^2).*S11+2.*((10-m1)./S11)-t.*(S12./S11).*t.*S12+(t.^2).*S22);
     
    Error in ==> fminunc at 184
       f = feval(funfcn{3},x,varargin{:});
    Du coup si j'arrive à comprendre ça j'aurai résolu mon problème qui n'est pas lié à fmincon ou fminunc à prirori.

    Hollow

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2007
    Messages
    979
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 979
    Par défaut
    salut,

    une solution serait de tout mettre dans un seul fichier:

    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
     
     
    %-- Declaration/affectation des variables
    m1 = 1; % exemple
    % ... le reste des variables
     
    %-- Ta fonction MYGEN : elle verra les variables m1, ...
    mygen = @(t)( ((10-m1)./S11)-t.*(S12./S11).*m1+t.*m2+ ...
    (1./2).*((((10-m1)./S11)-t.*(S12./S11).^2).*S11+  ...
    2.*((10-m1)./S11)-t.*(S12./S11).*t.*S12+(t.^2).*S22) );
     
     
    %-- La boucle 
    for i=1:n
        t0=0;
        u=u(i);
        [t(i),fval(i)] = fminunc(@mygen,t0);
    end
    ++ bonne chance

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 127
    Par défaut
    Bonjour,

    Je vais essayer.
    Je savais pas que c'était possible

    Merci encore je vous tiens au courant!

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 127
    Par défaut
    J'ai donc essayer, ça me parait la bonne technique mais j'ai encore un problème de code apparemment :

    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
     
     
    function f=myfunction(u,m1,m2,S11,S12,S21,S22)
     
    ...
     
    Tf=zeros(n,1);
    fval=zeros(n,1);
     
    %-- Function MYGEN : elle verra les variables m1, ...
    mygen = @(t)(((u-m1)./S11)-t.*(S12./S11).*m1+t.*m2+(1./2).*((((u-m1)./S11)-t.*(S12./S11).^2).*S11+2.*((u-m1)./S11)-t.*(S12./S11).*t.*S12+(t.^2).*S22));
     
     
    %-- La boucle 
    for i=1:n
        t0=0;
        u=u(i);
        [Tf(i),fval(i)] = fminunc(@mygen,t0);
    end
    Malheureusement j'ai ce message d'erreur lorsque je lance la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ??? Error: File: myfunction.m Line: 118 Column: 32
    "mygen" was previously used as a variable,
    conflicting with its use here as the name of a function or command.
    Et de plus, je penses qu'il serait préférable pour moi de mettre mygen=@t dans la boucle car cela dépend de u(i) aussi.

    Hollow

  6. #6
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2007
    Messages
    979
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 979
    Par défaut
    L'operateur '@' fourni un identifiant (handler) de la fonction. Dans notre cas, on dispose déja de cela, c'est mygen :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    % ...
    [Tf(i),fval(i)] = fminunc(mygen,t0); % Sans @
    % ...
    Sinon, je ne vois pas l'intérêt de ta boucle FOR ... Tu minimise la même fonction en boucle.

    Edit :

    Si tu veux que u change dans ta fonction (donc dans ta boucle) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    %-- La boucle 
    for i=1:n
        t0=0;
        u=u(i);
        %--  Sinon, la fonction MYGEN ne mettra pas à jour sa definition ;)
        mygen = @(t)(((u-m1)./S11)-t.*(S12./S11).*m1+t.*m2+(1./2).*((((u-m1)./S11)-t.*(S12./S11).^2).*S11+2.*((u-m1)./S11)-t.*(S12./S11).*t.*S12+(t.^2).*S22));
        [Tf(i),fval(i)] = fminunc(mygen,t0);
    end
    ++

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

Discussions similaires

  1. Objet existant reconnu dans une fonction mais pas dans une autre
    Par Jiyuu dans le forum Général Python
    Réponses: 0
    Dernier message: 20/09/2011, 18h19
  2. Appel de variables d'une fonction dans une autre fonction
    Par black cat747 dans le forum Interfaces Graphiques
    Réponses: 13
    Dernier message: 11/05/2010, 15h34
  3. [Dojo] Objet Dojo créé dans une fonction et utilisé dans une autre.
    Par hapalemur dans le forum Bibliothèques & Frameworks
    Réponses: 10
    Dernier message: 05/06/2009, 13h59
  4. [MySQL] Récupérer une variable d'une fonction et enregistrement dans une base de données
    Par Mikke dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 03/03/2008, 17h02
  5. appel d'une fonction qui est dans une autre page
    Par guppy33 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 02/08/2006, 12h05

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