Minimi quadrati

Messaggioda lorenz90 » 28/10/2011, 20:49

Buongiorno, sono alle prese con un problema pratico dove devo utilizzare degli strumenti dell'analisi numerica, e vorrei chiedervi un consiglio su come fare.

Ho studiato in maniera analitica il rendimento di una turbina ed è emerso che la curva che ne descrive l'andamento in funzione della velocità di rotazione è una parabola passante per l'origine (a turbina frema il rendimento è nullo).
Poi in laboratorio ho raccolto dei dati sperimentali ed in effetti l'andamento rispecchia approssimativamente il modello teorico.

Vorrei trovare la curva che descrive il fenomeno e ho pensato di farlo in matlab utilizzando il metodo dei minimi quadrati. Ho delle coppie di punti $(x_n,y_n)$ nel piano cartesiano, e cerco di trovare il polinomio di secondo grado che più si avvicina al loro andamento.
Tutto ciò non è complicato e l'ho già fatto con il comando $"polyfit"(x,y,2)$, soltanto che la parabola trovata non passa per l'origine a causa di errori sperimentali.
Dunque vorrei imporre il passaggio per l'origine prima di trovare la soluzione ai minimi quadrati, ma non so come fare :?

Per caso sapete se in matlab esiste qualche funzione per questo, oppure qualche stratagemma per risolvere il problema?
Grazie in anticipo, Lorenzo
lorenz90
Junior Member
Junior Member
 
Messaggio: 176 di 200
Iscritto il: 26/11/2009, 01:30

Re: Minimi quadrati

Messaggioda dissonance » 29/10/2011, 17:57

Io farei una semplice sottrazione. Proprio nel modo più brutale possibile:
Codice: Seleziona tutto
zstar=polyfit(x, y, 2);
z=zstar-zstar(1);
Avatar utente
dissonance
Cannot live without
Cannot live without
 
Messaggio: 8323 di 10907
Iscritto il: 24/05/2008, 20:39
Località: Nomade

Re: Minimi quadrati

Messaggioda lorenz90 » 29/10/2011, 18:43

Haha, è vero, così passa di sicuro per l'origine :P
Il problema è che il ragionamento dell'interpolazione ai minimi quadrati va un po'a farsi benedire :)

Comunque in questo caso la parabola trovata col metodo dei minimi quadrati per fortuna non si allontana molto dall'origine, quindi se uso questo stratagemma nessuno se ne accorgerà! Ti ringrazio molto perchè non ci avevo proprio pensato.

Ad ogni modo, se a qualcuno viene in mente un metodo rigoroso sarei curioso di capire come fare, anche per una questione di interesse mio personale
lorenz90
Junior Member
Junior Member
 
Messaggio: 177 di 200
Iscritto il: 26/11/2009, 01:30

Re: Minimi quadrati

Messaggioda dissonance » 29/10/2011, 21:32

Ma non stiamo barando, facendo così. E' una procedura che si usa, o almeno, così mi risulta (non ho mai studiato granché di matematica applicata, purtroppo). Il concetto è che c'è un "rumore di fondo" presente nelle misure e lo dobbiamo sottrarre via prima di potere usare i risultati.
Avatar utente
dissonance
Cannot live without
Cannot live without
 
Messaggio: 8329 di 10907
Iscritto il: 24/05/2008, 20:39
Località: Nomade

Re: Minimi quadrati

Messaggioda lorenz90 » 30/10/2011, 00:49

