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 :

Comment fitter deux courbes en même temps sur lsqcurvefit


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 101
    Points : 53
    Points
    53
    Par défaut Comment fitter deux courbes en même temps sur lsqcurvefit
    Bonjour,

    J'explique mon souci : L'objectif est que je puisse fitter des données expérimentales (Transmission et Réflectivité) en variant des paramètres optiques (PO) sur un modèle défini. J'ai réussi à faire fonctionner l'algorithme Levenberg-Marquardt sur le programme Scilab. Mais celui-ci n'apporter pas l'efficacité que j'ai eu sur Matlab. Alors je souhaite transposer ce code Scilab sur Matlab mais je coince sur un détail concernant les entrées nécessaires à la fonction lsqcurvefit spécifique à Matlab.

    Voici le fonctionnement du code Scilab (tout est codé sur le même fichier) :

    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
    29
    30
    31
    32
    33
    function [R,T]=Modele_Dispersion(a,x)
     
    % Explications du contenu de cette fonction
    % Elle a comme entrée :
    % a = les paramètres optiques (la quantité varie en fonction du modèle choisi, je peux en avoir 6, 10, 12 ou plus, dans ce cas-là j'ai que 6)
    % x = le spectre défini
     
    % Elle a comme sortie :
    % R = la réflectivité sur le spectre défini (ici x)
    % T = la transmission sur le spectre défini (ici x)
     
    endfunction
     
    % Extraction des données expérimentales à fitter
    [d]=read('Fichier_donnees.txt',-1,3)
    xdata=d(:,1);
    Tdata=d(:,2);
    Rdata=d(:,3);
     
    % Partie comparaison entre données expérimentales et données simulées, l'objectif est de minimiser err
    function err=fModele(param,m)
     a = param;
     [R,T] = Modele_Dispersion(a,xdata);
     err=(Rdata-R').^2+(Tdata-T').^2;
    endfunction
    % Vous remarquerez que cette partie permet de fitter la courbe R et la courbe T en même temps et à partir des mêmes paramètres optiques
     
     
    % Valeurs de départ
    ainit=[1,2,3,4,5,6];
    [asol,v,info]=lsqrsolve(ainit,fModele,size(xdata,1))
     
    % Affichage des résultats
    En fait ce qui nous intéresse fortement est le vecteur asol qui contient les paramètres optiques optimisés.

    Côté Matlab, je suis coincé car j'ai la fonction lsqcurvefit. En regardant sa description je vois qu'il a besoin comme entrées :

    lsqcurvefit(fun,x0,xdata,ydata)

    Dans mon cas :
    fun = fModele
    x0 = ainit
    xdata = xi
    ydata : là je suis perdu car j'ai l'impression qu'il accepte qu'un vecteur à une ligne (soit R ou T) et non à deux lignes (R et T), j'aurai bien aimé mettre err mais je ne vois pas trop comment le mettre. Est-ce que je suis la même logique Scilab sur Matlab (c'est à dire écrire toutes les fonctions et leurs agencements dans le même fichier) ?

    Je vous remercie beaucoup d'avance pour vos conseils !

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 883
    Points : 3 431
    Points
    3 431
    Par défaut
    salut

    à priori tu peux faire deux dimensions en même temps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    given input data xdata, and the observed output ydata, where xdata and ydata are matrices or vectors, and F (x, xdata) is a matrix-valued or vector-valued function of the same size as ydata.
    je pense qu'il faut que tu regroupes des 2 sortie de ta fonction dans un vecteur plutot que dans 2 sorties.
    (et peut être mettre les vecteurs en colonne plutot qu'en ligne)

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 101
    Points : 53
    Points
    53
    Par défaut
    Salut,

    Tu veux dire

    côté function [R,T]=Modele_Dispersion(a,x) :

    mettre plutôt

    function [RO]=Modele_Dispersion(a,x) avec

    RO(:,1)=R;
    RO(:,2)=T;

    ?

    PS : RO = Réponses Optiques

  4. #4
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 101
    Points : 53
    Points
    53
    Par défaut
    En supposant que c'est comme ça ta solution, j'ai procédé comme suit au codage :

    Fonction-mère :

    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
    29
    30
    31
    32
    33
     
     
    global ydata
     
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %
    % PARTIE EXTRACTION DES DONNEES EXPERIMENTALES A FITTER
    %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    % Extraction des data (lambda, T et R)
    [FileName,PathName]=uigetfile('*.txt','sélectionner le fichier texte');
    fid=fopen(FileName,'r');
    c=textscan(fid,'%f%f%f');
    fclose(fid);
    % colonne spectre longueur d'onde
    xdata=c{:,1};
    % colonne réponse optique qui est la transmission
    ydata(:,1)=c{:,2};
    % colonne réponse optique qui est la réflectivtié
    ydata(:,2)=c{:,3};
     
     
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %
    % PARTIE FIT DES DONNEES
    %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    % Valeurs de départ
    a0=[30;2.1;2;3;10;2;1]; % Paramètres de départ pour le fit
     
    asol=lsqcurvefit('f_Modele',a0,xdata,ydata);
    La sous-fonction f_Modele :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    function [err]=f_Modele(a,x)
     
    global ydata
     
    % Paramètres d'entrée :
    % - Vecteur a qui contiennent les paramètres optiques du modèle,
    % c'est-à-dire :
    % a(1) = paramètre 1
    % a(2) = paramètre 2
    % a(3) = paramètre 3
    % a(4) = paramètre 4
    % a(5) = paramètre 5
    % a(6) = paramètre 6
    % a(7) = paramètre 7
    % 
    % - x  = spectre en nm
     
    % Paramètres de sortie :
    % RO = Réponses Optiques, c'est-à-dire :
    % RO(:,1) = Transmission;
    % RO(:,2) = Réflectivité;
     
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %
    % PARTIE GENERATEUR DES REPONSES OPTIQUES (T et R)
    %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    %%%%
    %
    % Je vous épargne les détails mathématiques qui permettent de produire Tsim et Rsim à partir des paramètres a
    %
    %
    %%%%
     
    RO(:,1)=Tsim;
    RO(:,2)=Rsim;
     
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %
    % PARTIE COMPARAISON RESULTATS SIMULATION ET EXPERIMENTAUX
    %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    err=(RO(:,1)-ydata(:,1)).^2+(RO(:,2)-ydata(:,2)).^2;
    La console m'indique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Error using lsqcurvefit (line 286)
    Function value and YDATA sizes are not equal.
     
    Error in Essai (line 36)
    asol=lsqcurvefit('f_Modele',a0,xdata,ydata);
    Est-ce que c'est un banal problème d'incohérence de taille ou une erreur d'architecture ?

    Merci beaucoup d'avance !

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 883
    Points : 3 431
    Points
    3 431
    Par défaut
    Citation Envoyé par ThonySp Voir le message
    Salut,

    Tu veux dire

    côté function [R,T]=Modele_Dispersion(a,x) :

    mettre plutôt

    function [RO]=Modele_Dispersion(a,x) avec

    RO(:,1)=R;
    RO(:,2)=T;

    ?

    PS : RO = Réponses Optiques
    oui c'est ca que je voulais dire
    il me semble que ca marche

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 883
    Points : 3 431
    Points
    3 431
    Par défaut
    Citation Envoyé par ThonySp Voir le message
    La sous-fonction f_Modele :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function [err]=f_Modele(a,x)
    ...
    err=(RO(:,1)-ydata(:,1)).^2+(RO(:,2)-ydata(:,2)).^2;
    alors la ca va pas du tout
    la fonction lsqcurvefit fait les moindres carrés à ta place
    si tu ecris ta fonction comme ca, il faut utiliser une autre fonction d'optim (fminsearch, fmincon, ...)
    avec lsqcurvefit, tu lui donne RO a manger, et c'est lui qui le comparera à ydata


    Citation Envoyé par ThonySp Voir le message
    La console m'indique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Error using lsqcurvefit (line 286)
    Function value and YDATA sizes are not equal.
    Est-ce que c'est un banal problème d'incohérence de taille ou une erreur d'architecture ?

    Merci beaucoup d'avance !
    bein oui, value est un vecteur et ydata une matrice deux colonnes

Discussions similaires

  1. Programme Fit sur deux courbes en même temps
    Par ThonySp dans le forum Mathématiques
    Réponses: 17
    Dernier message: 18/07/2019, 17h22
  2. Deux actions en même temps sur click button
    Par souhail72 dans le forum Ext JS / Sencha
    Réponses: 1
    Dernier message: 10/07/2017, 18h05
  3. fitter plusieurs courbes en même temps
    Par Invité dans le forum MATLAB
    Réponses: 2
    Dernier message: 24/07/2012, 16h42
  4. Comment ouvrir deux formulaires en même temps?
    Par Chacha35 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/09/2009, 15h25
  5. Comment ouvrir deux formulaires en même temps?
    Par courtial dans le forum 4D
    Réponses: 1
    Dernier message: 11/05/2007, 01h34

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