Fit con numeri random

di il
10 risposte

Fit con numeri random

Ciao a tutti, dovrei plottare una serie di fit con valori generati random. Mi spiego meglio.
genero numeri casuali, assegno quei numeri a una variabile e poi devo fare tanti fit quanti sono i valori della variabile e farne il grafico, per vedere quale meglio si adatta. Più nello specifico quello che voglio fare è:
1) generare valori random della variabile sigma
2) fittare dei dati per ogni valore di sigma generato secondo una funzione gaussiana
3) stampare tutti i plot effettuati, scrivendo nella legenda il valore di sigma

quello che ho scritto è:
global legend_Ipicco sigma myfitga
.
.
.

   sigma={};
   myfitga={};
   .
   .
   .
         eVcIpicco=eVc(:,5:18);
      ckxfitIpicco=ckxfit(:,5:18);  
   figure (5);
plot5=figure (5);
set(plot5, 'Visible', 'off');
hold on
plot(eVcIpicco,ckxfitIpicco,'b*'); 
for i=1:5
          sigma=rand(1,i)*1.5;
     myfitga{i}= fit(eVcIpicco.',ckxfitIpicco.','1/(sqrt(2*pi)* sigma(i) )* exp(-(x-mu).^2 /(2*sigma(i).^2))','StartPoint',[284.7]);
      legend_Ipicco{i}=sigma(i);
      plot(eVcIpicco,myfitga{i}); 
end
xlabel('Energia (eV)');
ylabel('Conteggi relativi');
   legend(legend_Ipicco);
    title('Fit gaussiano primo picco');
    axis([282 288 0 0.06]);
   hold off;

ma purtroppo mi da l'errore
Error using fittype/testCustomModelEvaluation (line 12)
Expression 1/(sqrt(2*pi)* sigma(i) )* exp(-(x-mu).^2 /(2*sigma(i).^2)) is not a valid MATLAB expression, has non-scalar coefficients, or
cannot be evaluated:
Error in fittype expression ==> 1./(sqrt(2.*pi).* sigma(i) ).* exp(-(x-mu).^2 ./(2.*sigma(i).^2))
??? Index exceeds matrix dimensions.

Error in fittype>iCreateFittype (line 371)
testCustomModelEvaluation( obj );

Error in fittype (line 328)
obj = iCreateFittype( obj, varargin{:} );

Error in fit>iFit (line 157)
model = fittype( fittypeobj, 'numindep', size( xdatain, 2 ) );

