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 :

Interpolation dans une fonction [ode]


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Interpolation dans une fonction [ode]
    Bonsoir,

    Après avoir recherché activement dans le forum et ses archives, j'ouvre ce sujet afin de profiter de votre expérience.

    J'utilise la fonction ode45 afin de résoudre un système de 22 équations et la résolution s'effectue parfaitement. L'étape suivante consiste donc en la complexification du système avec l'ajout de paramètres non linéaires à la place de certaines constantes.

    Je dispose d'un tableau qui contient des valeurs en x et y et qui me permettent (à l'aide de l'outil d'interpolation interp1) de retrouver une valeur de mon paramètre à partir de n'importe quelle valeur d'entrée. L'interpolation fonctionne dans la fenêtre de commande.

    Mon but est d'utiliser cette interpolation dans la fonction ode, et là cela coince. Car le point où je dois interpoler se trouve être la valeur de la dérivée d'une des fonction recherchées, appelée z(2)=dz(1) dans la fonction ode. Bon cela ne marche pas mais le problème semble venir de plus loin, car même lorsque le point où j'interpole est une constante Matlab me renvoie une erreur alors que le même code marche en dehors de cette fonction ode.

    Le message d'erreur étant le fameux "Index exceeds matrix dimensions".

    Donc ma première question est : pensez-vous qu'il est possible d'effectuer une interpolation interp1 à l'intérieur même de la fonction ode ?

    Je vous remercie d'avoir pris le temps de me lire et pour les futures réponses

  2. #2
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    J'utilise la fonction ode45 afin de résoudre un système de 22 équations
    On ne résout pas un système différentiel, on l'intègre.

    avec l'ajout de paramètres non linéaires à la place de certaines constantes.
    Pourquoi est-ce que tu n'intègres pas directement ton système différentiel non linéaire avec ode45?
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Salut,

    la syntaxe de ode45 est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    options = []; % toutes les options que tu veux mettre dans ode45
    [t, y] = ode45(@mafun,[t0 tfin],x0,options,var1,var2);
    var1, var2,...,var50 sont 50 variables qui sont appelées dans la fonction mafun, typiquement des constantes, des tableaux bref ce que tu veux. Donc une solution, si ton interp1 fonctionne en ligne de commande, c'est de passer tous tes tableaux à ode45 puis d'appeler la fonction interp1 dans ode45. Montre nous ton code. On y verra plus clair

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour à vous 2 et merci pour vos réponses !

    On ne résout pas un système différentiel, on l'intègre.
    Oups, le pire c'est que je l'ai vu dans d'autres threads mais je suis aussi tombé dans le panneau !

    Pourquoi est-ce que tu n'intègres pas directement ton système différentiel non linéaire avec ode45?
    Tant que je ne fais pas entrer en compte l'interpolation, tout marche très bien.

    var1, var2,...,var50 sont 50 variables qui sont appelées dans la fonction mafun, typiquement des constantes, des tableaux bref ce que tu veux. Donc une solution, si ton interp1 fonctionne en ligne de commande, c'est de passer tous tes tableaux à ode45 puis d'appeler la fonction interp1 dans ode45.
    Très intéressant comme idée, car en effet je n'avais percuté que cela pouvait provenir du fait que mon tableau n'arrivait pas jusqu'au sein de la fonction.
    Par contre je n'ai pas la même syntaxe dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [t,z]=ode45('mafonction',[TI TF],[Conditions initiales]);
    Et en essayant ton code avec option et var, cela ne marche plus même avec une constante toute simple utilisée dans le système d'ED. Je déclare a=1 dans le main puis je rentre ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    options = [];
    [t,z]=ode45('mafonction',[TI TF],[Conditions initiales],options,a)
    Le fait que je n'ai pas besoin d'options a-t-il une influence ?

    EDIT : J'ai essayé ta syntaxe avec les options "types" de l'exemple de l'aide Matlab et ma valeur de a et cela ne marche pas mieux, il ne connait pas a dans la fonction ode.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a=1;
    options = odeset('RelTol',1e-4,'AbsTol',1e-5);
    [t,z]=ode45('mafonction',[TI TF],[Conditions initiales],options,a);
    Merci encore, je continue de chercher et je vous tiens au courant.

    Pour info je travaille avec Matlab 7.4.0 (R2007a).

  5. #5
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    Tant que je ne fais pas entrer en compte l'interpolation, tout marche très bien.
    Si tu intègres directement ton système différentiel non linéaire, tu n'auras pas besoin de l'interpolation et tout ira très bien.
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Salut Jean-Marc !

    Si tu intègres directement ton système différentiel non linéaire, tu n'auras pas besoin de l'interpolation et tout ira très bien.
    Soit j'ai mal compris ta réponse, soit j'ai mal posé ma question

    Posons une partie de mon système, avec A,B,C,D,P,Q,R,S des constantes déclarées à l'intérieur de la fonction ODE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dz(1)=z(2);
    dz(3)=z(4);
    dz(2)=A*z(1)+B*z(2)+C*z(3)+D*z(4);
    dz(4)=P*z(1)+Q*z(2)+R*z(3)+S*z(4);
    Ceci fonctionne parfaitement.

    Maintenant je cherche à remplacer ma constante B qui dépend de z(2), mais je n'ai pas de fonction B=f(z(2)), cela serait trop beau !

    Je dispose d'un tableau 10x2 qui me donne des valeurs de B en fonction de z(2). Donc si je veux une valeur de B pour une valeur quelconque de z(2) je n'ai qu'à interpoler. Ce qui marche parfaitement dans la fenêtre de commande matlab, pour n'importe quelle valeur de z(2). Par contre, si je vais dans 'mafonction' et que je tape la même ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    B(:,1)=interp1(valeur(:,1),valeur(:,2),z(:,2),'linear','extrap');
    J'obtiens une erreur, peut importe où je place cette ligne dans la fonction, que ce soit dans la partie de déclaration des constantes ou alors directement dans les équations différentielles.

    EDIT : Le problème ci-dessous est résolu, il était du à une variante de syntaxe dans la fonction en elle même, fonction qui s'exécutait sans problème quand même... J'avance donc petit à petit...

    Mais avant de résoudre ce problème je pense qu'il me faut répondre à la question de "faire rentrer" une variable (même une constante) dans la fonction après l'avoir déclarée dans le main. Car pour l'instant cela ne marche pas !

    J'espère avoir été assez clair

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Après plusieurs heures de tests, tout semble fonctionner, j'arrive maintenant à interpoler facilement les éléments de mon tableau en fonction de la valeur de la dérivée z(2). Le problème semble donc résolu.

    Pour information voici la différence de code à l'origine du fait que je ne pouvais pas "faire entrer" de constante ou tableau dans 'mafonction'. En tête de fonction avant j'avais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function dz=mafonction(t,z)
    Qui fonctionnait donc parfaitement mais impossible de faire rentrer quoi que ce soit avec ce code (et bien sûr le code associé dans le main, donné par salseropom) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function dz=mafonction(t,z,a,b)
    Tout venait en fait d'un variante de syntaxe, il manquait un couple de crochets... Ceci étant le bon code en tête de fonction qui permet de faire marcher la fonction ET l'ajout de paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function [dz]=mafonction(t,z,a,b)
    Voilà, je vais signaler ce sujet comme résolu et j'espère que ce message de feedback permettra à quelqu'un d'économiser les heures que j'ai perdues !

    Merci pour votre participation et rendez-vous à la prochaine question

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

Discussions similaires

  1. extraire une variable dans une fonction ODE
    Par Sarra_ dans le forum MATLAB
    Réponses: 13
    Dernier message: 11/11/2009, 21h09
  2. Dériver une fonction dans une fichier "ode"
    Par Namenlos dans le forum MATLAB
    Réponses: 1
    Dernier message: 18/12/2008, 17h24
  3. Utilisez MinimizeName() dans une fonction
    Par James_ dans le forum C++Builder
    Réponses: 7
    Dernier message: 07/05/2004, 18h05
  4. [Postgresql]Connecter à une autre base dans une fonction
    Par alex2205 dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/05/2003, 11h30
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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