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