30.11.2014 Views

Capitolo 4 Laboratorio MATLAB sull - Esercizi e Dispense

Capitolo 4 Laboratorio MATLAB sull - Esercizi e Dispense

Capitolo 4 Laboratorio MATLAB sull - Esercizi e Dispense

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Capitolo</strong>4<br />

<strong>Laboratorio</strong> <strong>MATLAB</strong> <strong>sull</strong>’interpolazione<br />

L’interpolazione viene implementata mediante il metodo dei coefficienti<br />

indeterminati, i polinomi di Lagrange e le differenze divise di<br />

Newton. I casi test permettono di capire meglio i diversi approcci.<br />

Sommario<br />

4.1 L’interpolazione in <strong>MATLAB</strong> . . . . . . . . . . . . . . . . . . . . . 28<br />

4.2 Il metodo dei coefficienti indeterminati . . . . . . . . . . . . . 29<br />

4.3 Interpolazione di Lagrange . . . . . . . . . . . . . . . . . . . . . 31<br />

4.4 Formula di Newton con le differenze divise . . . . . . . . . . . 32<br />

4.5 Applicazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34<br />

4.5.1 Esempio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34<br />

4.5.2 Esempio di Runge . . . . . . . . . . . . . . . . . . . . . . . . . 34<br />

4.5.3 Effetti del malcondizionamento . . . . . . . . . . . . . . . . . 34<br />

4.1 L’interpolazione in <strong>MATLAB</strong><br />

In <strong>MATLAB</strong> esiste la function polyfitche, dati i vettori contenenti le ascisse e<br />

le ordinate da interpolare, di dimensione n + 1, e il grado m del polinomio(se m = n<br />

si ha interpolazione, se m < n si ha approssimazione), dà in output il vettore contenente<br />

i coefficienti del polinomio interpolante (o approssimante) in ordine decrescente<br />

[a m a m−1 ... a 0 ] in modo che il polinomio è p(x) = a m x m + a m−1 x m−1 + ... a 0 .<br />

L’algoritmo si basa sul processo di minimizzazione nel senso dei minimi quadrati.<br />

Nell’applicazionedell’algoritmovienecreata,dunque,unamatricediVandermonde.<br />

Questo può generare instabilità, come vedremo in alcuni esempi.<br />

Si faccia >> help polyfitper approfondimenti su questa function.<br />

Esempio:<br />

28


4.2. Il metodo dei coefficienti indeterminati 29<br />

>> x=[7 8 9 10];<br />

>> y=[3 1 1 9];<br />

>> p=polyfit(x,y,3)<br />

p =<br />

1.0000 -23.0000 174.0000 -431.0000<br />

Significa che il polinomio di interpolazione è:<br />

p(x) = x 3 − 23x 2 + 174x − 431<br />

Una volta ricavati i coefficienti, si può fare un grafico del polinomio di interpolazione<br />

utilizzandola function polyval.<br />

>> xx=linspace(x(1), x(4));<br />

>> yy=polyval(p,xx);<br />

>> plot(x,y,’o’, xx,yy)<br />

Con linspace viene creato un vettore di 100 punti equispaziati tra x(1) e x(4) -<br />

chesonogliestremidell’intervalloincuisistainterpolando. Con polyvalsivaluta<br />

il polinomio, i cui coefficienti sono dati dal vettore p, nei punti di xx.<br />

4.2 Il metodo dei coefficienti indeterminati<br />

Abbiamovisto che la manierapiù semplice (ma sconsigliata)per costruire il polinomio<br />

di interpolazione è di applicare il metodo dei coefficienti indeterminati:<br />

Con questo metodo si risolve il sistema la cui k-sima equazione è:<br />

n∑<br />

x k i a k = f(x i ),<br />

k=0<br />

e il cui determinate (di Vandermonde) è:<br />

n∏<br />

det(V ) = (x i − x j ), =<br />

0≤jj


30 <strong>Capitolo</strong> 4. <strong>Laboratorio</strong> <strong>MATLAB</strong> <strong>sull</strong>’interpolazione<br />

Osserviamochelaprimacolonnahatuttiglielementiugualia 1,lasecondacolonna<br />

ha le ascisse dei nodi da interpolare, la terza colonna ha i quadrati delle ascisse, e<br />

così via. Possiamo quindi pensare di scrivere questa matrice tenendo conto della<br />

colonna immediatamente precedente.<br />

Nel seguito riportiamo un semplice programmino <strong>MATLAB</strong> che trova i coefficienti<br />

del polinomio di interpolazione applicando il metodo dei coefficienti indeterminati:<br />

function p=interpmonom(x,y)<br />

% function p=interpmonom(x,y)<br />

% interpolazione monomiale<br />

% dati i valori x e y da interpolare si costruisce il vettore p<br />

