Close This Window

Please download official ILL logos here

 

For using on the web or on a screenFor printing in high resolutionWhite version, for dark backgrounds

Download PNG

Download AI

Download white PNG

Download JPG

 

Download white AI

mfitldv

The Computing for Science (CS) group supports ILL scientists, students and visitors in a number of activities including data analysis, instrument simulation and sample simulation.

Back to ILL Homepage
English French Deutsch 

All Software

Data Analysis with Mfit for Matlab

Sujet : Mfit, graphic program for fit..
Date : 15/11/97
By : Farhi Entertainments File : ~manuf:7081/public_html/mfitldv.html

-----------------------------------------------------------------------------

NOTE: An english version of this page will be available one day...

 

Edito

Maintenant que nous avons 4 postes Matlab, il nous est possible d'utiliser pleinement les ressources graphiques de Matlab 5. Sur le plan calculs, Octave a pratiquement les memes possibilités (sauf : tableaux à n>2 dimensions, graphiques...), bien qu'un peu moins rapide. C'est vrai Matlab va très vite, mais Octave se tient encore... Pour toute remarque sur ce travail, cliquez ICI.

Summary

L'aide officielle de Mfit par son créateur, Martin Zitkin. Attention il y a eu pas mal d'améliorations depuis.

1) Possibiltés de Mfit. Lancement

Mfit est un ensemble de programmes pour Matlab 5, situés dans : /usr/local/MatLab/toolbox/local/mfit3 % interface graphique pour fits. /usr/local/MatLab/toolbox/local/nllsq % Non Linear Least Square fit (Marquardt-Levenberg) /usr/local/MatLab/toolbox/local/load % importation de donnees /usr/local/MatLab/toolbox/local/funcs % bibliotheques de fonctions de base pour Mfit /usr/local/MatLab/toolbox/local/rescal5 % fits 4D de spectres neutrons '3 axes'. Le programme Mfit s'utilise principalement à la souris. Les possibilites sont :

  • Importation de tout type de donnees (fichiers textes, fichiers ILL, SPEC, TAScom, LLB...)
  • Importation directe de données par l'utilisateur (à partir de données Matlab)
  • Exportation de données Mfit vers variables Matlab. Sauvegarde dans un fichier de résultat.
  • Affichage graphique des données, impression
  • axes, zoom, sélection/déselection de zones pour les fits.
  • sélection de fonctions de fit, ou fonction utilisateur
  • pre-fit à la souris pour déterminer les parametres de départ des fits.
  • sélection de la routine de fit (Marquardt rapide ou graphique, autre...)
  • Multi fonction : tout assemblage de fonctions de base
  • fits a 1D avec fonction d'appareil.
  • Détermination automatique de paramètres de départ pour les fits de pics
  • ... et tout ce que je ne dis pas ...

Pour lancer Mfit, executer d'abord Matlab (ouvrir une fenetre sur Athena, puis taper matlab), puis mfit . Une fenetre avec menus et tout et tout s'ouvre... Elle comprend :

  • un menu 'File' pour la gestion des données.
  • un menu 'Load Routines' pour choisir (éventuellement) une fonction de lecture de fichier ad hoc.
  • un menu 'Fit Function' pour choisir les fonctions de fit.
  • un menu 'Fit Routines' pour choisir la routine de fit.

La configuration de Mfit est affichée dans des champs, associes à des boutons rapides pour modifier ces choix. Le bouton 'Guess' sera utilisé pour initialiser le fit. Le bouton 'Fit' fera l'opération magique. Dans la fenetre du graph (MFit:dData), vous pouvez commander le zoom, secetionner/de-selectionner des points, changer l'apparence du graph, activer l'AutoGuess, etc...

2) Importation de données

Il y a deux facons d'importer des données : soit a partir d'un fichier, soit a partir de données que vous avez deja dans Matlab.

A partir d'un fichier.

