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 :

extraire une variable dans une fonction ODE


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 7
    Points
    7
    Par défaut extraire une variable dans une fonction ODE
    Bonjour,

    Dans une fonction ode45, j'ai une variable que je veux afficher
    une fois l'ode tourne.
    Comment appeler cette variable qui se trouve dans un Mfile à partir
    du workspace matlab?

    Disons que ma fonction s'appelle "apple"

    J'ai dans un Mfile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function dx=apple(t,x)
    .
    .
    .
    G=x(1)*m*x(2)
    dx=[dx(1);dx(2)]
    Ensuite quand je veux extraire la variable G, biensur elle n'est pas
    connue. Je ne sais pas comment l'appeler car apple, je ne peux
    l'appeler que pour faire tourner l'ode45.

  2. #2
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Déjà pour une n'importe quelle fonction, comment peut on appeler
    une variable?

  3. #3
    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
    Salut,

    Que veux-tu faire exactement?
    tu veux afficher G pendant que ode45 tourne? après que ode45 ait terminé?

    Je ne comprends pas ton deuxième message...

    Sinon en général pour récupérer la valeur d'une variable, on la passe en argument de sortie d'une fonction (function [sortie1,sortie2,sortie3] = mafunction()) mais j'imagine que pour la fonction ode45, ta fonction apple doit avoir une syntaxe particulière, non?
    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.

  4. #4
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Exactement elle a une syntaxe particulière ce qui fait que si je l'appelle c'est juste pour la faire tourner (donc intégrer le x)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [T,x]=ode45(@apple,[0 100],x0)
    je n'ai même pas accès à apple (qui est la fonction contenant G)

    Or j'ai besoin de G en même temps que l'ode tourne, car elle est
    fonction de x.

    J'espère que je me suis bien expliquée.

    Et même quand je fais plot (G) à l'intérieur de apple ça ne marche pas

  5. #5
    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
    Citation Envoyé par Sarra_ Voir le message
    et même quand je fais plot (G) à l'intérieur de apple ça ne marche pas
    Peux-tu être plus précis? pourquoi ça ne marche pas?
    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.

  6. #6
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Quand je mets:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    figure(1)
    plot(G)
    à l'intérieur de la fonction apple, y'a rien, c'est à dire que la
    figure ne se crée pas, et sans message d'erreur!

  7. #7
    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
    Bizarre autant qu'étrange!

    Es-tu sûr de ne pas avoir plusieurs fonctions nommées apple? Tu n'as pas mis figure dans une partie du code qui ne serait pas éxécuté? (à l'intérieur d'une condition par exemple)

    J'ai testé avec l'exemple de la doc à l'intérieur d'une fonction (qui s'appelle rigid dans la doc), et ça marche...

    Pourrais-tu nous montrer ta fonction apple?
    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.

  8. #8
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Voici ma fonction:
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    function dx=apple(t,x)
     
    global J m g d k C B l0 q deltaa deltae epsilon gama R1 R2 r1 r2 k4
     
    J=0.01;
    m=0.5;
    g=10;
    d=0.1;
    k=0.04;
    C=30;
    B=75;
    l0=0.2;
    q=0.1;
    deltaa=0.035;
    deltae=0.005;
    epsilon=-0.13;
    gama=0;
    r1=10;
    r2=10;
    k4=0.24;
     
    R1=(r1*q*(-k*x(2))^epsilon)*(l0-k*x(1)-gama)*heaviside(l0-k*x(1)-gama)*heaviside(-k*x(2))+r1;
     
    R2=(r2*q*(-k*x(2))^epsilon)*(l0+k*x(1)-gama)*heaviside(l0+k*x(1)-gama)*heaviside(k*x(2))+r2;
     
    Ge=(R1-C*k*x(1))^2-B*k*x(2)*heaviside(k*x(2));
    Gf=(R2+C*k*x(1))^2-B*k*x(2)*heaviside(-k*x(2));
     
     
    if ((x(1)>0) & (x(2)>0))==1
        Ge=k4*x(2);
    else
        Gf=-k4*x(2);
    end
     
    if ((x(1)<0) & (x(2)>0))==1
        Gf=0;
    end
     
    if ((x(1)>0) & (x(2)<0))==1
        Ge=0;
    end
     
    dx(1)=x(2);
    dx(2)=(m*g/d)*sin(x(1))+(k/J)*(Ge-Gf);
     
    figure(1)
    plot(Gf)
     
    dx=[dx(1);dx(2)];
    Et puis dans un autre Mfile je fais l'appel de fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    x0=[1;1];
    [T,x]=ode45(@apple,[0 30],x0);
    figure(2)
    plot(T,x(:,1),T,x(:,2))
     
    figure(3)
    plot(x(:,1),x(:,2))
    Voila, et la figure 1, ne se crée même pas!
    j'ai essayé de la mettre avant les sections de conditions if, mais tjrs la meme chose.
    Enfin, je crois que puisqu'elle dépend de la variable x, elle va pas se créer avant que l'ode tourne. Et dans ce cas là, comment faire pour visualiser cette variable? qq1 a une idée?

  9. #9
    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
    J'ai fais tourner le code que tu as donné, et pour ma part, la figure 1 se crée...

    Que retourne :
    ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Enfin, je crois que puisqu'elle dépend de la variable x, elle va pas se créer avant que l'ode tourne.
    Quoi qu'il en soit, je ne comprends toujours pas bien ce que tu veux faire, et de plus je ne connais pas très bien la fonction ode45, ce qui rajoute à mon incompréhension...
    néanmoins, c'est la fonction ode qui fait appelle à la fonction apple; elle fait d'ailleurs de multiples appels. Donc ce que je n'ai toujours pas compris :
    - tu veux connaître les valeurs de Gf prises au cours de l'exécution de la fonction ode45?
    - tu veux connaître la valeur de Gf à la fin de l'exécution de la fonction ode45?
    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.

  10. #10
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    La figure 1, contient elle une courbe ou c'est juste une figure vide?
    Si oui, pourrais tu m'envoyer cette figure (et merci d'avance)
    parceque pour ma part, rien ne s'affiche!! et c'est bizarre.

    Concernant ta question. je veux visualiser Gf dans le même horizon
    de temps sur lequel je fais tourner l'ode45, donc pendant que l'ode
    tourne.
    Je m'explique, je veux connaitre la valeur de Gf (c'est une force),
    à chaque instant d'intégration, c'est à dire pendant que ode45 tourne
    et appelle la fonction "apple". à chaque instant veut dire une courbe
    d'où le plot (Gf).

  11. #11
    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
    Citation Envoyé par Sarra_ Voir le message
    La figure 1, contient elle une courbe ou c'est juste une figure vide?
    Si oui, pourrais tu m'envoyer cette figure (et merci d'avance)
    parceque pour ma part, rien ne s'affiche!! et c'est bizarre.
    Tu as quand même une figure qui est créé, non?
    Parce que oui, ce n'est pas une courbe qui s'affiche, c'est juste un point car Gf est un scalaire, et à chaque fois que tu fais un plot, le nouveau point écrase les précédents...


    Citation Envoyé par Sarra_ Voir le message
    Concernant ta question. je veux visualiser Gf dans le même horizon
    de temps sur lequel je fais tourner l'ode45, donc pendant que l'ode
    tourne.
    Je m'explique, je veux connaitre la valeur de Gf (c'est une force),
    à chaque instant d'intégration, c'est à dire pendant que ode45 tourne
    et appelle la fonction "apple". à chaque instant veut dire une courbe
    d'où le plot (Gf).
    Voir au-dessus, mais je ne vois pas comment tu veux tracer une courbe avec un seul point...

    Voici une solution pour récupérer toutes les valeurs prises par Gff. Elle n'est pas très jolie car elle utilise des variables globales, et il faut éviter autant que possible d'utiliser des variables globales :
    la fonctions apple devient :
    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
    43
    44
    45
    46
    47
    48
    49
    function dx=apple(t,x)
     
    global J m g d k C B l0 q deltaa deltae epsilon gama R1 R2 r1 r2 k4 Gff compt
     
    J=0.01;
    m=0.5;
    g=10;
    d=0.1;
    k=0.04;
    C=30;
    B=75;
    l0=0.2;
    q=0.1;
    deltaa=0.035;
    deltae=0.005;
    epsilon=-0.13;
    gama=0;
    r1=10;
    r2=10;
    k4=0.24;
     
    R1=(r1*q*(-k*x(2))^epsilon)*(l0-k*x(1)-gama)*heaviside(l0-k*x(1)-gama)*heaviside(-k*x(2))+r1;
     
    R2=(r2*q*(-k*x(2))^epsilon)*(l0+k*x(1)-gama)*heaviside(l0+k*x(1)-gama)*heaviside(k*x(2))+r2;
     
    Ge=(R1-C*k*x(1))^2-B*k*x(2)*heaviside(k*x(2));
    Gf=(R2+C*k*x(1))^2-B*k*x(2)*heaviside(-k*x(2));
     
     
    if ((x(1)>0) & (x(2)>0))==1
        Fe=k4*x(2);
    else
        Ff=-k4*x(2);
    end
     
    if ((x(1)<0) & (x(2)>0))==1
        Ff=0;
    end
     
    if ((x(1)>0) & (x(2)<0))==1
        Fe=0;
    end
     
    dx(1)=x(2);
    dx(2)=(m*g/d)*sin(x(1))+(k/J)*(Ge-Gf);
     
    Gff(compt) = Gf;
    compt = compt+1;
    dx=dx';
    Et la l'appel de ode45 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    global Gff compt;
    compt = 1;
    x0=[1;1];
    [T,x]=ode45(@apple,[0 30],x0);
    Dans Gff tu auras alors toutes les valeurs de Gf prises au cours des apples de apple. Par contre, ce sont toutes des valeurs complexes, est-ce normal?
    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.

  12. #12
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par magelan Voir le message
    Dans Gff tu auras alors toutes les valeurs de Gf prises au cours des apples de apple. Par contre, ce sont toutes des valeurs complexes, est-ce normal?
    En fait, je ne peux pas répondre car jusqu'à maintenant je n'ai pas les valeurs
    de Gff (le programme tourne encore). Il est busy depuis quelques minutes!!!

  13. #13
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par magelan Voir le message
    Enfin dx=[dx(1);dx(2)], pourquoi t'as mis dx=dx'?

  14. #14
    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
    Oui, il est un peu long à tourner...

    Enfin dx=[dx(1);dx(2)], pourquoi t'as mis dx=dx'?
    Au début je l'avais enlevé car je me demandais pourquoi tu l'avais mis avant de me rendre compte que dx devait être une matrice colonne.
    mais dx=[dx(1);dx(2)] est équivalent à dx=dx', l'opérateur ' permet de transposer une matrice.
    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.

Discussions similaires

  1. Récupérer le nom d'une colonne d'une table dans une variable
    Par mimi51340 dans le forum Général Java
    Réponses: 4
    Dernier message: 13/03/2008, 14h23
  2. Réponses: 4
    Dernier message: 29/01/2008, 11h12
  3. [MySQL] Extraire des variables dans une variable
    Par kryogen dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/10/2007, 09h20
  4. Réponses: 1
    Dernier message: 15/02/2007, 00h24
  5. Mettre une valeur d'une table dans une variable
    Par Raphou96 dans le forum Access
    Réponses: 5
    Dernier message: 06/02/2006, 15h19

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