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 :

appeler des variables en dehors d'une fonction


Sujet :

MATLAB

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 37
    Points : 33
    Points
    33
    Par défaut appeler des variables en dehors d'une fonction
    Bonjour à tous!

    J'ai défini une fonction matlab F = root2d(x) dans laquelle j'ai en fait deux fonctions F(1) et F(2) qui dépendent de x(1) et x(2)

    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
    function F = root2d(x)
     
    Rt=(3/(4*pi))^(1/3);
    vb=0.235; 
    vy=1-vb;
    TbTy=1; 
    TbyiTy=1.8;
     
    g1=(-2+(2^(1/3))*((((8*vy-(x(2)/Rt)*(3*(x(1)/Rt)^2+(x(2)/Rt)^2))/((x(1)/Rt)^3))+sqrt(4+((8*vy-(x(2)/Rt)*(3*(x(1)/Rt)^2+(x(2)/Rt)^2))/((x(1)/Rt)^3))^2))^(2/3)))/((2^(2/3))*((((8*vy-(x(2)/Rt)*(3*(x(1)/Rt)^2+(x(2)/Rt)^2))/((x(1)/Rt)^3))+sqrt(4+((8*vy-(x(2)/Rt)*(3*(x(1)/Rt)^2+(x(2)/Rt)^2))/((x(1)/Rt)^3))^2))^(1/3)));
     
    g2=(-2+(2^(1/3))*((((8*vb+(x(2)/Rt)*(3*(x(1)/Rt)^2+(x(2)/Rt)^2))/((x(1)/Rt)^3))+sqrt(4+((8*vb+(x(2)/Rt)*(3*(x(1)/Rt)^2+(x(2)/Rt)^2))/((x(1)/Rt)^3))^2))^(2/3)))/((2^(2/3))*((((8*vb+(x(2)/Rt)*(3*(x(1)/Rt)^2+(x(2)/Rt)^2))/((x(1)/Rt)^3))+sqrt(4+((8*vb+(x(2)/Rt)*(3*(x(1)/Rt)^2+(x(2)/Rt)^2))/((x(1)/Rt)^3))^2))^(1/3)));
     
    F(1)=(x(1)^2-(x(1)*g1)^2)/(x(1)^2+(x(1)*g1)^2) + (TbTy)*((x(1)^2-(x(1)*g2)^2)/(x(1)^2+(x(1)*g2)^2)) + (TbyiTy)*((x(1)^2-x(2)^2)/(x(1)^2+x(2)^2));
     
    F(2)= (TbTy)*(((x(1))*g2)/(x(1)^2+(x(1)*g2)^2)) - ((x(1))*g1)/(x(1)^2+(x(1)*g1)^2) + (TbyiTy)*((x(2))/(x(1)^2+x(2)^2));
    Dans un autre code je résous numériquement (avec fsolver) x(1) et x(2) tel que F(1) = 0 et F(2) = 0;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fun=@root2d; 
    x0=[0.1,0.1];
    x=fsolve(fun,x0);
    J'aimerais ne pas à avoir à écrire mes variables Rt, vb, TbTy et TbyiTy dans le code de la fonction et les écrire à l'extérieur, dans le code 1 par exemple. J'ai essayé d'enlever les variables du code de la fonction et de les écrire dans le code 2 ou de les stocker dans le workspace mais ça ne marche pas. Quand on appelle la fonction elle ne lit pas les variables stockées dans le workspace, comment contourner le problème?

    Je sais pas si je suis très clair

    Merci d'avance

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    Bonjour,

    As-tu essayé :

  3. #3
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    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 882
    Points : 3 432
    Points
    3 432
    Par défaut
    salut

    je te déconseillerais l'utilisation de variables globales (par principe)

    par contre tu peux écrire ta fonction root2d comme fonction imbriquée (nested function) à l'intérieur de ta fonction principale, et du coup elle aura accès au même workspace
    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
    function main
    Rt=(3/(4*pi))^(1/3);
    vb=0.235; 
    vy=1-vb;
    TbTy=1; 
    TbyiTy=1.8;
     
    fun=@root2d; 
    x0=[0.1,0.1];
    x=fsolve(fun,x0);
     
      function F = root2d(x)
        g1=(-2+(2^(1/3))*((((8*vy-(x(2)/Rt)*(3*(x(1)/Rt)^2+(x(2)/Rt)^2))/((x(1)/Rt)^3))+ ...
      end
    end
    sinon moi je les passerai en paramètre à la fonction root2d et l'utiliserais une fonction anonyme (@) pour modifier l'interface de root2d pour fsolve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function F = root2d(x,Rt, vb, TbTy, TbyiTy)
      g1=(-2+(2^(1/3))*((((8*vy-(x(2)/Rt)*(3*(x(1)/Rt)^2+(x(2)/Rt)^2))/((x(1)/Rt)^3))+ ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Rt=(3/(4*pi))^(1/3);
    vb=0.235; 
    vy=1-vb;
    TbTy=1; 
    TbyiTy=1.8;
     
    fun=@(x) root2d(x,Rt, vb, TbTy, TbyiTy);
    x0=[0.1,0.1];
    x=fsolve(fun,x0);
    Fabien

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 37
    Points : 33
    Points
    33
    Par défaut
    Merci !

    J'avais essayé la seconde proposition mais j'utilisais pas la fonction anonyme de la bonne façon, j'écrivais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     fun=@root2d(x,Rt, vb, vy, TbTy, TbyiTy);
    du coup maintenant ça marche!

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

Discussions similaires

  1. [9.3] Peut-on utiliser des variables sans devoir faire une fonction ?
    Par berceker united dans le forum Débuter
    Réponses: 3
    Dernier message: 26/08/2016, 19h54
  2. Appeler des variables de session depuis une vue
    Par keekLG dans le forum Langage
    Réponses: 3
    Dernier message: 14/02/2012, 13h49
  3. Variable en dehors d'une fonction
    Par coincoin22 dans le forum ActionScript 3
    Réponses: 4
    Dernier message: 22/06/2011, 18h07
  4. Réponses: 0
    Dernier message: 07/11/2008, 14h25
  5. Réponses: 6
    Dernier message: 18/04/2007, 11h47

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