Risposta
Transcript
Risposta
ESERCITAZIONE 3 1. Disegnare i grafici dei polinomi fondamentali di Lagrange di grado 5 su nodi equidistanti in [0, 1]. Risposta: Ricordiamo anzitutto che l’i-esimo polinomio fondamentale di Lagrange li (x), n soddisfa i = 1, ..., n, di grado n − 1 e relativo ai nodi di interpolazione {xj }j=1 alle seguenti condizioni di interpolazione: ( 1 se i = j, li (xj ) = δij = 0 se i 6= j, ovvero li (x) passa per i punti (xj , δij ), j = 1, ..., n. Per determinare i suddetti polinomi memorizzeremo le ascisse e le ordinate dei punti (xj , δij ) nei vettori x ed y, rispettivamente. Poiché il vettore y relativo al polinomio li (x) ha tutte le componenti nulle tranne l’i-esima, che è uguale ad 1, esso può essere definito mediante la riga i-esima della matrice identica di ordine n. Ciò premesso di seguito riportiamo la function pflagrange.m, che consente di determinare e rappresentare graficamente i polinomi fondamentali di Lagrange di grado n e relativi ai nodi di interpolazione memorizzati in x: function pflagrange(x) % pflagrange.m % calcola e rappresenta graficamente i polinomi % fondamentali di Lagrange relativi ai nodi x % Input: % x nodi di interpolazione ordinati in senso % crescente % n=length(x); Y=eye(n); z=linspace(x(1),x(n)); for i=1:n y=Y(i,:); c_i=polyfit(x,y,n-1); l_i=polyval(c_i,z); plot(z,l_i,’b-’,x,y,’ro’) grid on title(sprintf(’l_%d (x)’,i)); pause disp(’strike any key to continue’) end return 1 Pertanto, per risolvere l’esercizio assegnato occorre digitare al prompt, i seguenti comandi: >>x=linspace(0,1,6); >>pflagrange(x); 2. Determinare i polinomi di grado 5, 9, 13 interpolanti la funzione di Runge 1 f (x) = 1+x 2 su nodi equidistanti degli intervalli [−5, 5] e [1, 2]. Rappresentare i grafici della funzione e dei polinomi in entrambi i casi. Successivamente ripetere l’esercizio utilizzando i nodi di Chebyshev 2i + 1 π , i = 0, ..., n ti = − cos n+1 2 relativi all’intervallo [−1, 1] opportunamente traslati nell’intervallo [a, b] di int + b+a ). Commentare i risultati. teresse (xi = b−a 2 i 2 Risposta: Di seguito riportiamo le function che consentono di risolvere l’esercizio assegnato. Nella function frunge.m viene definita la funzione da interpolare, ovvero la funzione di Runge. function fx=frunge(x) % frunge.m % funzione di Runge % fx=1./(1+x.^2); return Nella function ipolyf.m viene determinato e rappresentato graficamente il polinomio di grado n interpolante la funzione f su n+1 nodi, equidistanti oppure di Chebyshev, dell’intervallo (a,b). La scelta dei nodi di interpolazione avviene tramite il parametro di input kind: kind=1 implica la scelta dei nodi equidistanti, kind=2 implica la scelta dei nodi di Chebyshev. function c=ipolyf(f,n,kind,a,b) % ipolyf.m % determina e rappresenta graficamente il polinomio % di grado n interpolante la funzione f su n+1 nodi % equidistanti (kind=1) oppure su n+1 nodi % di Chebyshev (kind=2) dell’intervallo (a,b) % Input: % f nome della function in cui e’ definita % la funzione da interpolare % n grado del polinomio interpolante % kind scelta nodi di interpolazione % a,b estremi dell’intervallo di interpolazione % Output: 2 Figura 1 1 0.5 0 −0.5 −1 −1.5 −5 −4 −3 −2 −1 0 1 2 3 4 5 % c coefficienti del polinomio interpolante % z=linspace(a,b); fz=feval(f,z); if kind==1 x=linspace(a,b,n+1); elseif kind==2 t=[0:n]; tx=-cos((2*t+1)/(n+1)*pi/2); x=(b-a)/2*tx+(b+a)/2; end y=feval(f,x); c=polyfit(x,y,n); p=polyval(c,z); plot(x,y,’go’,z,fz,’r’,z,p,’b’) axis(’square’) return Pertanto digitando al prompt i seguenti comandi: >>c=ipolyf(’frunge’,5,1,-5,5); >>hold on >>c=ipolyf(’frunge’,9,1,-5,5); >>c=ipolyf(’frunge’,13,1,-5,5); >>hold off otteniamo i grafici riportati in figura 1. Digitando poi i comandi: >>c=ipolyf(’frunge’,5,2,-5,5); >>hold on >>c=ipolyf(’frunge’,9,2,-5,5); >>c=ipolyf(’frunge’,13,2,-5,5); 3 Figura 2 1 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 −5 −4 −3 −2 −1 0 1 2 3 4 5 1.6 1.7 1.8 1.9 2 Figura 3 0.55 0.5 0.45 0.4 0.35 0.3 0.25 0.2 0.15 1 1.1 1.2 1.3 1.4 1.5 >>hold off otteniamo i grafici riportati in figura 2. Digitando infine: >>c=ipolyf(’frunge’,5,1,1,2); >>hold on >>c=ipolyf(’frunge’,9,1,1,2); >>c=ipolyf(’frunge’,13,1,1,2); >>hold off otteniamo i grafici riportati in figura 3. Grafici analoghi a quelli riportati in figura 3 si ottengono se si scelgono i nodi di Chebyshev nell’intervallo [1, 2]. 4 Dalle figure 1 e 2 evinciamo che nel caso dell’intervallo [−5, 5] il grafico del polinomio interpolante la funzione di Runge sui nodi di Chebyshev (vedi figura 2), a differenza di quello relativo ai nodi equidistanti (vedi figura 1), si avvicina sempre più al crescere di n al grafico della funzione di Runge. Osserviamo inoltre che nel caso del polinomio interpolante su nodi equidistanti (vedi figura 1) l’ampiezza delle oscillazioni vicino agli estremi dell’intervallo [−5, 5] aumenta al crescere del grado del polinomio, ovvero del numero dei punti di interpolazione. Infine, nel caso dell’intervallo [1, 2] il polinomio interpolante costruito sui nodi di Chebyshev e quello costruito sui nodi equidistanti hanno lo stesso comportamento: il grafico di entrambi i polinomi “praticamente” si confonde con quello della funzione interpolata (vedi figura 3). 3. Implementare gli algoritmi Difdiv e Interp per la costruzione e la valutazione del polinomio di Newton interpolante i dati (xi , yi ), i = 1, ..., n. Testare i precedenti programmi. Risposta: Di seguito riportiamo le function difdiv.m e interp.m in cui vengono implementati gli algoritmi Difdiv e Interp, rispettivamente: function a = difdiv(x,y) % difdiv.m % determina i coefficienti della rappresentazione % di Newton del polinomio interpolante i dati (x(i),y(i)) % Input: % x vettore ascisse % y vettore ordinate % Output: % a coefficienti polinomio di Newton % n=length(x); for i=1:n-1 for j=n:-1:i+1 y(j)=(y(j)-y(j-1))/(x(j)-x(j-i)); end end a=y; return function p = interp(x,a,z) % interp.m % valutazione del polinomio % p(x)=a(1)+a(2)*(x-x(1))+a(3)*(x-x(1))*(x-x(2))+... % +a(n)*(x-x(1))*...(x-x(n-1)) % nei punti del vettore z mediante algoritmo di Horner % Input: 5 % x vettore ascisse % a coefficienti polinomio di Newton % z vettore punti di valutazione % Output: % p vettore valutazioni % n=length(x); p=a(n)*ones(size(z)); for k=n-1:-1:1 p=(z-x(k)).*p+a(k); end return 4. L’algoritmo Difdiv consta di due cicli, uno interno all’altro. Vettorizzando opportunamente, è possibile eliminare il ciclo più interno? Risposta: E’ possibile eliminare il ciclo più interno, sostituendo ad esso l’istruzione: y(i+1:n)=(y(i+1:n)-y(i:n-1))./(x(i+1:n)-x(i:n-i)) 5. Utilizzando il comando polyfit di MATLAB si determinino i coefficienti della funzione 2 X ak e−kx f2 (x) = k=0 1 passante per i punti (0, 1), (1, − 12 ) (2, − 16 ). Successivamente, si rappresentino graficamente la funzione f2 e i punti assegnati. Risposta: Per determinare i coefficienti ai , i = 0, 1, 2, mediante il comando polyfit di MATLAB, dobbiamo trasformare la somma esponenziale f2 in un polinomio algebrico. A tal fine introduciamo il cambiamento di variabile x = − log(t), ovvero poniamo t = e−x , nell’espressione di fn e denotiamo con p2 (t) il polinomio che così si ottiene: p2 (t) := f2 (− log(t)) = 2 X ak tk k=0 Quindi determiniamo i coefficienti ai con il comando polyfit imponendo il passaggio del polinomio p2 per i punti (ti , yi ), i = 0, 1, 2, ove ti = e−xi e (xi , yi ) sono i dati assegnati. Pertanto, digitiamo: >>x=[0:2]; >>t=exp(-x); >>y=[1 -1/2 -1/16]; >>a=polyfit(t,y,2); 6 Figura 6 1.2 1 0.8 0.6 0.4 0.2 0 −0.2 −0.4 −0.6 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 a = 4.9202 -4.3573 0.4371 >>z=linspace(0,2); >>f2=polyval(a,exp(-z)); >>plot(x,y,’ro’,z,f2) Il grafico ottenuto è stato riportato in figura 6. Osserviamo che le condizioni p2 (ti ) = yi , i = 0, 1, 2 definiscono univocamente il polinomio p2 in quanto i punti ti = e−xi , i = 0, 1, 2, sono distinti essendo gli xi assegnati distinti. Dall’unicità di p2 segue, in particolare, l’unicità di f2 . 7. Determinare il polinomio e la spline cubica con condizione not-a-knot, che interpolano la funzione f (x) = |x| su 10 e 20 nodi equidistanti dell’intervallo [−2, 2]. Rappresentare i relativi grafici e commentare i risultati ottenuti. Successivamente ripetere l’esercizio utilizzando i nodi di Chebyshev. Risposta: Innanzitutto definiamo la funzione da interpolare in una function che denominiamo fabs.m: function fx=fabs(x) % fabs.m % fx=abs(x); return Quindi digitiamo >>z=linspace(-2,2); >>fz=feval(’fabs’,z); >>x=linspace(-2,2,10); >>y=feval(’fabs’,x); >>a=difdiv(x,y); >>p=interp(x,a,z); >>s=spline(x,y,z); 7 Figura 8 3 2 1 0 −1 −2 −3 −4 −5 −2 −1.5 −1 −0.5 0 0.5 1 1.5 2 >>plot(x,y,’go’,z,p,’b’,z,s,’g’,z,fz,’r’) >>hold on >>x=linspace(-2,2,20); >>y=feval(’fabs’,x); >>a=difdiv(x,y); >>p=interp(x,a,z); >>s=spline(x,y,z); >>plot(x,y,’go’,z,p,’b’,z,s,’g’) I grafici ottenuti sono stati riportati nella figura 8. Osserviamo che, nel caso dei nodi di interpolazione equidistanti, la spline interpolante converge alla funzione interpolata, mentre il polinomio interpolante presenta delle oscillazioni vicino agli estremi sempre più ampie al crescere di n. Consideriamo ora i nodi di Chebyshev: >>z=linspace(-2,2); >>fz=feval(’fabs’,z); >>n=9; >>t=[0:n]; >>tx=-cos((2*t+1)/(n+1)*pi/2); >>x=2*tx; >>y=feval(’fabs’,x); >>a=difdiv(x,y); >>p=interp(x,a,z); >>s=spline(x,y,z); >>plot(x,y,’go’,z,p,’b’,z,s,’g’,z,fz,’r’) >>hold on >>n=19; >>t=[0:n]; >>tx=-cos((2*t+1)/(n+1)*pi/2); >>x=2*tx; >>y=feval(’fabs’,x); >>a=difdiv(x,y); >>p=interp(x,a,z); >>s=spline(x,y,z); 8 Figura 9 2.5 2 1.5 1 0.5 0 −2 −1.5 −1 −0.5 0 0.5 1 1.5 2 >>plot(x,y,’go’,z,p,’b’,z,s,’g’) I grafici ottenuti sono stati riportati nella figura 9. Osserviamo che, nel caso dei nodi di interpolazione di Chebyshev, sia la spline che il polinomio interpolante convergono alla funzione interpolata. 9. Utilizzando il comando c=polyfit(x,y,n) di MATLAB, costruire la retta di regressione (n=1) per l’approssimazione dei punti (xi , yi ), i = 1, ..., 11 le cui ascisse ed ordinate sono memorizzate nei vettori x=[1 1 1 1 1 2 3 4 5 5 5] y=[1.1 1.05 1.12 1.07 2 2.1 3.05 3.7 4 4.8 5.2], rispettivamente. Successivamente per gli stessi dati ripetere l’esercizio con n=2,3. Rappresentare graficamente i polinomi ottenuti. Risposta: Per risolvere l’esercizio assegnato digitiamo: >>x=[1 1 1 1 1 2 3 4 5 5 5]; >>y=[1.1 1.05 1.12 1.07 2 2.1 3.05 3.7 4 4.8 5.2]; >>z=linspace(0,6); >>c=polyfit(x,y,1); >>p=polyval(c,z); >>plot(z,p,’b-’,x,y,’ro’) >>grid on >>c=polyfit(x,y,2); >>p=polyval(c,z); >>plot(z,p,’b-’,x,y,’ro’) >>grid on >>c=polyfit(x,y,3); >>p=polyval(c,z); >>plot(z,p,’b-’,x,y,’ro’) >>grid on Il grafico della retta di regressione è stato riportato in figura 10. 9 Figura 10 n=1 6 5 4 3 2 1 0 0 1 2 3 10 4 5 6
Documenti analoghi
Grafica 3D e interpolazione - Dipartimento di Matematica
Attenzione! Nel corso di Calcolo Numerico avete definito la matrice di Vandermonde
con l’ordine opposto delle colonne e corrispondentemente la condizione di interpolazione
come V ~a = ~y ove ~a = [...
Lezione 7. - lucia gastaldi
La function polyval valuta il valore di un polinomio in una griglia
di punti usando l’algoritmo di Horner Ruffini.
y=polyval(p,z)
restituisce il vettore y contenente i valori di un polinomio di gra...