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 :

[lsqcurvefit] Système d'équations différentielles (ODE)


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Avril 2013
    Messages : 1
    Par défaut [lsqcurvefit] Système d'équations différentielles (ODE)
    Salut,

    J'ai un problème pour utiliser la fonction "lsqcurvefit" de matlab avec un système d'équation différentielles (ODE). Alors que cela fonctionne quand j'utilise une seule ODE (une seule figure à 'fitter'), dès que je veux le faire avec un système d'ODE (donc plusieurs figures à 'fitter' en même temps) j'ai le problème suivant:
    Function value and YDATA sizes are incommensurate.

    Mon code est le suivant:
    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
     
    function testlsqcurvefit
    a0 = [4 11];
    xdata   = [0; 0.0002; 0.0015; 0.0047; 0.012; 0.028];
    ydata1 = [200; 178; 84; 37; 16; 7.5];
    ydata2 = [0; 0.11; 0.86; 1.7; 2.4; 3];
    C = lsqcurvefit(@ODE, a0, xdata, ydata1)
    D = lsqcurvefit(@ODE, a0, xdata, ydata2)
    figure(1)
    subplot(221)
    plot(xdata, ydata1, 'g*', xdata, ODE(C, xdata))
    subplot(222)
    plot(xdata, ydata2, 'g*', xdata, ODE(D, xdata))
     
     
    function y = ODE(a0,t)
    xdata  = [0; 0.0002; 0.0015; 0.0047; 0.012; 0.028];
    y0 = [200 0];
    [t,y] = ode15s(@deriv,xdata,y0,[],a0);
     
     
    function dydt = deriv(t,y,a)
    dydt =  [-a(1)*y(1)*y(1)+a(2)*y(2); -a(1)*y(2)+a(1)*y(1)];
    Est-ce que quelqu'un est en mesure de résoudre ce problème?

    Merci d'avance.

    holyd

  2. #2
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 885
    Par défaut
    salut

    déjà ta fonction ODE devrait avoir la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function y = ODE(x,xdata)
    ensuite ode15s retourne un matrice temps valeurs [tout,yout] de dimension très variable !!
    en général ce que l'on cherche à minimiser c'est soit :
    - le dernier point yout (yout(end,: ))
    - soit l'integrale de yout (trapz, cumsum ...)

    mais pas la matrice temps valeurs (d'autant qu'à pas variable tu ne maîtrise pas la taille de cette matrice)

    ensuite comme ODE te retournera à priori un vecteur de taille 2, il faut que tes ydata soient des matrices m*2
    ou alors tu veux fitter que sur une de tes deux sorties ...

    Fabien

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2 051
    Par défaut
    salut Holyd,

    j'ai deja utilisé "lsqcurvefit" et "ode45" (pas ode15 par contre)
    mais je n'ai jamais utilisé les deux ensembles.

    si tu m'expliques le but de ce que tu recherches à faire peut etre que je pourrais t'aider.

    ce qui m'etonne un peu dans tout ceci c'est que tu appel ODE à partir de lsqcurvefit.

    ne serait il pas plus simple d'avoir "lsqcurvefit" qui appel une fonction qui englobe tout ce qui est calculatoire et qui retourne directement un vecteur à comparer avec ton "ydata" ? (autrement dit, que l'appel à ode15 ou autre soit transparent pour la focntion lsqcurvefit)

    en fait "lsqcurvefit" n'a besoin que d'un vecteur calculé à un vecteur de référence. Pour le vecteur calculé tu peux effectivment appeler "ODE" pour l'obtenir mais je pense que ça doit être transparent pour lsqcurvefit. Pour avoir un vecteur de même dimension que ton vecteur de référence il faut que tu donnes en entrée de ODE un vecteur "temps" et la fonction te retournera le résultat de calcul avec un vecteur de même dimension que le vecteur temps que tu lui aura donné

    Citation Envoyé par le fab Voir le message
    d'autant qu'à pas variable tu ne maîtrise pas la taille de cette matrice
    salut le fab, si il est possible de maitriser ceci :
    - soit en donnant en argumentà ODE le vecteur "temps" où tu souhaites calculer tes inconnues
    - soit en faisant un calcul ODE entre chaque "piquets de temps" de ton vecteur de référence et en enregistrant le nouveau resultat dans une nouvelle composante à chaque fois.

Discussions similaires

  1. [Débutant] Solution système d'équations avec ODE solver
    Par prog_ dans le forum MATLAB
    Réponses: 0
    Dernier message: 05/11/2010, 03h31
  2. Réponses: 0
    Dernier message: 06/04/2010, 06h02
  3. Réponses: 7
    Dernier message: 19/05/2008, 13h24
  4. Résoudre un système d'équations différentielles
    Par mostafaziad dans le forum MATLAB
    Réponses: 7
    Dernier message: 06/07/2007, 09h18
  5. Réponses: 2
    Dernier message: 07/06/2007, 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