18.01.2015 Views

Appunti di Calcolo Numerico - Esercizi e Dispense - Università degli ...

Appunti di Calcolo Numerico - Esercizi e Dispense - Università degli ...

Appunti di Calcolo Numerico - Esercizi e Dispense - Università degli ...

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.

12. PRIMI PASSI IN MATLAB®<br />

else<br />

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

% V matrice <strong>di</strong> Vandermonde c o s t r u i t a in maniera r i c o r s i v a<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 />

% i l v e t t o r e p contiene i c o e f f i c i e n t i del polinomio i n t e r p o l a t o r e<br />

% in or<strong>di</strong>ne c r e s c e n t e − p0 p1 p2 . . .<br />

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

% t a l e polinomio in piu ’ punti , dobbiamo s c r i v e r l i in or<strong>di</strong>ne decrescente<br />

p=p(n+1: −1:1);<br />

end<br />

Osserviamo che abbiamo usato l’istruzione error per mostrare un messaggio <strong>di</strong> errore e far interrompere<br />

l’esecuzione della function, nel caso in cui i dati <strong>di</strong> input x e y non abbiano la stessa lunghezza. La stringa<br />

’MATLAB:interpmonom’ è una stringa <strong>di</strong> identificazione dell’errore (puù essere anche omessa), mentre la<br />

stringa ’i vettori x e y non hanno la stessa lunghezza’ è quella che viene visualizzata durante l’esecuzione del<br />

co<strong>di</strong>ce.<br />

La matrice V è stata costruita in maniera ricorsiva. Una volta calcolato il vettore p possiamo valutare il<br />

polinomio <strong>di</strong> interpolazione me<strong>di</strong>ante la polyval.<br />

Riprendendo l’esempio <strong>di</strong> prima, con x,y,xx,yy già dati:<br />

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

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

Per quanto riguarda l’interpolazione <strong>di</strong> Lagrange, si considerino le due functions che chiamamo<br />

lagrange e interplagrange rispettivamente. La prima valuta l’i -simo polinomio <strong>di</strong> Lagrange e l’altra<br />

valuta il polinomio <strong>di</strong> interpolazione <strong>di</strong> Lagrange in un assegnato punto (o nelle componenti <strong>di</strong> un vettore).<br />

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

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

% function che calcola i l polinomio i−simo <strong>di</strong> Lagrange<br />

% valutandolo in xval<br />

% xval puo ’ e s s e r e uno s c a l are o un v e t t o r e<br />

% x − v e t t o r e d e l l e a s c i s s e da interpolare<br />

% yval e ’ un v e t t o r e colonna<br />

xval=xval ( : ) ;<br />

n=length ( x ) ;<br />

yval =ones ( length ( xval ) , 1 ) ; % s i crea un v e t t o r e <strong>di</strong> t u t t i 1<br />

for j =1:n<br />

i f j ~= i<br />

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

end<br />

end<br />

Scriviamo ora la seguente function in due mo<strong>di</strong>: la prima non è ottimale per MATLAB® , la seconda sì. Si<br />

osservino le <strong>di</strong>fferenze: nella prima usiamo un ciclo for, nella seconda no.<br />

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

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

% dati i v e t t o r i x e y da interpolare<br />

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

% in xval<br />

% xval puo ’ e s s e r e uno s c a l are o un v e t t o r e<br />

% questa function chiama la function lagrange ( xval , x , i )<br />

i f length ( x)~= length ( y )<br />

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

198

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

Saved successfully!

Ooh no, something went wrong!