Ho provato con il tuo metodo ma purtroppo non va bene :(
Il fatto è che per x=0 il polinomio vale -0.4, e dal momento che la curva descrive un rendimento, compreso sempre tra 0 e 1, risulta essere troppo da aggiungere e "sballa" tutti i dati.

A questo punto penso toccherà fare un piccolo script. Il generico polinomio il cui grafico passa per l'origine è "ax^2+bx+0", e quindi in qualche modo dovrei andare a ricondurmi a risolvere un sistema ai minimi quadrati dove però le incognite sono soltanto $a$ e $b$.
Domani mattina cerco i quaderni di analisi numerica e provo a buttare giù qualcosa, che ora non mi ricordo le funzioni a memoria..
lorenz90
Junior Member
Junior Member
 
Messaggio: 178 di 200
Iscritto il: 26/11/2009, 01:30

Re: Minimi quadrati

Messaggioda Deckard » 30/10/2011, 10:29

Puoi usare un solver per l'ottimizzazione (es. AMPL o non so se anche matlab o mathematica possano farlo) che ti minimizzi lo scarto ai minimi quadrati:
$ min_{a,b} sum_(i) (y_i - (a*x_i^2 + b*x_i))^2 $

Così non hai bisogno di implementare algoritmi o cose del genere. Comunque in matlab ci saranno sicuramente librerie con all'interno metodi già implementati come ad es. Gauss–Newton.
http://www.mathcomp.leeds.ac.uk/turing2012/

Hilbert space is a big place.
Deckard
Junior Member
Junior Member
 
Messaggio: 211 di 295
Iscritto il: 17/08/2010, 09:58

Re: Minimi quadrati

Messaggioda lorenz90 » 30/10/2011, 11:23

Ho trovato che il comando per cercare il minimo di una funzione a più variabili è $"fminsearch(f,v)"$ con $f$ la funzione di cui cerco il minimo e $v$ un punto vicino al quale voglio cercare il minimo stesso.

Ho scritto la funzione utilizzando il prodotto riga colonna la posto della sommatoria:
Codice: Seleziona tutto
f=inline('(y-(a.*x.^2+b.*x).^2)*ones','a','b')
dove x de y sono vettori riga 1x8 (devo inperpolare 8 valori) e ones è un vettore colonna 8x1 con tutti gli elementi che valgono 1.

Ora però se provo a minimizzare la funzione ottengo errori :(
Codice: Seleziona tutto
>> fminsearch(f,[0,0])
??? Error using ==> inline.subsref at 14
Not enough inputs to inline function.

Error in ==> fminsearch at 205
fv(:,1) = funfcn(x,varargin{:});

Penso sia dovuto a come ho definito la funzione, perchè nell'esempio che ho trovato veniva usato il comando $"function"$, ma nel mio contesto se definivo la funzione $f$ col comando function mi venivano fuori altri errori :s
lorenz90
Junior Member
Junior Member
 
Messaggio: 179 di 200
Iscritto il: 26/11/2009, 01:30

Re: Minimi quadrati

Messaggioda dissonance » 30/10/2011, 12:03

No, no, non usare quella cosa là!!! :-) Quel comando serve per minimizzare funzioni non lineari e usa algoritmi molto più incasinati del linearissimo metodo dei minimi quadrati. Guarda, secondo me fai prima a scriverti una piccola function che fa quello che vuoi tu. Risolvere il problema dei minimi quadrati è in ultima analisi risolvere un sistema di equazioni lineari, non occorrono grandi manovre.
Avatar utente
dissonance
Cannot live without
Cannot live without
 
Messaggio: 8331 di 10907
Iscritto il: 24/05/2008, 20:39
Località: Nomade

Re: Minimi quadrati

Messaggioda lorenz90 » 30/10/2011, 12:49

Il fatto è che non so bene come fa matlab a risolvere i minimi quadrati. So che per risolvere un sistema $Ax=b$ la matrice $A$ viene divisa con la fattorizzazione QR, cioè $A=QR$ con Q quadrata e R rettangolare. Poi si calcola il residuo e lo si minimizza, ma a qual punto non so che algoritmo viene usato per minimizzarlo..
lorenz90
Junior Member
Junior Member
 
Messaggio: 180 di 200
Iscritto il: 26/11/2009, 01:30

Re: Minimi quadrati

Messaggioda Deckard » 30/10/2011, 15:31

Ops, scusami ma non so perché ti ho indicato il metodo per risolvere i minimi quadrati in generale, ovviamente in un caso lineare come questo usare qualcosa come Gauss-Newton è fuori luogo come dice dissonance.
Supponiamo di avere $m$ coppie $(x_i,y_i)$; è sufficiente costruire la matrice $m times 2$ $X$ formata da elementi $X_{ij} = x_i^j$ (ovvero una matrice costituita da due colonne: la prima contente tutte le $x_i$ la seconda le $x_i$ elevate al quadrato) e il vettore delle incognite $beta = (b, a)^T$. Quello che vorresti fare è risolvere il sistema $X beta = y$ dove $y = (y_1, ... , y_m)^T$. Ovviamente tale sistema non avrà soluzione. Vuoi quindi trovare il vettore $beta$ che più si avvicina a tale soluzione (che minimizza gli scarti quadratici). Con qualche semplice passaggio algebrico si può dimostrare che tale vettore è $beta = (X^T X)^{-1} X^T y$.
Non c'è bisogno quindi di usare nessun algoritmo, costruisci la matrice $X$ e il vettore $y$ e sei a posto.
http://www.mathcomp.leeds.ac.uk/turing2012/

Hilbert space is a big place.
Deckard
Junior Member
Junior Member
 
Messaggio: 212 di 295
Iscritto il: 17/08/2010, 09:58

Prossimo

Torna a Analisi Numerica e Ricerca Operativa

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite