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 :

[ode] équation différentielle du 1er ordre


Sujet :

MATLAB

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 206
    Points : 90
    Points
    90
    Par défaut [ode] équation différentielle du 1er ordre
    Bonjour,
    je dois résoudre une 'équation différentielle' du premier ordre très simple du type dy/dx = f(x) avec la fonction ode23 ou ode45 (c'est imposé)
    J'ai une grille pour les valeurs de x sous la forme d'un vecteur: (x1,x2,...,xn) et les valeurs de f correspondantes: (f(x1),f(x2),...).
    Quelqu'un peut il m'aider SVP?
    merci

  2. #2
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Peux-tu nous montrer ce que tu as commencé à faire et les difficultés précises que tu rencontres?

    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 206
    Points : 90
    Points
    90
    Par défaut
    Bonjour,
    mon problème vient, je pense de la simplicité du problème.
    Je comprends bien comment utiliser ode45 avec un système quelconque d'équa diff du genre dy1/dx=f(y1,y2,x) et dy2/dt=g(y1,y2x)
    Mais là, j'ai juste dy/dx=f(x) donc, je fais un blocus total!

    peut être ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    theta = [0 1 2 3 4 5]; % c'est juste un exemple, la réalité est plus cplx
    sqq=@theta
    [T,Y]=ode45(sqq,[0 100],12);

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 206
    Points : 90
    Points
    90
    Par défaut
    Bonjour,
    je n'y arrive toujours pas et je n'ai pas de réponses de votre part. Je m'explique peut être mal?
    Voici plus explicitment mon problème:

    j'ai un vecteur Tr de dimension 500, un vecteur L de dimension 500. Chaque valeur de Tr et de L étant fonction du temps t. Je calcule la fonction
    Jusque là, pas de problème.
    Je sais ensuite que cette expression est égale à une dérivée du temps, soit da/dt = y (avec da /dt la dérivée de la fonction a(t).

    Je dois alors retrouver la fonction a(t) en utilisant un solveur d'équation différentielle (ode45 par exemple), ceci est imposé.

    J'écris donc une fonction rigid.m ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    function dy = rigid(t,y,Tr,L)
    dy = 1./(L.*Tr)-1./L;
    puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tspan=[0 20];
    IC = 1e-2;
    [t,y]=ode23(@(t,y) rigid(t,y,Tr,L),tspan,IC);
    et j'obtiens une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Error using odearguments (line 93)
    @(T,Y)RIGID(T,Y,Tr,L) returns a vector of length 500, but the length of initial conditions vector is 1. The vector returned by @(T,Y)RIGID(T,Y,Tr,L) and the initial conditions vector must have the same number of elements.
     
    Error in ode23 (line 113)
    [neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
    SVP, merci

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

    Le rôle de la fonction odefun - ou rigid dans ton cas - est de retourner la valeur dy correspondant aux entrées (t,y) que lui donne la fonction odeXX en interne, pas tout le temps le même vecteur quelques soient ces entrées.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 206
    Points : 90
    Points
    90
    Par défaut
    Merci winjérome,
    je pense avoir bien compris le rôle de la fonction odefun (rigid dans mon cas). Je n'arrive toutefois pas à l'utiliser correctement!
    j'ai changé ma fonction rigid.m ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function dy = rigid(t,y,Tr,L)
    y = 1./(L.*Tr)-1./L;
    dy = y(1);
    je n'ai plus d'erreur mais le résultat de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tspan=[0 20];
    IC = 1e-2;
    [t,y]=ode23(@(t,y) rigid(t,y,Tr,L),tspan,IC);
    me donne un vecteur y de 11 valeurs toutes égales à IC=1e-2.
    J'm'en sors pas punaise!! J'y retourne, je dois être bête, c'est pas possible!!

  7. #7
    Invité
    Invité(e)
    Par défaut
    Comme tu l'as dit
    Citation Envoyé par cpalperou Voir le message
    Chaque valeur de Tr et de L étant fonction du temps t.
    Ce temps que justement tu as en entrée, donc sers t'en

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 206
    Points : 90
    Points
    90
    Par défaut
    Encore merci,
    j'ai essayé ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function dy = rigid(t,y,Tr,L)
    y = 1./(L.*Tr(:,1))-1./L;
    dy=zeros(numel(y),1);
    for i=1:numel(y)
        dy(i,1) = y(i);
    end
    ainsi, j'ai, pour chaque valeur de t le dy correspondant mais quand je fais ode23,
    j'ai le même problème de condition initial:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Error using odearguments (line 93)
    @(T,Y)RIGID(T,Y,Tr,L) returns a vector of length 500, but the length of initial conditions vector is 1. The vector returned by @(T,Y)RIGID(T,Y,Tr,L) and the initial conditions vector must have the same number of elements.
     
    Error in ode23 (line 113)
    [neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
    Je continue de chercher

  9. #9
    Invité
    Invité(e)
    Par défaut
    De 1), tu écrases le y d'entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function dy = rigid(t,y,Tr,L)
    y = 1./(L.*Tr(:,1))-1./L;
    Et bien que tu ne te serves pas de cette entrée, autant garder les choses au clair
    Ensuite, peux-tu me dire en quoi le code que tu me montres fait dépendre la sortie dy de l'unique valeur que contient l'entrée t ? Et en quoi cela diffère de ce que tu faisais dans ton 3ème message ?

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 206
    Points : 90
    Points
    90
    Par défaut
    J'avoue être perdu! Je n'arrive même pas à répondre à ta question! Je retourne y réfléchir

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 206
    Points : 90
    Points
    90
    Par défaut
    Bonjour,
    je n'y arrive toujours pas, je suis complètement bloqué. Pouvez vous me débloquer svp?
    J'en suis là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function dy=rigid(t,y,Tr,L)
    dy = 1./(L.*Tr)-1./L;
    puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tspan=[0 20];
    IC = 1e-2;
    [t,y]=ode23(@(t,y) rigid(t,y,Tr,L),tspan,IC);
    et: erreur !! RRRRrrrrRrrrr Je n'arrive pas à faire intervenir le temps t dans tout ça (comme me le conseille Winjérome!)

  12. #12
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Il y a bien longtemps que je n'ai pas utilisé ces fonctions, mais ne faudrait-il pas s'appuyer sur l'exemple n°3 de la documentation ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  13. #13
    Invité
    Invité(e)
    Par défaut
    Tout à fait, suffisait de lire la documentation

  14. #14
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    Salut !

    Oulah, c'est un joyeux bordel ici... bon, reprenons les choses calmement.

    Tu dois utiliser ode45 disons. Très bien, ouvre la doc des solver à côté pour l'avoir en parallèle à mes explications. Il y a des choses basiques à comprendre et à maîtriser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [T,Y] = solver(odefun,tspan,y0)
    Le solver, ici, sera ode45. Donc tu vas utiliser quelque chose du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [T,Y] = ode45(odefun,tspan,y0)
    Bien. Maintenant, regardons le tableau en dessous (dans la doc)... Tu as 3 paramètres à spécifier en entrée de ode45 :

    - y0 : conditions initiales de ton vecteur solution. Si tu as un seul paramètre, c'est donc une simple constante
    - tspan : quelque chose du style [t0,tf] par exemple
    - odefun : là c'est plus compliqué... et c'est là que tu butes.

    odefun doit être une fonction qui doit être de la forme :>>> Il est impossible de mettre autre chose que t et y en entrée de cette fonction ! <<< Et la seule sortie possible est le résultat du calcul de la dérivée de y par rapport au temps (dydt) !

    Donc, dydt est l'expression de y'(t) en fonction de y(t) et de t !

    Conclusion...

    Première étape : donne nous l'expression de y'(t) = f( t , y(t) ) - qui doit être valable quel que soit t.

    Deuxième étape : écris une fonction de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dydt = odefun( t , y )
        Tr = ctte;
        L = ctte;
        dydt = sin(y) + t - y/t - Tr + L*L/Tr; % <<=== à modifier en fonction de ta première étape
    end
    ... et tu l'enregistres sous le fichier odefun.m

    Troisième étape : tu as enfin le droit d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [T,Y] = ode45(@odefun,tspan,y0)
    (Attention à ne pas oublier le @)

    Si tu butes, réponds juste à la première étape, stp.

    Cordialement,
    Je ne réponds pas aux MP techniques. Le forum est là pour ça.
    La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
    Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
    Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 206
    Points : 90
    Points
    90
    Par défaut
    Bonjour et merci à vous: j'ai réussi!!

    voici ce que j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function dy=rigid(t,y,f,ft)
    f=interp1((ft,f,t)
    dy = f;
    puis dans la fenêtre principale de MATLAB:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    f=1./(L.*Tr)-1./L;
    Tspan=20:120;
    ft=Tspan;
    Ic=1e-2;
    [T Y] = ode45(@(t,y) rigid(t,y,f,ft),Tspan,Ic)
    et bingo!
    Par contre, Tachmou, il me semble que l'exemple 3 de la documentation (lien fourni par DUT) te contredit quand tu affirmes "qu'il est impossible de mettre autre chose que t et y en entrée de cette fonction" !

  16. #16
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    f=interp1((ft,f,t)
    dy = f;
    ou directement dy = interp1((ft,f,t)

    Citation Envoyé par cpalperou Voir le message
    Par contre, Tachmou, il me semble que l'exemple 3 de la documentation (lien fourni par DUT) te contredit quand tu affirmes "qu'il est impossible de mettre autre chose que t et y en entrée de cette fonction" !
    Ce n'est pas tout à fait vrai, la syntaxe @(t,y) rigid(t,y,f,ft) crée une fonction anonyme équivalent à écrire ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function r = fun(t,y)
    r = rigid(t,y,f,ft);
    Avec l'avantage de prendre les variables f et ft dans le workspace courant.
    Tu ne fournis au final qu'une fonction ne prenant que deux arguments t et y, et c'est bien la seule forme qu'acceptera les fonctions ode.

  17. #17
    Membre éclairé
    Homme Profil pro
    Doctorant automatique
    Inscrit en
    Janvier 2012
    Messages
    446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Doctorant automatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 446
    Points : 719
    Points
    719
    Par défaut
    +1 avec Winjerome

    C'est pas simple à comprendre je le conçois... mais ça fait plaisir de voir que tu remets en question : ça montre que tu te pose les bonnes questions ! Donc +1 à toi aussi

    A+
    Je ne réponds pas aux MP techniques. Le forum est là pour ça.
    La raison est simple : il est ennuyeux de répondre à une seule personne, alors que la réponse peut servir à tout le monde.
    Conclusion : n'hésitez pas à utiliser le forum pour poser vos questions.
    Matlab 2005 - ver.7.1.0.183 (R14) Service Pack 3

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

Discussions similaires

  1. [Débutant] résoudre équation différentielle du 1er ordre
    Par ginafort dans le forum MATLAB
    Réponses: 34
    Dernier message: 03/09/2010, 16h47
  2. Réponses: 6
    Dernier message: 18/02/2008, 16h14
  3. Réponses: 2
    Dernier message: 22/11/2007, 14h58
  4. Réponses: 8
    Dernier message: 08/04/2007, 01h38
  5. Réponses: 1
    Dernier message: 08/12/2006, 17h13

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