La fonction d'importation de données générale convient pour tout. Cependant, pour certains types de fichiers (surtout neutrons) on peut choisir une autre routine d'importation plus efficace.

  • Cliquez sur le bouton 'New...' du champ 'Data File' (ou menu 'File/Load new Data'). Une boite de sélection s'ouvre.
  • Choisissez votre fichier.
  • Matlab lance le programme looktxt qui analyse votre fichier. Le processus d'analyse est affiché, ainsi que le début des différentes zones trouvées.
  • Si votre fichier comprend de nombreux blocs de données, une boite vous propose de choisir celui/ceux qui vous convienent.
  • Une fois l'assemblage des données effectuée, vous choisisez les colonnes correspondant aux données X,Y et optionnellement erreur et moniteur de normalisation (données neutrons par exemple).
  • finallement une fenetre contenant vos données s'ouvre.

La fenetre de selection de colonnes permet aussi de préciser un facteur de normalisation (par exemple 'norm(y)' ou '5') et une éventuelle zone de fichier suivie d'options. Par exemple l'option 'setpar' pour les scans ILL permet de transferer les paramètres principaux vers Mfit/Rescal.

Directement

Pour l'importation directe, selectionnez 'Direct User Data entry' comme LoadRoutine. Puis 'File/Reload' ou 'File/Load' ou le bouton 'New'. Une boite de dialogue s'ouvre, et vous demande les données X,Y et optionnellement l'erreur. Vous pouvez alors entrer n'importe quelle expression, contenant vos variables matlab. Ca évite de passer par un fichier. On peut aussi envoyer des données à MFit à partir cd la fenetre Matlab avec la fonction : tomfit(x,y,err,selected,p,fixed); Elle fait le contraire de 'fromfit' ci-dessous.

Exportation de données

Déjà, vous pouvez sauver à chaque étape paramètres et données dans un fichier ('temp.mft' par défaut) en cliquant sur 'Save'. De plus, la fonction 'fromfit' permet de tout récuperer dans la fenetre Matlab. Sa syntaxe est : [x,y,err,selected,fit,p,dp,fixed]=fromfit; Elle fait le contraire de 'tomfit' ci-dessus.

3) Le fit

Vous avez la possibilité de choisir votre méthode de fit :

  • Levenberg-Marquardt est une méthode à gradient adaptatif. Elle a l'avantage de (presque) toujours converger, mais parfois vers un minimum local.
  • Simplex est une méthode géométrique, qui scrute un ensemble de solutions. Elle est plus lente que les méthodes à gradients, mais permet de touver (souvent) la meilleure solution

En général, on pourra jongler entre ces deux métodes. Maintenant que vous avez vos données, sélectionnez votre fonction de fit dans le menu 'Fit Functions'. Une boite 'Parametres' apparait. Cliquez sur 'Guess' et suivez les instructions dans la fenetre 'MFIT:Control'. En gros, la fonction de fit détermine les paramètres de fit d'après vos clics souris... Vous pouvez fixer des paramètres en enfoncant les petis boutons à gauche de chaque paramètre. Il ne reste plus qu'à cliquer sur 'Fit', et tout se fait. Une version graphique de la routine de fit permet de voir le fit se faire sur le graphe. La qualité du fit se mesure avec le coefficient de correlation, la variance résiduelle (qualité de determination pour les données) et le Chi carré (qualité de determination pour les paramètres). Le premier doit etre proche de 1, les autres minimum. Pour les fits plus compliqués, avec plusieurs fonctions, ou faisant des multiplications, puissances, convolutions, etc... de fonctions, j'ai créé pour vous le <blink>MultiFit</blink> (prononcez 'Moultifit').

4) Le fit de pro : le MultiFit

Sélectionnez dans le menu 'Fit Function' le 'MutliFunctions...'. Une fenetre s'ouvre. Les lignes 'yn=' doivent contenir des noms de fonction Mfit, ou des noms de variables à vous (celles que vous utilisez dans la fenetre Matlab). La ligne du bas contient une expression combinant les champs 'yn'. Lors du premier appel, deux champs sont proposés. Changez le nombre de fonction, puis cliquez sur 'Make Function' ou re-sélectionnez 'MutliFunctions...' dans le menu. Le nombre de champs est mis à jour. Le nom des fonctions est obtenu par 'help funcs', a moins que ce ne soit une de vos fonctions (cf Faire une fonction pour Mfit). Le champ 'constrain' permet de specifier des instructions matlab à executer avant vos fonctions. Ca pourra etre par exemple 'p(1) = 0' ou'p(2) = p(3)*2; p(6) = 1'. NB : Cette contrainte s'applique de façon interne à la fonction, donc n'apparait pas dans la fenetre de parametres, par contre elle s'applique !