% dei coefficienti del polinomio di interpolazione<br />

% applicando il metodo dei coefficienti indeterminati<br />

%<br />

% se x e y non sono gia’ vettori colonna li rendiamo tali<br />

% mediante le due istruzioni successive<br />

x=x(:);<br />

y=y(:);<br />

if length(x)˜=length(y)<br />

error(’<strong>MATLAB</strong>:interpmonom’,...<br />

’i vettori x e y non hanno la stessa lunghezza’)<br />

else<br />

n=length(x)-1;<br />

% V matrice di Vandermonde costruita in maniera ricorsiva<br />

V(:,1)= ones(n+1, 1);<br />

for i=2:n+1<br />

V(:,i)= x.*V(:,i-1);<br />

end<br />

p=V\y;<br />

% il vettore p contiene i coefficienti del polinomio interpolatore<br />

% in ordine crescente - p0 p1 p2...<br />

% se vogliamo usare la function del <strong>MATLAB</strong> polyval per valutare<br />

% tale polinomio in piu’ punti, dobbiamo scriverli in ordine decrescente<br />

for i=1:n+1<br />

aux(i)=p(n+2-i);<br />

end<br />

p=aux;<br />

end<br />

✎ Osserviamo che abbiamousato l’istruzione error per mostrare un messaggio<br />

di errore e far interrompere l’esecuzione della function,nel caso in cui i dati<br />

diinput xeynonabbianolastessalunghezza. Lastringa ’<strong>MATLAB</strong>:interpmonom’<br />

è una stringa di identificazione dell’errore (puù essere anche omessa), men-


4.3. Interpolazione di Lagrange 31<br />

tre la stringa ’i vettori x e y non hanno la stessa lunghezza’ è<br />

quella che viene visualizzatadurante l’esecuzione del codice.<br />

I tre puntini ... servono per andare a capo e continuare a scrivere un’istruzione<br />

troppo lunga.<br />

✎ La matrice V è stata costruita in maniera ricorsiva.<br />

✎ Unavoltacalcolato ppossiamovalutareilpolinomiodiinterpolazionemediante<br />

la polyval.<br />

4.3 Interpolazione di Lagrange<br />

Lo stesso polinomio di interpolazione può essere scritto mediante la formula di<br />

Lagrange:<br />

n∑<br />

p(x) = L (n)<br />

i<br />

(x)y i<br />

i=0<br />

dove l’i-simo polinomio di Lagrange è dato da:<br />

L (n)<br />

i<br />

(x) = (x − x 0)(x − x 1 )... (x − x i−1 )(x − x i+1 )... (x − x n )<br />

(x i − x 0 )(x i − x 1 )... (x i − x i−1 )(x i − x i+1 )... (x i − x n )<br />

Scriviamo ora due functions, una che valuta l’i-simo polinomio di Lagrange<br />

e l’altra che valuta il polinomio di Lagrange in un assegnato punto (o nelle<br />

componenti di un vettore) x.<br />

function yval=lagrange(xval, x,i)<br />

% function yval=lagrange(xval, x,i)<br />

% function che calcola il polinomio i-simo di Lagrange<br />

% valutandolo in xval<br />

% xval puo’ essere uno scalare o un vettore<br />

% x - vettore delle ascisse da interpolare<br />

xval=xval(:);<br />

n=length(x);<br />

yval =ones(length(xval),1);<br />

for j=1:n<br />

if j˜=i<br />

yval=yval.*(xval-x(j))/(x(i) -x(j) );<br />

end<br />

end<br />

Osserviamocheinquestafunction xvalpuòesseresiaunoscalarecheunintero<br />

vettore, per cui anche yvalècostruito inmodoche nonci sianoproblemi perchè sia<br />

un vettore (si noti che è definito vettorialmente e che vi è .* nella produttoria, in<br />

modo da fare quel prodotto componente per componente dei vettori coinvolti).


32 <strong>Capitolo</strong> 4. <strong>Laboratorio</strong> <strong>MATLAB</strong> <strong>sull</strong>’interpolazione<br />

Scriviamo poi la function interplagrange.mche calcola il polinomio di Lagrange<br />

in un punto (o vettore) xval assegnato:<br />

function yval=interplagrange(xval, x,y)<br />

% function yval=interplagrange(xval, x,y)<br />

% dati i vettori x e y da interpolare<br />

% la function implementa l’interpolazione di Lagrange valutandola<br />

% in xval<br />

% xval puo’ essere uno scalare o un vettore<br />

% viene chiamata la function lagrange(xval, x,i)<br />

if length(x)˜=length(y)<br />

error(’<strong>MATLAB</strong>:interplagrange’, ...<br />

’i vettori x e y non hanno la stessa lunghezza’)<br />

else<br />

xval=xval(:);<br />

yval=zeros(length(xval),1);<br />

