Capitolo 4 Laboratorio MATLAB sull - Esercizi e Dispense
Capitolo 4 Laboratorio MATLAB sull - Esercizi e Dispense
Capitolo 4 Laboratorio MATLAB sull - Esercizi e Dispense
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.