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 :

[ode15s] passer des paramètres à une fonction [Débutant]


Sujet :

MATLAB

  1. #1
    Membre expérimenté Avatar de lecteur1001
    Inscrit en
    Mai 2009
    Messages
    1 526
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 1 526
    Points : 1 554
    Points
    1 554
    Par défaut [ode15s] passer des paramètres à une fonction
    Bonjour,

    Je souhaite savoir comment passer des variables en paramètre lors de la résolution d'un système d'équations différentielles avec ode.

    Par exemple si j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    dt=3;
    Hp = 5;
    CI = [PRc, 0];
    tspan = [0 dt*Hp];
    [t,y] = ode15s(@f,tspan,CI);
     
    function out = f(t,y)
    out = x_pr*y^2;
    La fonction f ne connaissant pas x_pr, cela ne va pas fonctionner.
    Je sais que je pourrais mettre x_pr en variable globale avec
    dans mon main et dans la fonction f mais je souhaite savoir si l'on peut faire autrement : je n'aime pas trop avoir des variables globales...

    j'ai entendu dire que l'on pouvait passer des variables en paramètres à l'aide de odeset mais je ne trouve pas d'indication dans la doc.

    Merci par avance

  2. #2
    Membre confirmé
    Avatar de Dam2227
    Inscrit en
    Juin 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 343
    Points : 487
    Points
    487
    Par défaut
    Salut

    J'ai l'impression que pour faire ce que tu dis, il faudrait faire passer un argument au niveau du
    J'ai essayé de le faire mais ça n'a pas marché. Peut-être que quelqu'un d'autre le sait!

    Bon courage

    ++

  3. #3
    Membre expérimenté Avatar de lecteur1001
    Inscrit en
    Mai 2009
    Messages
    1 526
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 1 526
    Points : 1 554
    Points
    1 554
    Par défaut
    Oui l'idéal serait de passer cette variable en paramètre comme tu le dis mais une fonction qui est censée être appelée par ode prend obligatoirement 2 arguments qui sont t et y.

    Merci quand même

    Edit : en fait mon problème ne se résume pas qu'à ode, c'est plutôt pour toutes les fonctions. Par exemple avec 'fmincon', c'est toujours le même problème. Ma question devrait plutôt être : comment faire pour passer des paramètres autrement qu'avec des variables globales lors de l'utilisation de fonction telles que ode, fmincon...etc ?

  4. #4
    Membre expérimenté Avatar de lecteur1001
    Inscrit en
    Mai 2009
    Messages
    1 526
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 1 526
    Points : 1 554
    Points
    1 554
    Par défaut
    J'ai la réponse, qui est effectivement très bête :
    dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [t,y] = ode15s('f',tspan,CI,x_pr);
    puis la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function out = f(t,y,x_pr)
    out = x_pr*y^2;
    Et ben...

  5. #5
    Membre confirmé
    Avatar de Dam2227
    Inscrit en
    Juin 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 343
    Points : 487
    Points
    487
    Par défaut
    Salut

    Tu as quelle version de matlab? Parce que ta solution ne marche pas sur ma machine... Il veut absolument un @f au lieu de 'f'. De plus, j'ai essayé le même bout de code que le tien mais avec @f et il me renvoi toujours une erreur...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ??? Input argument "x_pr" is undefined.
     
    Error in ==> bibed>f at 20
        out = x_pr*y^2;
     
    Error in ==> funfun\private\odearguments at 110
    f0 = feval(ode,t0,y0,args{:});   % ODE15I sets args{1} to yp0.
     
    Error in ==> ode15s at 228
    [neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
     
    Error in ==> bibed at 18
    [t,y] = ode15s(@f,[0:0.01:0.99],[3],x_pr);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    function bibed
     
    x_pr=5;
     
    [t,y] = ode15s(@f,[0:0.01:0.99],[3],x_pr);
    function out = f(t,y,x_pr)
        out = x_pr*y^2;
        end
    end

  6. #6
    Membre expérimenté Avatar de lecteur1001
    Inscrit en
    Mai 2009
    Messages
    1 526
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 1 526
    Points : 1 554
    Points
    1 554
    Par défaut
    Excuse moi, tu as raison ; essaye en déclarant des options.

    Voici un autre exemple.
    Ce que j'ai dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    options = odeset; 
    [tspan tmp]=ode15s('compute_S',tspan,delta_x,options,horizon_at_k,B_horizon,delta_p);
    puis la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function d_delta_x = compute_S(tspan,delta_x_m,options,A,B,delta_p)
     
    d_delta_x = A*delta_x_m + B*delta_p;
    c'est bon, cela fonctionne pour toi ?

  7. #7
    Membre confirmé
    Avatar de Dam2227
    Inscrit en
    Juin 2007
    Messages
    343
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juin 2007
    Messages : 343
    Points : 487
    Points
    487
    Par défaut
    Ok, j'ai compris et ça marche. Il fallait juste rajouter options en argument. Merci pour la solution.

    ++

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 16/10/2014, 00h25
  2. Passer des paramètres à une fonction dans before_filter
    Par abir84 dans le forum Ruby on Rails
    Réponses: 1
    Dernier message: 27/01/2008, 19h40
  3. Réponses: 1
    Dernier message: 11/08/2007, 17h16
  4. Réponses: 2
    Dernier message: 21/07/2007, 01h12
  5. Réponses: 1
    Dernier message: 29/05/2006, 10h04

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