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

Signal Discussion :

Code pour curve fitting avec un modèle connu [Débutant]


Sujet :

Signal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 29
    Par défaut [fminsearch] Code pour curve fitting avec un modèle connu
    Bonjour tout le monde,

    Cela fait maintenant un sacré bout de temps que j'essaie d'écrire un code basique pour produire un graphique avec mes données d'origines, et la courbe représentant au mieux ces données. Je connais déjà la forme de l'équation, et donc il me faut trouver la valeur des six inconnues, pour la meilleur courbe.

    Mes données sont dans un fichier excel.
    Jusqu'a présent j'ai trouvé plusieurs exemples, mais après avoir essayé de les transposer à mon application . . . ça marche pas

    Pour l'instant j'ai ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    filename = 'input.xls';
     a= xlsread (filename);
     x= a (:,1);
     y= a (:,2);
     
     bestcoeffs=fminsearch(@fun,[1 1 1 1 1 1],[],x,y);
     yfit=bestcoeffs(1)+ bestcoeffs(2)*x + bestcoeffs(3)*sin(2*pi*x) +  bestcoeffs(4)*cos(2*pi*x)+ bestcoeffs(5)*sin(4*pi*x) +  bestcoeffs(6)*cos(4*pi*x);
     
     scatter (x,y);
     plot(x,yfit);
    Ce qui est adapté d'un exemple censé marcher.
    Matlab me retourne :
    ??? Undefined function or method 'fun' for input arguments of type 'double'.

    Error in ==> fminsearch at 205
    fv(:,1) = funfcn(x,varargin{:});
    En tant que bon newbie, je ne comprends pas ce qui ne va pas . . .
    J'ai déjà utilisé la toolbox "Curve fitting", et ça fonctionne plutôt bien, mais j'aimerai arriver au même résultat avec un bout de code !

    Si vous avez une idée . . .
    Merci d'avance !
    Ayvik.

  2. #2
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    As-tu regardé l'aide de FMINSEARCH pour comprendre ce que cette fonction fait ?
    Là il te dit simplement que la fonction fun que tu lui passes en paramètre n'existe pas.

  3. #3
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 29
    Par défaut fminsearch
    J'ai effectivement potassé la section sur fminsearch dans la doc en ligne de Matlab, ai testé plusieurs fonctions, mais je suis sur de devoir utiliser fminsearch maintenant.

    Le nom de la fonction dont tu parles devrait être reconnu, puisque j'ai un fichier .m avec ma fonction déclarée dedans. Le problème c'est que je ne trouve pas d'exemple sur la syntaxe a utiliser quand on veut passer beaucoup de paramètres à la fonction.

    J'ai un set de donnée X et Y dans un xls. et je connais le modèle qui régit la relation, cependant je doit trouver la valeur des 6 paramètres, et ce, pour la meilleur courbe. Le but serait d'arriver à reproduire le resultat fourni par la toolbox, mais en le codant.

    Ma fonction est :
    a + b.x + c.sin(2.pi.x) + d.cos(2.pi.x) + e.sin(4.pi.x) + f.cos(4.pi.x)

    J'ai créé un fichier .m avec ce code, trouvé dans un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function f = myModel (x,input)
    a = param(1);
    b = param(2);
    c=  param(3);
    d=  param(4);
    e=  param(5);
    f=  param(6);
    % this is the model equation here
    output = a + b.*input.^1+ c.*sin(2*pi*input.^1)+ d.*cos(2*pi*input.^1)+ e.*sin(4*pi*input.^1)+ f.*cos(4*pi*input.^1);
    Je ne suis évidemment pas du tout sur de la validité du code, vu que je ne sais pas ce que fais ! (J'aurai pas du faire confiance à mon tuteur sur les objectifs :-S ) De plus, j'ai très peu de temps, trop peu pour passer un mois à apprendre les bases de la programmation en tout cas. J'essaie donc de me baser sur des exemples.

    En ce qui concerne, le code en lui même, j'ai ça (toujours adapté d'un exemple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    filename = 'CCCS.xls';
     a= xlsread (filename);
     x= a (:,1);
     y= a (:,2);
     
     bestcoeffs=fminsearch(@myModel,[1 1 1 1 1 1],[],x,y);
     yfit=bestcoeffs(1)+ bestcoeffs(2)*x + bestcoeffs(3)*sin(2*pi*x) +  bestcoeffs(4)*cos(2*pi*x)+ bestcoeffs(5)*sin(4*pi*x) +  bestcoeffs(6)*cos(4*pi*x);
     
     scatter (x,y);
     plot(x,yfit);
    En executant ce code, Matlab me retourne :

    ??? Error using ==> myModel
    Too many input arguments.

    Error in ==> fminsearch at 205
    fv(:,1) = funfcn(x,varargin{:});
    Je ne sais pas comment lui faire accepter tous les arguments que je lui passe. Et en ce qui concerne la deuxième erreur, je n'ai aucune idée de la fonction dont il parle, vu que je ne lui ai pas demandé de l'utiliser . . .

    Toute aide me serait vraiment vraiment précieuse . . .
    Ayvik,

    P.S: J'ai du faire de la prog 'régulière' (CShell) il y'a quelque jours, et je trouve que les ressources sur Matlab sont vraiment . . . nulles, surtout pour les vrais débutants ! Aucun exemple vraiment simple, ou d'explication claire des exemples . . . Je suppose que le top est d'avoir des notions de prog avant de s'attaquer au Matlab !

  4. #4
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Sans notion de programmation cela va être vraiment compliqué.

    1. Ta fonction myModel
    A pour paramètres d'entrée x et input (soit 2 entrées)
    Dès la 1ère tu essayes d'utiliser une variable param qui n'est mentionnée nulle part => cela ne peut pas fonctionner.
    Comme tu n'utilises x nulle part je suppose qu'en fait param=x et/ou inversement.
    Dans un 1er temps écris donc correctement ta fonction myModel.
    Pour cela teste-la d'abord.
    Par exemple là si tu fais :
    ça va planter tout de suite.


    2. Utilisation de FMINSEARCH
    Le 1er argument est le nom de la fonction : maintenant ça c'est bon il trouve bien myModel, par contre le message d'erreur te dit que tu as un souci au niveau du nombre d'arguments d'entrée passés : il y en a trop.
    Le 2ème argument de FMINSEARCH correspond à des paramètres d'entrée de la fonction myModel (la/les valeurs à partir desquelles FMINSEARCH fait la recherche du minimum local) =>
    Tu lui en donnes 6 alors que myModel n'a que 2 arguments d'entrée => la problème vient donc de là.


    Nota : FUNFCN est une fonction privée de MATLAB qui vérifie la cohérence du nombre d'arguments.

  5. #5
    Membre averti
    Inscrit en
    Juin 2009
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 29
    Par défaut
    Merci Caro-line pour ta réponse.

    Effectivement, il n'y avait pas assez de paramètres déclarés.
    Je me sers de ces deux exemples pour faire l'adaptation :
    Code en général:
    http://blinkdagger.com/matlab/matlab...-lsqcurvefit/2
    Fminsearch:
    http://www-h.eng.cam.ac.uk/help/tpl/...e_fitting.html

    Est-ce une bonne idée ?

    J'ai modfié en ceci,qui semble être correct d'après l'exemple 1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function output = myModel (param,input)
    a = param(1);
    b = param(2);
    c=  param(3);
    d=  param(4);
    e=  param(5);
    f=  param(6);
    % this is the model equation here
    output = a + b.*input.^1+ c.*sin(2*pi*input.^1)+ d.*cos(2*pi*input.^1)+ e.*sin(4*pi*input.^1)+ f.*cos(4*pi*input.^1);
    Et Matlab me retourne :
    ??? Error using ==> times
    Matrix dimensions must agree.

    Error in ==> myModel at 9
    output = a + b.*input.^1+ c.*sin(2*pi*input.^1)+ d.*cos(2*pi*input.^1)+ e.*sin(4*pi*input.^1)+
    f.*cos(4*pi*input.^1);
    Error in ==> fminsearch at 205
    fv(:,1) = funfcn(x,varargin{:});
    J'espère qu'il est capable de multiplier X par 2pi ! :-)

    Est-ce que mes deux sources ont l'air correctes ?

    Merci,

    EDIT:

    J'ai finalement ré-adapté le tout, donc : (j'espère que tout ça servira à quelqu'un . . . même si très basique)

    Ma fonction myModel.m :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function out = myModel (coeff,X,Y)
    a = coeff(1);
    b = coeff(2);
    c=  coeff(3);
    d=  coeff(4);
    e=  coeff(5);
    f=  coeff(6);
    % this is the model equation here
    Y_fun = a + b.*X+ c.*sin(2*pi*X)+ d.*cos(2*pi*X)+ e.*sin(4*pi*X)+ f.*cos(4*pi*X);
    Mon bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     filename = 'CCCS.xls';
     a= xlsread (filename);
     x= a (:,1);
     y= a (:,2);
    
     bestcoeffs=fminsearch(@myModel,[1 1 1 1 1 1],[],x,y);
     yfit=bestcoeffs(1)+ bestcoeffs(2)*x + bestcoeffs(3)*sin(2*pi*x) +  bestcoeffs(4)*cos(2*pi*x)+ bestcoeffs(5)*sin(4*pi*x) +  bestcoeffs(6)*cos(4*pi*x);
    
     scatter (x,y);
     hold;
     plot(x,yfit,'r');
    
    Le tout ne produit pas d'erreur à l' éxecution, mais me produit un graphique totalement différent de celui produit par la tool box.

    Produit par la "Curve fitting" Toolbox :


    Produit par fminsearch :


    Il semble que la fonction ne produise une courbe qu'avec les faibles oscillations, comme si c.sin(2.pi.x) + d.cos(2.pi.x) n'etaient pas pris en compte . . .

    La question s'éloigne de son point de départ . . .

    Any ideas ?
    Merci beaucoup . . .

  6. #6
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Le message d'erreur indique un problème dans les dimensiosn des matrices multipliées.

    As-tu essayé de lancer ta function myModel avec en arguements d'entrée ce que tu vas lui donner avec FMINSEARCH ?

    Peux-tu montrer les dimensions de tes variables x et y ?

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

Discussions similaires

  1. Code pour iframe incompatible avec IE.
    Par defacta dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/06/2009, 17h28
  2. Probleme avec code pour fond musical
    Par Yanout dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 05/09/2007, 17h12
  3. [Tableaux] probleme avec mon code pour faire un parseur !
    Par Joe-La-Boule dans le forum Langage
    Réponses: 10
    Dernier message: 11/10/2006, 15h35
  4. [VB]code pour sendkeys avec Alt + F
    Par Nicko29 dans le forum VB 6 et antérieur
    Réponses: 23
    Dernier message: 20/01/2006, 08h23

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