n=length(x)-1;<br />

% n grado del polinomio<br />

for i=1:n+1<br />

yval = yval + lagrange(xval,x,i)*y(i) ;<br />

end<br />

end<br />

Eseguiamo l’esempio di prima per vedere cosa si ottiene:<br />

>> yy=interplagrange(xx,x,y);<br />

>> plot(x,y,’o’, xx,yy)<br />

4.4 Formula di Newton con le differenze divise<br />

Lo stesso approccio può essere utilizzato per scrivere delle function che calcolano<br />

il valore del polinomio di interpolazione mediate le differenze divise di Newton.<br />

In [4] vi è descritta una functionche implementa l’algoritmo delle differenze<br />

divise.<br />

Nel seguito scriviamo due functions, la prima che scrive la tabella delle differenze<br />

divise esattamente come sono state studiate a lezione, la seconda che valuta<br />

il polinomio di interpolazione implementando l’algoritmo di Horner in modo da<br />

minimizzareil numero delle operazioni da eseguire.<br />

function table=divdif(x,y)<br />

% function table=divdif(x,y)<br />

% x - ascisse dei dati da interpolare<br />

% y - ordinate dei dati da interpolare<br />

% table - tabella delle differenze divise


4.4. Formula di Newton con le differenze divise 33<br />

x=x(:);<br />

y=y(:);<br />

n=length(x);<br />

m=length(x);<br />

if n˜=m<br />

error(’<strong>MATLAB</strong>:differenze_divise’,’errore sui dati’)<br />

else<br />

table=zeros(n,n);<br />

table(:,1)=y;<br />

for j=2:n<br />

for k=2:j<br />

table(j,k)= ( table(j,k-1) - table(j-1,k-1) )/ (x(j) - x(j-k+1) );<br />

end<br />

end<br />

end<br />

La diagonale principale della matrice table ha i coefficienti a 0 , a 1 , ...a n del<br />

polinomio di interpolazione. Il polinomio è dunque:<br />

p(x) = a 0 + a 1 (x − x 0 ) + a 2 (x − x 0 )(x − x 1 ) + ... + a n (x − x 0 )(x − x 1 ) · · · (x − x n−1 )<br />

Per valutarloin un punto x eseguiamoiseguenti passaggi, applicando, in tal modo,<br />

l’algoritmo di Horner:<br />

p = a n<br />

p = p(x − x n−1 ) + a n−1<br />

= a n (x − x n−1 ) + a n−1<br />

p = p(x − x n−2 ) + a n−2<br />

.<br />

= a n (x − x n−1 )(x − x n−2 ) + a n−1 (x − x n−2 ) + a n−2<br />

p = p(x − x 0 ) + a 0<br />

= a n (x − x n−1 )(x − x n−2 )... (x − x 1 )(x − x 0 ) + ... + a 1 (x − x 1 )(x − x 0 ) + a 0<br />

= a 0 + a 1 (x − x 0 )(x − x 1 ) + ... + a n (x − x 0 )(x − x 1 )...(x − x n−2 )(x − x n−1 )<br />

La functionda scrivere è dunque:<br />

function yval=interpdivdif(xval,x,table)<br />

% function yval=interpdivdif(xval,x,table)<br />

% x - ascisse dei dati da interpolare<br />

% table - tabella delle differenze divise, ottenuta dalla function divdif<br />

% xval - array di valori in cui calcolare il polinomio interpolatore<br />

% puo’ essere un singolo punto o un insieme di punti<br />

% yval - valore (o valori) del polinomio interpolatore valutato in xval


34 <strong>Capitolo</strong> 4. <strong>Laboratorio</strong> <strong>MATLAB</strong> <strong>sull</strong>’interpolazione<br />

% nel calcolo del polinomio interpolatore,<br />

% si applica l’algoritmo di Horner<br />

xval=xval(:);<br />

x=x(:);<br />

n=length(x)-1;<br />

yval=table(n+1,n+1)*ones(length(xval),1);<br />

for j=n:-1:1<br />

yval=yval.*(xval-x(j)) + table(j,j);<br />

end<br />

4.5 Applicazioni<br />

Per ciascuno dei casi test proposti nel seguito, si calcoli il polinomio di interpolazione<br />

usando la polyfit del <strong>MATLAB</strong> e le functionsda noi scritte interpmonom,<br />

lagrange, interplagrange, divdif, interpdivdif.<br />

Si faccia il grafico dei polinomi di interpolazione.<br />

4.5.1 Esempio<br />

Data la tabella<br />

x i -1 0 1 2<br />

y i 1 1 2 0<br />

determinare il polinomio di interpolazione di grado 3 e mostrare (mediante grafico)<br />

che le functionesaminate prima danno i medesimi risultati.<br />

4.5.2 Esempio di Runge<br />

