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

Scilab Discussion :

Un souci avec la fonction lsqrsolve


Sujet :

Scilab

  1. #1
    Membre du Club
    Un souci avec la fonction lsqrsolve
    Bonjour à toutes et à tous,

    Je fais de temps en temps des petits programmes d'ajustement de paramètres afin que la courbe théorique colle au mieux à la courbe expérimentale. J'utilise habituellement la fonction "lsqrsolve". Je tiens à bien signaler que ce n'est pas la première fois que j'utilise cette fonction qui a bien bossé dans certaines situations. Mais là ça ne fonctionne pas du tout et je ne comprends pas pourquoi .

    J'ai regardé le diagnostic (info = 4). Ça signifie d'après le site Scilab et la version supportée (6.1.0) : "iteration is not making good progress." Effectivement c'est bien le problème puisque les paramètres solutions (de sortie de lsqrsolve) sont les mêmes que ceux d'entrée. Je ne vois pas comment ça peut produire cela...

    Le fonctionnement du modèle à ajuster est 3 pics gaussiennes dont les 3 paramètres (position, intensité et "largeur") de chacun sont ajustables donc ça nous fait 9 paramètres à ajuster (j'ai connu plus pire que ça ). Ensuite à la fin du modèle on fait la somme des trois pics afin que ça forme qu'un seul signal (la somme des trois pics gaussiennes tout simplement).

    J'ai essayé de varier un peu les paramètres de départ. Ça ne fait rien :-/

    J'ai mis le code ici :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    /////////////////////////////////////////////////////////////////////
    //PARAMETRES A INSERER PAR L'UTILISATEUR
    // Nom du fichier à ajuster
    nomfichier='221.txt';
    // Correction du spectre
    xcor=2;
    // Correction de l'intensité
    Icor=-10000;
     
     
    /////////////////////////////////////////////////////////////////////
    // FONCTION GENERATEUR DES PICS XPS D'O1S
    function [I]=xpso1s(a,x)
     
        // Normalement le vecteur a est décomposé de :
        // a(1) = Position du pic OI
        // a(2) = Largeur du pic OI
        // a(3) = Intensité du pic OI
        // a(4) = Position du pic OII
        // a(5) = Largeur du pic OII
        // a(6) = Intensité du pic OII
        // a(7) = Position du pic OIII
        // a(8) = Largeur du pic OIII
        // a(9) = Intensité du pic OIII
     
        // Génération du pic OI situé à 530 eV
        OI=a(3)*(1/(a(2)*(2*%pi)^0.5))*exp(-((x-a(1)).^2)./(2*a(2)^2));
     
        // Génération du pic OII situé à 531 eV
        OII=a(6)*(1/(a(5)*(2*%pi)^0.5))*exp(-((x-a(4)).^2)./(2*a(5)^2));
     
        // Génération du pic OIII situé à 532 eV
        OIII=a(9)*(1/(a(8)*(2*%pi)^0.5))*exp(-((x-a(7)).^2)./(2*a(8)^2));
     
        // Génération du spectre O1s
        I=OI+OII+OIII;
     
    endfunction
     
    /////////////////////////////////////////////////////////////////////
    // FONCTION EXTRACTION DES DONNES A FITTER 
    // Extraction des data XPS (energie, intensité)
    [d]=read(nomfichier,-1,2);
    xdata=d(:,1);
    Idata=d(:,2);
     
    // Correction du spectre
    xdata=xdata+xcor;
     
    // Correction de l'intensité du signal
    Idata=Idata+Icor;
     
    /////////////////////////////////////////////////////////////////////
    // FONCTION OPTIMISATION PAR LEVEMBERG-MARQUARDT
    // Mise en place de la fonction de calcul des écarts (err), nécessaire à l'optimisation
    function err=fxpso1s(param,xdata)
        a=param;
        [I]=xpso1s(a,xdata);
        err=(Idata-I).^2 ;
    endfunction
     
    // Valeurs de départ
    ainit=[530;0.9;7000;531;0.3;6000;532;0.8;8500];
     
    // La fonction d'optimisation
    [asol,v,info]=lsqrsolve(ainit,fxpso1s,size(xdata,1))
     
    /////////////////////////////////////////////////////////////////////
    // FONCTION AFFICHAGE DES COURBES
    disp(asol)
    plot(xdata,Idata,'ko')
    p=get("hdl");
    p.children.thickness=3
    [Isol]=xpso1s(asol,xdata);
    plot(xdata,Isol)
    p=get("hdl");
    p.children.thickness=3


    Je vous ai mis aussi les data expérimentaux (du fameux fichier "221.txt") :

    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
    523	10415.625
    523.4	10365.625
    523.8	10153.125
    524.2	10315.625
    524.6	10225
    525	10171.875
    525.4	9975
    525.8	10631.25
    526.2	10478.125
    526.6	10746.875
    527	11065.625
    527.4	12240.625
    527.8	15196.875
    528.2	18731.25
    528.6	19803.125
    529	17946.875
    529.4	17581.25
    529.8	17681.25
    530.2	17678.125
    530.6	15990.625
    531	13806.25
    531.4	12781.25
    531.8	11431.25
    532.2	11265.625
    532.6	10709.375
    533	10353.125
    533.4	10250
    533.8	10446.875
    534.2	10296.875
    534.6	9956.25
    535	10584.375
    535.4	10484.375
    535.8	10471.875
    536.2	10528.125
    536.6	10787.5
    537	10696.875
    537.4	10928.125
    537.8	10750
    538.2	10709.375
    538.6	11112.5


    Je vous remercie d'avance !

  2. #2
    Membre du Club
    Personne ?

    Peut-être que mon problème est compliqué ?

    Merci d'avance !

###raw>template_hook.ano_emploi###