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 :

fit bi variable


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 fit bi variable
    Bonjour,
    je rencontre un problème pour fitter des données à un modèle.
    Il s'agit de valeurs N dépendant de 2 variables, la latitude (l) et le temps (t).
    Le modèle est le suivant:
    Nmod(l,t)=N0+N1cos[(2*pi*t/12)+t1]+N2*(l+pi/2)(l-pi/2)cos[(2*pi*t/6)+t2]
    Les paramètres à ajuster étant N0, N1, N2, t1 et t2.
    Je n'ai aucune idée de comment faire ni aucun point de départ.
    Pouvez vous m'aider?
    Merci

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    salut

    commence par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    x0 = [0,0,0,0,0]; % améliorer si tu as une idée de point de départ meilleur
    fun = @(x,xdata) x(1)+x(2)*cos[(2*pi*xdata(2)/12)+x(4)]+x(3)*(xdata(1)+pi/2)(xdata(1)-pi/2)cos[(2*pi*xdata(2)/6)+x(5)]
    x = lsqcurvefit(fun,x0,xdata,ydata);
    ou x represente les coefficients [N0, N1, N2, t1, t2], x0 les coefficients de départ pour l'optimisation
    xdata est une matrice m*2 [l t] de tes entrées
    ydata une matrice m*1 [N] du résultat à fitter

    bon pour ça faut avoir l'optimisation toolbox
    si tu as la curvefitting toolbox, ça doit être encore plus simple

  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 et merci leFab.
    Je ne comprends pas ce que doivent être xdata et ydata.
    Ce que j'ai: un vecteur l contenant les latitudes de dimensions 1*36, un vecteur time de dimension 1*124 et une matrice N de dimensions 36*126.

    D'après la façon dont tu écris fun, xdata(2) contient le vecteur temps (dimension 1*36) et xdata(1) les latitudes (dim 1*124). Comment écrire alors xdata, si ces 2 composantes n'ont pas les même dimensions?
    Ce que tu appelles ydata correspond, je pense à ma matrice N. Est-ce correct?

    Merci de m'aider

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    c'est ca ...

    solution un peu bourrin pour construire xdata et ydata :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [L,T] = meshgrid(vLatitudes,vTemps)
    xdata = [L(:) T(:)];
    ydata = N(:);
    avec peut être des transposés à mettre, peut être inverser L T dans meshgrid....
    le but est de créer 2 vecteur colonnes de 36*124 éléments pour la latitude et le temps et un vecteur N de même taille avec correspondance

    y a peut etre mieux et plus propre, mais c'est comme ca que j'ai l'habitude de faire

  5. #5
    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,
    le vecteur L contient 36 éléments.
    Le vecteur T contient 124 éléments.

    Logiquement, il est impossible de les concaténer:
    Par exemplz:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    L=ones(36,1);
    T=ones(124,1);
    xdata = [L(:) T(:)];
    ??? Error using ==> horzcat
    All matrices on a row in the bracketed expression must have the 
     same number of rows.
    Je ne comprends pas ta méthode!

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    la première ligne est indispensable (meshgrid)
    L et T sont alors des matrices de 36*124 ou 124*36 suivant l'ordre d'appel dans la fonction meshgrid
    ensuite L( : ) et T( : ) sont des vecteurs colonnes de 36*124 éléments, tout comme N( : ) et tu as alors une correspondance élément par élément (L(12) & T(12) -> N(12))
    et donc tu obtient des xdata et ydata cohérents que tu peux utiliser dans lsqcurvefit

  7. #7
    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,
    désolé mais je n'y arrive toujours pas!!
    Je construis bien les matrices L et T avec la commande meshgrid
    Ensuite, lors de l'éxécutiion de lsqcurvefit, j'ai une erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ??? Error using ==> lsqcurvefit at 253
    Function value and Ydata sizes are incommensurate

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    tu as bien écrit ydata = N(: ); ??
    tu as bien :
    - xdata un matrice de 2 colonnes et 124*36=4464 lignes
    - ydata un vecteur colonnes de 124*36=4464 lignes

    quand tu tapes pas exemple fun([0,0,0,0,0],xdata) tu obtiens bien un vecteur colonne de 124*36=4464 lignes ?

    la en gros l'erreur te dis que le retour de la fonction (ex fun([0,0,0,0,0],xdata)) n'est pas de même dimension que le jeu de valeur de référence (ydata )

  9. #9
    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 le fab,
    Je n'y arrive toujours pas! Voici ce que je fait:
    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
     
    >> [L,TT]=meshgrid(llat,ttime);
    >> size(L)
    ans =
       124     7
    >> size(TT)
    ans =
       124     7
    >> xdata=[L(:) TT(:)];
    >> size(xdata)
    ans =
       868     2
    >> ydata=T(:);
    >> size(ydata)
    ans =
       868     1
    >> fun = @(x,xdata) x(1)+x(2)*cos(2*pi*xdata(2)/12+x(4))+x(3)*(xdata(1)+pi/2)*(xdata(1)-pi/2)*cos(2*pi*xdata(2)/6+x(5))
    fun = 
        @(x,xdata)x(1)+x(2)*cos(2*pi*xdata(2)/12+x(4))+x(3)*(xdata(1)+pi/2)*(xdata(1)-pi/2)*cos(2*pi*xdata(2)/6+x(5))
     
    >> x0=[0,0,0,0,0];
    >> x=lsqcurvefit(fun,x0,xdata,ydata);
    ??? Error using ==> lsqcurvefit at 253
    Function value and YDATA sizes are incommensurate.
     
    >> fun([0,0,0,0,0],xdata)
    ans =
         0
    Comme tu vois, quand je tape fun([0,0,0,0,0],xdata) j'obtiens bien un scalaire égal à 0.
    Je joins à ce message mes données T, llat et ttime dont les dimensions diffèrent de celles de mes précéents messages (pas d'importance).
    Fichiers attachés Fichiers attachés

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    yop

    OK je vois, c'est moi qui t'ai induit en erreur

    remplace dans la fonction fun xdata(1) par xdata(:,1) et xdata(2) par xdata(:,2)
    ça devrait marcher comme ça

    fab

  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 Fab,
    merci beaucoup pour ton aide. J'ai fait ton remplacement et en effet, cela résout le problème de données incommensurables!
    Maintenant, j'obtiens une toute autre erreur liée à la présence de NaN dans ma matrice T.
    Voici l'erreur obtenue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ??? Error using ==> snls at 259
    lsqcurvefit cannot continue: user function is returning Inf or NaN values.
     
    Error in ==> lsqncommon at 149
        [xC,FVAL,LAMBDA,JACOB,EXITFLAG,OUTPUT,msgData]=...
     
    Error in ==> lsqcurvefit at 258
    [xCurrent,Resnorm,FVAL,EXITFLAG,OUTPUT,LAMBDA,JACOB] = ...
    J'ai bien tenté d'enlever les NaN avec une petite manip du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    L=isnan(T);
    T(L)=[ ];
    Mais ça transforme ma matrice T de dimensions 7*124 par un vecteur de dimension 1*569.
    Bref, je suis toujours en échec.
    Peut être que je devrais utiliser une autre fonction?

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    essaye un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    xdata = xdata(~isnan(ydata),:);
    ydata = ydata(~isnan(ydata));

  13. #13
    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
    Yeeeaaaahhhh!
    Mille mercis Fab

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/07/2002, 13h32
  2. variables locales ou globales ???
    Par elvivo dans le forum C
    Réponses: 13
    Dernier message: 03/07/2002, 08h22
  3. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08
  4. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  5. les variables globales static
    Par gRRosminet dans le forum C
    Réponses: 8
    Dernier message: 27/04/2002, 08h34

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