Error in fit (line 108)
[fitobj, goodness, output, convmsg] = iFit( xdatain, ydatain, fittypeobj, ...

Error in sp2sp3diff_Titantah (line 358)
myfitga{i}= fit(eVcIpicco.',ckxfitIpicco.','1/(sqrt(2*pi)* sigma(i) )* exp(-(x-mu).^2 /(2*sigma(i).^2))','StartPoint',[284.7]);

Caused by:
Error using fittype/evaluate (line 102)
Error in fittype expression ==> 1./(sqrt(2.*pi).* sigma(i) ).* exp(-(x-mu).^2 ./(2.*sigma(i).^2))
??? Index exceeds matrix dimensions.

10 Risposte

  • Re: Fit con numeri random

    Il messaggio di errore sembra molto chiaro, lo hai letto?

    Ha letto l'ultima parte del messaggio di errore?

    Caused by:
    Error using fittype/evaluate (line 102)
    Error in fittype expression ==> 1./(sqrt(2.*pi).* sigma(i) ).* exp(-(x-mu).^2 ./(2.*sigma(i).^2))
    ??? Index exceeds matrix dimensions.


    In pratica, dice che "alla riga 102 del codice, si cerca di accedere ad una locazione di un vettore superiore alla dimensione (numero di elementi) del vettore stesso.

    Hai provato ad eseguire il codice con il debugger?
    Hai verificato il contenuto ed il tipo delle variabili dell'equazione?
    
    myfitga{i}= fit(eVcIpicco.',ckxfitIpicco.','1/(sqrt(2*pi)* sigma(i) )* exp(-(x-mu).^2 /(2*sigma(i).^2))','StartPoint',[284.7]);
    
    (che dovrebbe essere alla riga 102, appunto).
  • Re: Fit con numeri random

    Ciao...purtroppo non so come si accede al debugger
    comunque, quello che posso dirti è che la riga 102 è
     path_filegrafdiff=fullfile(pathnamegraf,inputgrafdiff);
    che funziona perfettamente e non c'entra niente con questa cosa...
  • Re: Fit con numeri random

    Come si fa a scrivere un programma senza il debugger?!?

    https://it.mathworks.com/help/matlab/matlab_prog/debugging-process-and-features.html

    Per quanto riguarda il messaggio di errore, leggi la prima parte (e non 'ultima, come avevo erroneamente scritto nella risposta precedente):


    Error using fittype/testCustomModelEvaluation (line 12)
    Expression 1/(sqrt(2*pi)* sigma(i) )* exp(-(x-mu).^2 /(2*sigma(i).^2)) is not a valid MATLAB expression, has non-scalar coefficients, or
    cannot be evaluated:
    Error in fittype expression ==> 1./(sqrt(2.*pi).* sigma(i) ).* exp(-(x-mu).^2 ./(2.*sigma(i).^2))
    ??? Index exceeds matrix dimensions.


    Il problema è alla riga 1 o, comunque, in quella che contiene
    
    1./(sqrt(2.*pi).* sigma(i) ).* exp(-(x-mu).^2 ./(2.*sigma(i).^2))
    
    Come ho scritto nella risposta precedente, lì si cerca di accedere ad una locazione di un vettore superiore alla dimensione (numero di elementi) del vettore stesso.

    [*] Inserisci un breakpoint in quella riga (posiziona il cursore sulla riga e premi F12)
    [*] lancia il programma (F5)
    [*] sei all'interno di un ciclo for
    [*] esamina il valore delle variabili (passa il mouse "sopra" di loro per vederne il contenuto oppure evidenziale e premi F9 per staparne il calore nella CommandWindow)
    [*] premi F10 per proseguire con l'esecuzione del programma "riga per riga" o F5 per continuare l'esecuzione fino al raggiungimento del breakpoint
    [*] nella prima iterazione non dovrebbero esserci errori
    [*] l'esecuzione del programma dovrebbe essersi fermata sull'istruzione in questione (dove hai inserito il breakpoint.
    [*] esamina di nuovo il valore delle variabili; noti qualcosa?
    [*] quanto vale la variabile "sigma"?
    [*] come viene usata questa variabile nell'equazione?
    [*] se evidenzi la variabile così come viene usata nell'equazione => sigma(i) e premi F9, cosa viene stampato nella CommandWindow?

    Il debugger è il tuo migliore amico!
  • Re: Fit con numeri random

    Ciao innanzittutto grazie. Allora

    ask_raf ha scritto:


    [*] esamina il valore delle variabili (passa il mouse "sopra" di loro per vederne il contenuto oppure evidenziale e premi F9 per staparne il calore nella CommandWindow)

    [*] premi F10 per proseguire con l'esecuzione del programma "riga per riga" o F5 per continuare l'esecuzione fino al raggiungimento del breakpoint

    [*] nella prima iterazione non dovrebbero esserci errori
    [*] l'esecuzione del programma dovrebbe essersi fermata sull'istruzione in questione (dove hai inserito il breakpoint.
    [*] esamina di nuovo il valore delle variabili; noti qualcosa?
    [*] quanto vale la variabile "sigma"?
    [*] come viene usata questa variabile nell'equazione?
    [*] se evidenzi la variabile così come viene usata nell'equazione => sigma(i) e premi F9, cosa viene stampato nella CommandWindow?

    Il debugger è il tuo migliore amico!
    Risulta:
    sigma=1.4473
    i=1
    sigma(i)=1.4473
    myfitga=0×0 empty cell array
    myfitga{i}=Index exceeds matrix dimensions.
     legend_Ipicco=0×0 empty cell array
    legend_Ipicco{i}=Index exceeds matrix dimensions.
    
    Premendo F10 mi da l'errore
    Error using fittype/testCustomModelEvaluation (line 12)
    Expression 1/(sqrt(2*pi)* sigma(i) )* exp(-(x-mu).^2 /(2*sigma(i).^2)) is not a valid MATLAB expression, has non-scalar coefficients, or
    cannot be evaluated:
    Error in fittype expression ==> 1./(sqrt(2.*pi).* sigma(i) ).* exp(-(x-mu).^2 ./(2.*sigma(i).^2))
    ??? Index exceeds matrix dimensions.
    
    Error in fittype>iCreateFittype (line 371)
        testCustomModelEvaluation( obj );
    
    Error in fittype (line 328)
                    obj = iCreateFittype( obj, varargin{:} );
    
    Error in fit>iFit (line 157)
        model = fittype( fittypeobj, 'numindep', size( xdatain, 2 ) );
    
    Error in fit (line 108)
    [fitobj, goodness, output, convmsg] = iFit( xdatain, ydatain, fittypeobj, ...
    
    Error in sp2sp3diff_Titantah (line 358)
         myfitga{i}= fit(eVcIpicco.',ckxfitIpicco.','1/(sqrt(2*pi)* sigma(i) )* exp(-(x-mu).^2 /(2*sigma(i).^2))','StartPoint',[284.7]);
    
    Caused by:
        Error using fittype/evaluate (line 102)
        Error in fittype expression ==> 1./(sqrt(2.*pi).* sigma(i) ).* exp(-(x-mu).^2 ./(2.*sigma(i).^2))
        ??? Index exceeds matrix dimensions.
     
  • Re: Fit con numeri random

    Il problema, o, almeno uno dei problemi, è che nel loop hai, in sequenza,
    
    sigma=rand(1,i)*1.5;
    myfitga{i}= fit(eVcIpicco.',ckxfitIpicco.','1/(sqrt(2*pi)* sigma(i) )* exp(-(x-mu).^2 /(2*sigma(i).^2))','StartPoint',[284.7]);
    
    Nel corso delle iterazioni, la dimensione della variabile "sigma" cambia dimensione (1 elemento alla prima iterazione, 2 alla seconda, ecc.) passando da essere uno scalare (prima iterazione) ad un vettore (nelle successive iterazioni).
    Questo succede perchè
    
    rand(1,i)
    
    genera una matrice (n x m) e, siccome "i" aumenta ad ogni iterazione, ...

    Questo è incompatibile con la definizione del resto dell'equazione (almeno dal punto di vista sintattico).

    Bisogna verificare se, in base all'algoritmo che vuoi implementare, se ti serva un solo valore (uno scalare) od un vettore.
  • Re: Fit con numeri random

    ask_raf ha scritto:


    Bisogna verificare se, in base all'algoritmo che vuoi implementare, se ti serva un solo valore (uno scalare) od un vettore.
    Mi serve scalare, cioè deve generare valori di sigma e inserirli nella gaussiana e fare il fit con quel sigma. Quindi dovrei avere sigma1, sigma2, sigma3, ecc.

    Comunque, intanto ho fatto una prova "semplificata" per iniziare. Cioè, invece di generare la sigma random gli ho assegnato dei valori:
    
      eVcIpicco=eVc(:,5:18);
          ckxfitIpicco=ckxfit(:,5:18);  
       figure (5);
    plot5=figure (5);
    set(plot5, 'Visible', 'off');
    hold on   
         myfitga1= fit(eVcIpicco.',ckxfitIpicco.','1/(sqrt(2*pi)* 0.1 )* exp(-(x-mu).^2 /(2*(0.1).^2))','StartPoint',[284.7]);
         myfitga2= fit(eVcIpicco.',ckxfitIpicco.','1/(sqrt(2*pi)* 0.2 )* exp(-(x-mu).^2 /(2*(0.2).^2))','StartPoint',[284.7]);
         myfitga3= fit(eVcIpicco.',ckxfitIpicco.','1/(sqrt(2*pi)* 0.3 )* exp(-(x-mu).^2 /(2*(0.3).^2))','StartPoint',[284.7]);
         myfitga4= fit(eVcIpicco.',ckxfitIpicco.','1/(sqrt(2*pi)* 0.4 )* exp(-(x-mu).^2 /(2*(0.4).^2))','StartPoint',[284.7]);
         myfitga5= fit(eVcIpicco.',ckxfitIpicco.','1/(sqrt(2*pi)* 0.5 )* exp(-(x-mu).^2 /(2*(0.5).^2))','StartPoint',[284.7]);
         fitresults{1}=myfitga1;
         fitresults{2}=myfitga2;
         fitresults{3}=myfitga3;
         fitresults{4}=myfitga4;
         fitresults{5}=myfitga5;
          figure (5);
    plot5=figure (5);
    set(plot5, 'Visible', 'off');
    hold on
    plot((fitresults{1}),'r-',eVcIpicco,ckxfitIpicco,'b*'); 
    legend_Ipicco{1}='Dati';
    legend_Ipicco{2}='sigma=0.1';
    plot((fitresults{2}),'g-'); 
    legend_Ipicco{3}='sigma=0.2';
    plot((fitresults{3}),'y-'); 
    legend_Ipicco{4}='sigma=0.3';
    plot((fitresults{4}),'m-'); 
    legend_Ipicco{5}='sigma=0.4';
    plot((fitresults{5}),'c-'); 
    legend_Ipicco{6}='sigma=0.5';
    xlabel('Energia (eV)');
    ylabel('Conteggi relativi');
       legend(legend_Ipicco);
        title('Fit gaussiano primo picco');
        axis([282 288 0 0.06]);
       hold off;
       
    in questo caso il codice funziona (cioè non da errori), ma le gaussiane sono troppo "alte" rispetto ai valori dei dati (vd. immagine)


    quindi non si "basa" sui valori dei dati...
  • Re: Fit con numeri random

    In questo caso, basta:

    sigma=rand*1.5
  • Re: Fit con numeri random

    ask_raf ha scritto:


    In questo caso, basta:

    sigma=rand*1.5
    L'unica cosa è che mi "vede" il sigma come un parametro di fit (e non un valore fisso) e quindi mi chiede 2 start points...cioè:
    for i=1:5
              sigma=rand*1.5;
         myfitga{i}= fit(eVcIpicco.',ckxfitIpicco.','1/(sqrt(2*pi)* sigma )* exp(-(x-mu).^2 /(2*sigma.^2))','StartPoint',[284.7]);
          legend_Ipicco{i}=sigma;
          plot(eVcIpicco,myfitga{i}); 
    end
    errore:
    Error using fit>iFit (line 296)
    Too few start points. You need 2 start points for this model.

    Error in fit (line 108)
    [fitobj, goodness, output, convmsg] = iFit( xdatain, ydatain, fittypeobj, ...

    Error in sp2sp3diff_Titantah (line 358)
    myfitga{i}= fit(eVcIpicco.',ckxfitIpicco.','1/(sqrt(2*pi)* sigma )* exp(-(x-mu).^2 /(2*sigma.^2))','StartPoint',[284.7]);
    Scrivendo il valore di sigma (vd. messaggio precedente) funziona...ma non fitta bene...mi fa gaussiane altissime rispetto ai dati...
  • Re: Fit con numeri random

    Non ho una grande dimestichezza con la funzione "fit", ma mi sembra di capire che stai usando la funzione in oggetto come "fit type".

    Forse dovresti verificare la documentazione:
  • Re: Fit con numeri random

    Ciao, intendi che matlab ha già nela libreria la funzione gaussiana per fare il fit? Se intendi quello...si...già ho fatto i fit con la gaussiana di matlab scrivendo 'gauss1'' invece dell'espressione analitica della gaussiana...però in quel caso matlab mi calcola tutti i coefficienti della gaussiana. Io invece voglio fissare il valore di sigma e far fittare solo su "mu"...ecco perchè ho scritto tutta la funzione senza ricorrere alla libreria matlab
Devi accedere o registrarti per scrivere nel forum
10 risposte