Interpolazione ed approssimazione di funzioni Lucia Gastaldi Dipartimento di Matematica, http://dm.ing.unibs.it/gastaldi/ 9 novembre 2007
Outline 1 Polinomi Valutazione di un polinomio Algoritmo di Horner Ruffini 2 Interpolazione Polinomio interpolatore Errore di approssimazione Nodi di Chebyshev 3 Interpolazione a tratti Interpolazione a tratti Spline 4 Minimiquadrati lineari
Polinomi Un polinomio di grado n, con n intero non negativo, è una funzione del tipo n p(x) = a 0 + a 1 x + a 2 x 2 + + a n x n = a i x i dove a i R, per i = 0, 1, 2,..., n, sono i coefficienti del polinomio. Il polinomio è individuato dai coefficienti che devono essere memorizzati in un vettore. Nota bene In MATLAB i coefficienti devono essere ordinati a partire da quello corrispondente al termine di grado più elevato fino a quello di grado zero. I coefficienti nulli vanno esplicitati. Ad esempio al polinomio p(x) = 1 2x + 4x 3 si associa il vettore p=[4 0-2 1]. i=0
Algoritmo di Horner Ruffini L algoritmo di Horner Ruffini permette di calcolare il valore di un polinomio in un punto ad un costo computazionale inferiore rispetto all uso della formula n p(x) = a 0 + a 1 x + a 2 x 2 + + a n x n = a i x i. Consideriamo il polinomio p(x) = 1 2x + 5x 2 + 4x 3 ; questo si può scrivere anche nella forma seguente: p(x) = 1 + x ( 2 + x(5 + 4x)). i=0 Contiamo le operazioni Nel primo caso: 6 (1+2+3) moltiplicazioni + 3 somme per ciascuna componente di x Nel secondo caso: 3 moltiplicazioni + 3 somme per ciascuna componente di x
Algoritmo di Horner Ruffini In generale il polinomio p(x) = a 0 + a 1 x + a 2 x 2 + + a n x n può essere scritto nella forma di Horner: p(x) = a 0 + x (a 1 + x (a 2 + x ( (a n 1 + a n x)))). Numero di operazioni Nel primo caso: n(n + 1)/2 (1 + 2 + + n) moltiplicazioni + n somme per ciascuna componente di x Totale n (n + 3)N se N è il numero delle componenti di x 2 Nel secondo caso: n moltiplicazioni + n somme per ciascuna componente di x Totale 2nN se N è il numero delle componenti di x
polyval La function polyval valuta il valore di un polinomio in una griglia di punti usando l algoritmo di Horner Ruffini. y=polyval(p,x) restituisce il vettore y contenente i valori di un polinomio di grado n calcolati nei punti x. Il vettore p di n + 1 componenti deve contenere i coefficienti del polinomio corrispondenti alle potenze in ordine decrescente. Quindi per calcolare il valore del polinomio p(x) = 1 + 2x 4x 3 nei punti x distribuiti in maniera equispaziata nell intervallo [a, b] si può usare la seguente sequenza di comandi: >> x=linspace(-1,1,101); >> p=[-4 0 2 1]; >> y=polyval(p,x);
Esercizi Esercizio 1 Riportare in una stessa figura il grafico dei seguenti due polinomi: p 1 (x) = 1 3x 4x 2 + 2x 5 x [ 3/2, 3/2] p 2 (x) = 2 + 3x 2x 3 3x 4 x [ 3/2, 3/2] Esercizio 2 Sia x il vettore che contiene i punti dell intervallo [0.995, 1.005] equispaziati a distanza 10 4 (usare x=.995:1.e-4:1.005). Fare il grafico del polinomio: p(x) = x 6 6x 5 + 15x 4 20x 3 + 15x 2 6x + 1. Confrontare il grafico ottenuto con quello della funzione f (x) = (x 1) 6 nello stesso intervallo.
Interpolazione Problema Dati n + 1 punti (x i, f (x i )) per i = 0, 1,..., n si cerca un polinomio P n : R R tale che P n (x i ) = f (x i ) per i = 0, 1,, n. (1) Il polinomio P n è detto polinomio interpolatore di f e le condizioni (1) sono dette condizioni di interpolazione. Teorema di esistenza ed unicità del polinomio interpolatore Per ogni insieme di punti (x i, f (x i )) per i = 0, 1,, n, con gli x i distinti tra loro, esiste un unico polinomio di grado n, che indicheremo con P n f, tale che P n f (x i ) = f (x i ) per i = 0, 1,, n. Esso viene detto polinomio interpolatore dei valori f (x i ) nei nodi x i.
polyfit La function polyfit fornisce i coefficienti del polinomio interpolatore. La sintassi di polyfit è: p=polyfit(x,y,n) dove x contiene i nodi x i, y contiene i valori della funzione y i e n è il grado del polinomio interpolatore. Ad esempio: >> p=polyfit(nodi,y,4) p = 1.0417-13.0833 57.4583-102.4167 66.0000
Esercizio Calcolo dei coefficienti del polinomio interpolatore e sua rappresentazione Si consideri la funzione f (x) = (1 x 2 ) arctan x + e x nell intervallo [ 4, 4]. Dati i nodi x=[-3-1 2 3 ];, usare il comando polyfit per trovare i coefficienti del polinomio interpolatore. Riportare in una stessa figura il grafico del polinomio interpolatore e della funzione f. Suggerimento Per ottenere il grafico valutare il polinomio (usare il comando polyval) e la funzione in un numero appropriato di punti equispaziati nell intervallo dato (usare il comando linspace).
Errore di approssimazione Teorema: stima dell errore di interpolazione Dati n + 1 nodi di interpolazione x i per i = 0, 1,, n. Sia f una funzione derivabile con continuità n + 1 volte in un intervallo I contenente tutti i nodi di interpolazione e sia Π n il polinomio interpolatore nei nodi x i, allora per ogni x I, esiste un punto ξ I tale che E n (x) = f (x) P n (x) = f (n+1) (ξ) (n + 1)! n (x x i ). i=0
Funzione di Runge Si consideri la funzione di Runge f (x) = 1, x [ 1, 1]. 1 + 25x 2 Esercizio Interpolare con polinomi di grado n=2:2:12, la funzione data, usando n + 1 punti equispaziati nell intervallo [ 1, 1]. Confrontare il grafico di ciascun polinomio interpolatore con quello della funzione data. Calcolare per ciascun valore di n l errore commesso ossia E n = max a x b f (x) P n(x) Costruire un vettore contenente gli errori ottenuti per ciascun valore di n e riportare gli errori in un grafico in scala semilogaritmica semilogy(n,e).
Traccia per la risoluzione dell esercizio 1. Assegnare un vettore che contiene i valori di n. 2. Costruire il vettore xx dei punti per valutare tutti i polinomi. 3. Valutare la funzione in xx (risultato yy). 4. Per ogni valore di n (for i=1:length(n)) eseguire la seguente sequenza: Costruire il vettore x dei nodi con il comando linspace. Valutare la funzione nei nodi. Trovare i coefficienti del polinomio con il comando polyfit. Valutare il polinomio nei punti xx con il comando polyval (risultato py). Plottare la funzione e il polinomio di grado n (inserire una pausa pause). Calcolare l errore E(i)=norm(yy-py,inf)/norm(yy,inf). 5. Plottare l errore con il comando semilogy(n,e).
Interpolazione di Chebyshev Il fenomeno di Runge può essere evitato utilizzando opportune distribuzioni di nodi. Nell intervallo [a, b] consideriamo i nodi x i dati da: x i = a + b 2 + b a ˆx i 2 I punti ˆx i [ 1, 1] si dicono nodi di Chebyshev. Teorema di Bernstein con ˆx i = cos( πi ), i = 0,..., n. n Sia f : [a, b] R una funzione di classe C 1. Sia C n il polinomio interpolatore di grado n costruito usando i nodi di Chebyshev. Allora lim f C n = 0. n
Esercizio Esercizio Data una funzione f : [a, b] R. Scrivere una function per calcolare il valore del polinomio interpolatore C n di grado n di f, usando i nodi di Chebyshev. function[y]=chebyshev(f,a,b,n,x) Input: Output: f nome della funzione che si vuole interpolare a,b estremi dell intervallo in cui è definita la funzione n grado del polinomio x vettore dei punti in cui si deve valutare il polinomio y vettore dei valori del polinomio
Traccia per la risoluzione dell esercizio Costruire il vettore xh dei punti ˆx nell intervallo [ 1, 1] con il comando xh=-cos(pi*(0:n)/n). Costruire il vettore xc dei nodi di Chebyshev nell intervallo [a, b] con il comando xc=(a+b)/2+(b-a)*xh/2. Valutare la funzione nei nodi xc. Trovare i coefficienti del polinomio con il comando polyfit. Valutare il polinomio nei punti xx con il comando polyval (risultato y).
Esercizio Esercizio Interpolare con polinomi di grado n=2:2:12, la funzione di Runge, usando n + 1 punti di Chebyshev nell intervallo [ 1, 1]. Confrontare il grafico di ciascun polinomio interpolatore con quello della funzione data. Calcolare per ciascun valore di n l errore commesso ossia E n = max a x b f (x) C n(x) Costruire un vettore contenente gli errori ottenuti per ciascun valore di n e riportare gli errori in un grafico in scala semilogaritmica semilogy(n,e).
Traccia per la risoluzione dell esercizio 1 Assegnare un vettore che contiene i valori di n. 2 Costruire il vettore xx dei punti in cui si vorranno valutare tutti i polinomi. 3 Valutare la funzione in xx (risultato yy). 4 Per ogni valore di n (for i=1:length(n)) eseguire la seguente sequenza: Valutare il polinomio nei punti xx usando la function Chebyshev costruita in precedenza (risultato yc); Plottare la funzione e il polinomio di grado n. Calcolare l errore E(i)=norm(yy-yc,inf)/norm(yy,inf). 5 Plottare l errore con il comando semilogy(n,e).
Interpolazione a tratti Dato un intervallo I = [a, b], si introduce una partizione mediante un numero finito di punti a = x 0 < x 1 < < x m = b; I k = [x k 1, x k ], k = 1,, m indica il k-esimo sottointervallo. Definizione Si definisce polinomio a tratti una funzione g : [a, b] R tale che g(x) = p n (x) x I k, essendo p n (x) un polinomio di grado n.
Interpolazione lineare a tratti Sia f : [a, b] R una funzione sufficientemente regolare. Problema costruire un polinomio lineare a tratti che interpoli la funzione f nei nodi x i, i = 0,..., n. Consideriamo la partizione dell intervallo [x 0, x n ] data dai nodi x i. Quindi su ciascun intervallino [x i 1, x i ] i = 1,..., n il polinomio interpolatore a tratti è g(x) = f (x i 1 ) x x i + f (x i ) x x i 1 x i 1 x i x i x i 1
Stima dell errore di approssimazione Sia H = max 1 i n (x i x i 1 ). Sia f una funzione continua insieme alle sue derivate prima e seconda. Sia g il polinomio lineare a tratti definito prima. Per ogni i = 1,, n esiste un punto η i [x i 1, x i ] tale che f (x) g(x) = f (η i ) (x x i 1 )(x x i ) per x [x i 1, x i ], 2 da cui segue la seguente maggiorazione: max 1 i n max f (x) g(x) x i 1 x x i (x i x i 1 ) 2 max max f (x) H2 1 i n 2 x i 1 x x i 8 max f (x). a x b
interp1 >> yi=interp1(x,y,xi,metodo) x, y specificano le coordinate dei punti di interpolazione. xi sono i punti in cui si vuole valutare il valore interpolato. metodo è una stringa di caratteri che specifica il metodo da utilizzare: metodo= nearest si sceglie il valore nel nodo di interpolazione più vicino; metodo= linear interpolazione lineare a tratti; metodo= spline interpolazione con spline cubica; metodo= pchip o metodo= cubic interpolazione di Hermite cubica a tratti.
Spline Siano x i, per i = 0,, n, n + 1 nodi distinti e ordinati sull intervallo [a, b], tali che a = x 0 < x 1 < < x n = b. Definizione La funzione s m : [a, b] R è una funzione spline di grado m relativa ai nodi x i se s m (x) per x [x i 1, x i ], i = 1,, n, è un polinomio di grado m. La funzione s m è continua sull intervallo [a, b] insieme alle sue derivate fino all ordine m 1. La spline s 1 è una funzione lineare a tratti continua. La spline più usata è la spline cubica s 3. spline s=spline(x,y,xx) valuta nei punti xx, la spline cubica che passa per i punti di ascissa x e ordinata y.
Esercizio Esercizio Usare la function spline per interpolare la funzione di Runge nell intervallo [ 1, 1], usando n + 1 punti equidistribuiti nell intervallo dato essendo n=2:2:12. Confrontare il grafico di ciascun polinomio interpolatore con quello della funzione data. Calcolare per ciascun valore di n l errore commesso ossia E n = max f (x) s(x) a x b Costruire un vettore contenente gli errori ottenuti per ciascun valore di n e riportare gli errori in un grafico in scala semilogaritmica semilogy(n,e). Confrontare i risultati ottenuti con quelli relativi all interpolazione polinomiale con nodi equidistanti e con nodi di Chebyshev.
Le funzioni MATLAB per l interpolazione Funzione Significato interp1 Interpolazione in una tabella di punti (1D). interp1q Interpolazione lineare (1D). interpft Interpolazione mediante il metodo FFT. interp2 Interpolazione in una tabella di punti (2D). interp3 Interpolazione in una tabella di punti (3D). spline Spline cubica interpolante. griddata Interpolazione e fitting per superfici.
Minimi quadrati lineari in Matlab Per calcolare il polinomio di grado n che approssima i punti (x i, y i ) per i = 1,..., m nel senso dei minimi quadrati lineari si usa la function polyfit con il comando p=polyfit(x,y,n)
Approssimazione di dati Esercizio Il file FIAT.m contiene le quotazioni in borsa delle azioni Fiat relative all anno 2004. Nella prima colonna è contenuto il valore all apertura, nella seconda e nella terza il valore più alto e più basso, rispettivamente, della giornata, nella quarta colonna il valore alla chiusura. Per 1 n 10, calcolare il polinomio di grado n che dà la miglior approssimazione nel senso dei mininimi quadrati lineari relativamente a una delle 4 valutazioni. Per quale grado si ottiene l approssimazione migliore?