Exemple

Vous avez dans votre fenetre Matlab une variable 'yappn' contenant une fonction d'appareil. Vous voulez fitter vos données par, disons, 2 gaussiennes au carré, plus le produit de 2 lorentzienne, le tout convolué par votre fonction d'appareil.

  • Tapez '5' dans le champ 'Number of functions' de la fenetre MultiFunction.
  • Cliquez sur 'Make Function' ou re-sélectionnez 'MutliFunctions...' dans le menu.
  • Entrez dans les champs 'yn' les expressions :
    • yappn (pour y5)
    • gauss2 (pour y4)
    • gauss2 (pour y3)
    • lorz (pour y2)
    • lorz (pour y1)
  • Dans le champ 'Final y='tapez : convlv( y1.*y2 + y3 + y4, y5, 2)
  • Cliquez sur 'Make Function'.

<blink>Attention</blink>, la fonction d'appareil 'yappn' doit etre centrée ! S'affiche alors à l'écran la fonction matlab équivalente, que vous pouvez copier à la souris si ça vous chante. Le bouton 'Guess' fonctionne comme d'habitude, et le fit aussi. Vous voyez que tout est possible. On peut utiliser toute fonction matlab dans l'expression finale.

5) Faire une fonction pour Mfit

Une fonction Mfit sait faire des calculs, comme toute fonction que vous avez l'habitude d'utiliser. Elle sait donner son nom, le nom des paramètres et les pars de départ(flag = 1). Elle sait demander des actions à la souris (flag = 2). Si vous voulez simplement utiliser vos fonctions f(x,p) sans vous embeter, ajoutez les lignes suivantes à la fin de votre fichier .m :

if (nargin>2)
        y=[];
        name='my_function';
        pnames=str2mat('Amplitude','Centre','Width','Background'); % params names
        pin=[0 0 1 0];                  % default parameters
        if flag==2
                mf_msg('This function cannot handle Guess feature.');   % user asking section
        end
end

et changez la première ligne de votre fonction en ajoutant ',flag' dans la liste de parametres d'entrée, et ', name, pnames, pin' dans la liste des parametres de sortie. Par exemple :

function y=toto( x, p )

devient

function [y, name, pnames, pin]=toto( x, p, flag )

pnames donne le nom de vos parametres (donc autant de noms que de parametres). pin donne les parametres par defaut (donc autant que de parametres). Ca va ? Une vraie fonction Mfit a la forme :
function [y, name, pnames, pin]=gauss( x, p, flag )
% help section
if (nargin==2)                          % compute section
        y= p(4)+p(1)*exp(-0.5*((x-p(2))/p(3)).^2);
else                                    % Mfit section
        y=[];
        name='my_function';
        pnames=str2mat('Amplitude','Centre','Width','Background'); % params names
        pin=[0 0 1 0];                  % default parameters
        if flag==2
                mf_msg('Click on peak');        % user asking section
                [cen amp]=ginput(1);
                mf_msg('Click on width');
                [width y]=ginput(1);
                width=abs(width-cen);
                mf_msg('Click on background');
                [x bg]=ginput(1);
                amp=amp-bg;
                pin=[amp cen width bg]; % guess paramaters
        end
end

Conclusion

Voila, c'est pas trop compliqué et ca permet de faire tous les fits à la souris, tout en travaillant simultanement dans la fenetre Matlab (lissages, interpolations, etc...). Les autres possibilités de MFit :

  • Automatisation des fits en utilisant l'AutoGuess dans un fichier batch (format MFT)
  • Controle du multifit par un fichier batch
  • Utilisation avec Rescal/trix pour les fits de données neutrons (fonction d'appareil à 4D)