![]() |
|
fit di dati in matlab/octave
Per il fit polinomiale matlab/octave dispongono della versatile funzione polyfit.
Nella forma piu' semplice si assegnano i dati x e y da fittare e il grado del polinomio scelto,
e si ottiene il vettore delle componenti del polinomio, da poter usare con le routine per il
calcolo dei polinomi che abbiamo già visto, come polyval.
per esempio qui fittiamo una sinusoide:
x = linspace(0,4*pi,10);
y = sin(x);
plot(x,y,'o')
z=linspace(0,4*pi,300);
hold on
plot(z,sin(z),'r')
p=polyfit(x,y,7);
plot(z,polyval(p,z))
Nella forma più complessa da polyfit si possono ottenere altre informazioni utili a misurare la bontà del fit ottenuto.
Si osservi che se si chiede il fit polinomiale di n+1 punti con polinomi di grado n, si ottiene di fatto il
polinomio interpolante i punti.
Per esempio proviamo ad interpolare la funzione vista in precedenza 1/(1+25 x^2)
Si noti che se i punti scelti sono equispaziati i polinomi di interpolazione passarenno per
i punti scelti, ma faranno grosse oscillazioni fuori da tali punti.
Se invece i punti sono scelti con altri criteri e non sono equispaziati si possono avere comportamenti migliori.
Questo tipo di esercizio è un classico del calcolo numerico, e viene spesso riproposto,
come in questo tema di esame di calcolo numerico dato dal Prof. Luca Gemignani un paio di anni fa
al primo anno del corso di laurea in ingegneria biomedica.
Vediamo qui:
Osservazioni:
I fit polinomiali sono ottenuti essenzialmente dai fit lineari in più variabili.
Funzioni non lineari a volte sono trasformabili in modo da adoperare fit lineari.
Per esempio il fit con una famiglia di curve y=a*exp(b*x) diventa facilmente un fit lineare prendendo i logaritmi (anche
se alcune proprietà statistiche del fit dei minimi quadrati vengono distorte dalla trasformazione).
Ricordiamo che le serie di Fourier possono essere viste come un fit di dati mediante la famiglia di seni e coseni e delle loro armoniche, e in particolare nel discreto lo strumento che si usa è la DFT e le sue implementazioni come FFT.
![]() |
|