Si consideri la funzione di Runge<br />

f(x) =<br />

1<br />

1 + 25x 2 x ∈ [−1,1]<br />

Si scelgano n + 1 punti equidistanti nell’intervallo [−1,1] ponendo h = 2/n e<br />

x i = −1 + ih, con i = 0,1,... ,n. Si calcolino i corrispondenti valori y i = f(x i ).<br />

Con le varie tecniche esaminate prima si costruisca il polinomio di interpolazione<br />

di grado n, prima con n = 5 e poi con n = 10 e si faccia un grafico in cui si<br />

confrontino i profili dei polinomi ottenuti con le varie tecniche e il profilo della f.<br />

4.5.3 Effetti del malcondizionamento<br />

Si voglia studiare l’interpolazione dei seguenti dati 1 :<br />

1 L’esempio è tratto da [1, 2]


4.5. Applicazioni 35<br />

x i 1200.5 1201.5 1202.5 1203 1204 1205<br />

y i 3 1.5 1.5 1 1 0<br />

Confrontando i vari algoritmi di interpolazione, osserveremo che gli algoritmi<br />

di Lagrange e delle differenze divise di Newton danno buoni risultati. Al contrario,<br />

la polyfite il metodo dei coefficienti indeterminati dannorisultati disastrosi.<br />

Osserviamo che, dal punto di vista teorico i risultati dovrebbero essere identici.<br />

3.5<br />

3<br />

dati<br />

polyfit<br />

coefficienti indeterminati<br />

lagrange<br />

differenze divise<br />

2.5<br />

2<br />

1.5<br />

1<br />

0.5<br />

0<br />

−0.5<br />

1200.5 1201 1201.5 1202 1202.5 1203 1203.5 1204 1204.5 1205<br />

Perchè si hannoquesti risultati? Bisogna tener conto di tre aspetti:<br />

✎ Il calcolo della matrice del sistema V;<br />

✎ la soluzione del sistema lineare V p = y;<br />

✎ il calcolo dei valori del polinomio.<br />

La matrice di Vandermonde consiste di colonne che crescono di colonna in colonna<br />

- 1, x i , x 2 i , x3 i , ..., x5 i . Per questo caso test, si va da 1 a elementi dell’ordine di<br />

10 15 . La matrice è molto mal condizionata. Stesso discorso vale quando si applica<br />

la polyfit.<br />

A questo punto, la soluzione del sistema lineare - sia quello che si ha nella<br />

interpmonom,siaquellochevienerisoltonella polyfit-nonpuòdarerisultatiaffidabili.<br />

E difatti <strong>MATLAB</strong> fornisce un messaggio di warning durante l’esecuzione<br />

di entrambe le function.<br />

Quindi il il vettore che fornisce i coefficienti del polinomio interpolatore è completamente<br />

errato - siache venga calcolatomedianteicoefficienti indeterminatisia<br />

attraversola polyfit-elesuecomponentihannoun’enormedifferenza,intermini<br />

di ampiezza:<br />

>> c=interpmonom(x,y)<br />

Warning: Matrix is close to singular or badly scaled.<br />

Results may be inaccurate. RCOND = 1.017504e-31.<br />

(Type "warning off <strong>MATLAB</strong>:nearlySingularMatrix" to suppress this warning.


36 <strong>Capitolo</strong> 4. <strong>Laboratorio</strong> <strong>MATLAB</strong> <strong>sull</strong>’interpolazione<br />

)<br />

> In /u1/dmsa/matlab/mazzia/programmivari/interpmonom.m at line 14<br />

c =<br />

-1.2871e-01 7.7407e+02 -1.8621e+06 2.2396e+09 -1.3469e+12 3.240<br />

0e+14<br />

>> p=polyfit(x,y,5)<br />

Warning: Polynomial is badly conditioned. Remove repeated data points<br />

or try centering and scaling as described in HELP POLYFIT.<br />

(Type "warning off <strong>MATLAB</strong>:polyfit:RepeatedPointsOrRescale" to suppress<br />

this warning.)<br />

> In /usr/local/matlab13/toolbox/matlab/polyfun/polyfit.m at line 75<br />

p =<br />

-5.9038e-02 3.5507e+02 -8.5421e+05 1.0275e+09 -6.1796e+11 1.4866e+14<br />

A questo corrisponde, nell’algoritmo per la valutazione del polinomio stesso, il<br />

fenomeno della cancellazione numerica per cui si ha una significativa perdita di<br />

accuratezza e il grafico risultante presenta quel profilo altamente oscillante che si<br />

è potuto osservare.<br />

Si provi infatti a valutare il valore in 1200.5 e in 1204 del polinomio ottenuto<br />

con il metodo dei coefficienti indeterminati e del polinomio ottenuto tramite la<br />

polyfit.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!