• Non ci sono risultati.

1Introduzione Splines

N/A
N/A
Protected

Academic year: 2021

Condividi "1Introduzione Splines"

Copied!
17
0
0

Testo completo

(1)

30 giugno 2007

1 Introduzione

Si è visto che nel caso dell’interpolazione polinomiale, dati N +1 punti a = x0<... <

xN=b, e i valori y0,..., yNivi assunti da una funzione y = f (x), esiste uno ed un solo

polinomio pNdi grado N tale che

pN(xi) = fi, i = 0,..., N . (1)

Nel caso di nodi equispaziati

xk=a + k(b − a)

N , k = 0,..., N ; (2)

al crescere di N , non si puó garantire che f (x)−pn(x) tenda a 0 (si ricordi il fenomeno

di Runge!).

Piú in generale per un teorema di Faber, qualsiasi sia l’insieme di nodi relativi all’intervallo limitato [a,b] esiste una funzione continua f tale che l’interpolante Pnin tale set di

punti non converge uniformemente a f (per n → ∞). In altre parole al tendere di

n → +∞, non si ha

lim

N →∞x∈[a,b]max

|f (x) − PN(x)| → 0.

Sorge spontaneo chiedersi se qualora si possegga un gran numero di punti, anche equispaziati, sia possibile calcolare un’approssimante di tipo polinomiale per cui al crescere di N si abbia pNf .

Una risposta è stata data nel 1946 da Schoenberg, lo scopritore delle splines. Il primo caso è quello delle splines di grado 1, cioè funzioni che in ogni intervallo [xi, xi +1] (per i = 0,..., N − 1) sono polinomi di grado m = 1 e globalmente funzioni

di classe Cm−1=C0, cioè continue.

Il caso generale di splines di grado m risulta piú complicato. Un esempio notevole è quello delle splines cubiche s3, cioè funzioni che in ogni intervallo [xi, xi +1] (per i =

0,..., N − 1) siano polinomi di grado m = 3 e globalmente funzioni di classe Cm−1= C2.

(2)

Osserviamo infatti che in ogni intervallo [xi, xi +1] le spline si possano rappresentare

come

s3(x) = c1,i+c2,i(x − xi) + c3,i(x − xi)2+c4,i(x − xi)3, i = 0,..., N − 1

e quindi per determinare s3in {xi}i =0,...,N servano 4N valori ci , j. Da ragionamenti

sulle proprietá della regolaritá della spline interpolante si vede che sono disponibili solo 4N −2 condizioni (di cui N +1 dal fatto che s3(xi) = fi). Si procede richiedendo

quindi una delle seguenti proprietá aggiuntive a s3:

Spline naturale: s(2)3 (a) = s3(2)(b) = 0.

Spline periodica: s(1)3 (a) = s3(1)(b), s(2)3 (a) = s(2)3 (b).Spline vincolata: s(1)3 (a) = f(1)(a), s(1)

3 (b) = f(1)(b).

Per altri tipi di splines come lenot a knot o le Hermite si veda [1], p. 170-171.

2 Splines in Matlab ed Octave

Tra le toolbox di Matlab/Octave, si spera di trovare una procedurasplineche es-egua l’interpolante lineare spline. Quindi è naturale digitare dalla shell di Matlab/Octave

help spline. Si ottiene un’aiuto del tipo

SPLINE Cubic spline data interpolation.

YY = SPLINE(X,Y,XX) uses cubic spline interpolation to find YY, the values of the underlying function Y at the points in the vector XX.

The vector X specifies the points at which the data Y is given. If Y is a matrix, then the data is taken to be vector-valued and interpolation is performed for each column of Y and YY will be length(XX)-by-size(Y,2).

PP = SPLINE(X,Y) returns the piecewise polynomial form of the cubic spline interpolant for later use with PPVAL and the spline utility UNMKPP.

Ordinarily, the not-a-knot end conditions are used. However, if Y contains two more values than X has entries, then the first and last value in Y are used as the endslopes for the cubic spline. Namely:

f(X) = Y(:,2:end-1), df(min(X)) = Y(:,1), df(max(X)) = Y(:,end) Example:

(3)

0 1 2 3 4 5 6 7 −1 −0.8 −0.6 −0.4 −0.2 0 0.2 0.4 0.6 0.8 1 0 1 2 3 4 5 6 7 −1 −0.8 −0.6 −0.4 −0.2 0 0.2 0.4 0.6 0.8 1

(4)

x = 0:10; y = sin(x); xx = 0:.25:10;

yy = spline(x,y,xx); plot(x,y,’o’,xx,yy) Example:

This illustrates the use of clamped or complete spline inter-polation where end slopes are prescribed. Zero slopes at the ends of an interpolant to the values of a certain distribution are enforced:

x = -4:4; y = [0 .15 1.12 2.36 2.36 1.46 .49 .06 0]; cs = spline(x,[0 y 0]);

xx = linspace(-4,4,101);

plot(x,y,’o’,xx,ppval(cs,xx),’-’);

See also INTERP1, PPVAL, SPLINES (The Spline Toolbox). L’help è interessante per diversi motivi.

1. Si capisce che la functionsplinenon è adatta ai nostri propositi, perchè serve per il calcolo di spline cubiche (e non lineari). Le utilizzeremo nella prossima lezione.

2. Il primo esempio ci dice come svolgere parte dell’esercizio. Consideriamo la porzione di codice

x = 0:10; y = sin(x); xx = 0:.25:10;

yy = spline(x,y,xx); plot(x,y,’o’,xx,yy)

Si capisce subito che valuta su una griglia di numeri naturali x = 0,...,10 la funzione sin(x), la approssima con spline (cubiche!) interpolanti in tale in-sieme di ascisse (xi,sin(xi)). Proprio quello che vogliamo fare con le spline

lineari a tratti (se solo avessimo la routine adatta e cambiassimo il set di as-cisse, adattandolo al nostro caso).

3. Suggerisce di guardareinterp1. Proviamo su Matlab/Octavehelp interp1. Con un po’ di fatica capiamo che pare essere la routine giusta.

In una versione abbastanza recente di Matlab troviamo la seguente descrizione INTERP1 1-D interpolation (table lookup).

(5)

YI = INTERP1(Y,XI) assumes X = 1:N, where N is the length(Y) for vector Y or SIZE(Y,1) for matrix Y.

Interpolation is the same operation as "table lookup". Described in "table lookup" terms, the "table" is [X,Y] and INTERP1 "looks-up" the elements of XI in X, and, based upon their location, returns values YI interpolated within the elements of Y.

YI = INTERP1(X,Y,XI,’method’) specifies alternate methods. The default is linear interpolation. Available methods are:

’nearest’ - nearest neighbor interpolation ’linear’ - linear interpolation

’spline’ - piecewise cubic spline interpolation (SPLINE) ’pchip’ - piecewise cubic Hermite interpolation (PCHIP) ’cubic’ - same as ’pchip’

’v5cubic’ - the cubic interpolation from MATLAB 5, which does not extrapolate and uses ’spline’ if X is not equally spaced.

YI = INTERP1(X,Y,XI,’method’,’extrap’) uses the specified method for extrapolation for any elements of XI outside the interval spanned by X.

Alternatively, YI = INTERP1(X,Y,XI,’method’,EXTRAPVAL) replaces these values with EXTRAPVAL. NaN and 0 are often used for EXTRAPVAL.

The default extrapolation behavior with four input arguments is ’extrap’ for ’spline’ and ’pchip’ and EXTRAPVAL = NaN for the other methods.

For example, generate a coarse sine curve and interpolate over a finer abscissa:

x = 0:10; y = sin(x); xi = 0:.25:10; yi = interp1(x,y,xi); plot(x,y,’o’,xi,yi)

See also INTERP1Q, INTERPFT, SPLINE, INTERP2, INTERP3, INTERPN. Con un po’ di fatica capiamo che la routine che fa al caso nostro è v = interp1(x,y,u,’linear’)

dove

1. x,y sono rispettivamente i vettori di ascisse e ordinate dei punti in cui si desidera interpolare; in altre parole si cerca la funzione lineare a tratti s1tale

che s1(xi) = yi.

2. seuun insieme di ascisse prescelto dall’utente (ad esempio per plottare s1)

(6)

Per quanto visto deduciamo che in Matlab/Octave, i problemi dell’interpolazione spline sono semplificati dall’utilizzo, dei comandisplineeinterp1.

Più precisamente:

1. Per quanto riguarda la spline cubica (not a knot) che interpola le coppie (xi, yi),

il suo valore vi nei punti ui è dato da

v=spline(x,y,u).

2. Simili risultati possono essere raggiunti dal comandointerp1. Cosí

v = interp1(x,y,u,’linear’);

v = interp1(x,y,u,’spline’);

v = interp1(x,y,u,’cubic’);

forniscono i valori videll’interpolante lineare, cubica not a knot e cubica

Her-mite nei punti ui.

Rimandiamo i dettagli sul loro utilizzo all’help in linea e agli esempi allegati al corso.

2.0.1 Errore dell’interpolante spline lineare e cubica

Sia s1: [a,b] → R una spline di grado 1, che interpola le coppie (xi, f (xi)) dove x0=a < x1<... < xi<xi +1<... < xN=b.

Dal teorema dell’errore dell’interpolazione polinomiale nel caso N = 1 abbiamo che puntualmente

f (x) − pN(x) = f(2)(ξ)(x − x0)(x − x1)

2 , ξ ∈ (a,b) (3)

da cui è immediato avere una stima d’errore (uniforme!) per funzioni f ∈ C1([a,b])

(7)

da cui l’asserto in quanto il massimo di ¯ ¯ ¯ ¯ (x − xi)(x − xi +1) 2 ¯ ¯ ¯ ¯ si ha per c = (xi+xi +1)/2 e quindi ¯ ¯ ¯ ¯ (x − xi)(x − xi +1) 2 ¯ ¯ ¯ ¯ ≤ ¯ ¯ ¯ ¯ (c − xi)(c − xi +1) 2 ¯ ¯ ¯ ¯ =1 2 ¯ ¯ ¯ ¯ (xi +1xi) 2 (xixi +1) 2 ¯ ¯ ¯ ¯ =h 2 i 8 . Analizziamo ora l’errore effettuato da una spline cubica s3: [a,b] → R che interpola

le coppie (xi, f (xi)) dove

x0=a < x1<... < xi<xi +1<... < xN=b.

E’ utile ricordare che se f : [a,b] → R è una funzione continua, allora kf k∞:= max

x∈[a,b]|f (x)|.

Per quanto riguarda l’errore, si può provare (non facile!) quanto segue (cf. [2], p. 163, [1], p. 163)

Teorema 2.1 Supponiamo f ∈ C4([a,b]). Posto h = maxhi, si consideri una

succes-sione di suddivisioni tale che esista una costante K tale che h

hj

K , j = 0, . . . , N − 1. Allora esiste una costante ckindipendente da h tale che

kf(k)s(k)3,∆

Nk∞≤ckK h

(4−k)||f(4)||

, k = 0,1,2,3 (8)

dove k f k∞=maxx∈[a,b]|f (x)|, ∆N={xi}i =0,...,N.

Nel caso di spline interpolanti e vincolate si ha c0=5/384, c1=1/24, c2=3/8. Nel

caso di splines di tipoHermite si ha c0=1/384 (cf. [6], p. 301).

La condizione su h nel teorema è chiaramente verificata per suddivisioni uniformi, ed in particolare esclude che alcuni intervalli possano degenare ad un punto. Si noti non solo come la spline approssima la funzione, ma come pure le sue derivate convergano alle rispettive derivate della funzione f .

3 Esercizi sull’interpolazione spline lineare a tratti

Fissato N ∈ N , N ≥ 2, si calcoli l’interpolante spline lineare s della funzione

rungenei nodi

xk= −5 : hx: 5, k = 0,..., N

dove hx =10/N . Confrontando il valore dell’interpolante spline con quello della

funzione di Runge nei nodi

(8)

−5 −4 −3 −2 −1 0 1 2 3 4 5 10−6 10−5 10−4 10−3 10−2

Figure 2: Grafico che illustra l’errore della spline lineare a tratti nell’approssimare la funzione di Runge nell’intervallo [−5,5], con intervalli di ampiezza 1/10.

con hu=hx/4 e utilizzando il comandonorm(si consulti l’help!) per il calcolo della

norma k · k∞di un vettore, si valuti l’errore compiuto in norma infinito. Ricordiamo

che se v = {vi} allora

kvk∞=max

i |vi|.

Nel caso della spline lineare, é precisa la classica stima dell’errore della spline lineare a tratti?

3.1 Risoluzione

In virtù di precedenti osservazioni, scriviamo in Matlab nel filesplinelineare.m

N=100; a=-5; b=5;

hx=(b-a)/N; % PASSO INTP. PTS. x=a:hx:b; % ASCISSE (INTP). y=runge(x); % ORDINATE (INTP). h1=hx/4; % PASSO TEST PTS. u=a:h1:b; % ASCISSE (TEST).

v = interp1(x,y,u,’linear’); % ORDINATE (TEST). vv=runge(u); % VALORE ESATTO IN NODI TEST. err=norm(vv-v,inf); % ERRORE ASSOLUTO IN

% NORMA INFINITO. fprintf(’\n \t [ERR]: %2.2e’,err);

plot(u,v,’k-’,u,vv,’r-’); % PLOT SPLINE VS. RUNGE. fprintf(’\n \t [PAUSE]’);

pause(5);

(9)

−5 −4 −3 −2 −1 0 1 2 3 4 5 −2 −1.5 −1 −0.5 0 0.5

Figure 3: Grafico che illustra il grafico della derivata seconda della funzione di Runge.

Osserviamo dall’esperimento che la funzione è ricostruita così bene, che l’interpolante e la funzione di Runge si sovrappongono in modo indistinguibile. Il plot dell’errore assoluto, che in virtù del comando di pausa viene eseguito dopo 5 secondi, mostra che il massimo errore è compiuto nell’origine.

La stima d’errore delle splines lineari a tratti per funzioni f ∈ C2([a,b]) è

|f (x) − s1(x)| ≤ hi2 Mi 8 (9) dove hi=(xi +1xi), i = 0,..., N − 1, Mi= max x∈(xi,xi +1) |f(2)(x)|. Osserviamo ora che

1. Nel caso della funzione di Runge f si ha

f(2)(x) = (8 x2)/(x2+1)3−2/(x2+1)2.

2. Nel nostro esempio, l’ampiezza dell’intervallo è costante e vale hi=h.

Quindi se x ∈ [xi, xi +1], allora

|f (x) − s1(x)| ≤ h2Mi

8 (10)

Si esegua un grafico di f(2)in [−5,5] e trovato il suo massimo in valore assoluto,

diciamo M, si verifichi cheerrdel programma sopra introdotto sia inferiore a h2 M 8.

(10)

Facoltativo: se

Mi= max

x∈(xi,xi +1) |f(2)(x)|

la stima sopracitata è buona in ogni subintervallo [xi, xi +1]? Verificarlo mediante

un plot di h2 Mi

8 relativamente alla funzione di Runge f , eseguendo un confronto

con l’erroreabs(vv-v). Motivare qualitativamente perchè il massimo errore com-piuto dalla spline è nell’origine. A tal proposito si consideri il grafico della derivata seconda della funzione di Runge e (10).

4 Confronto tra interpolazione spline lineare e cubica

In questa sezione faremo un breve confronto tra una spline lineare e una cubica. Consideriamo la funzione f (x) := log(x) nell’intervallo [a,b] := [1,2] e suddividiamo [a,b] in N subintervalli. Quindi calcoliamo per N = 3,4,...,10 le interpolanti splines lineari a tratti, cubiche con vincolinaturali o not a knot. Qualora possibile stimiamo l’errore commesso.

Introduciamo quindi il seguente codice, che salveremo in un filesplinecf.m: a=1; b=2; int_type=1;

switch int_type case 1

fprintf(’\n \t [SPLINE LINEARE] \n’); case 2

fprintf(’\n \t [SPLINE CUBICA NATURALE] \n’); case 3

fprintf(’\n \t [SPLINE CUBICA NOT A KNOT] \n’); end for N=3:10 h=(b-a)/N; x=a:h:b; y=log(x); s=a:(h/10):b; switch int_type case 1 % LINEARE. t=interp1(x,y,s,’linear’); err(N)=norm(t-log(s),inf); err_ext_min=(2/(b^2))*(h^2)/8; err_ext_max=(2/(a^2))*(h^2)/8;

fprintf(’\n [N]: %2.0f [ERR. (INF)] %2.2e’,N, err(N));

fprintf(’ [EST.][MIN]: %2.2e [MAX]: %2.2e’,err_ext_min,err_ext_max); if (err(N) > err_ext_min) & (err(N) < err_ext_max)

fprintf(’ [OK]’); else

(11)

case 2 % CUBICA NATURALE. pp=csape(x,y,’variational’); t = ppval(pp,s);

err(N)=norm(t-log(s),inf);

fprintf(’\n [N]: %2.0f [ERR. (INF)] %2.2e’,N,err(N)); case 3 % CUBICA NOT A KNOT.

t=spline(x,y,s);

err(N)=norm(t-log(s),inf);

fprintf(’\n [N]: %2.0f [ERR. (INF)] %2.2e’,N,err(N)); end

plot(s,log(s),’k-’); hold on; plot(s,t,’r-’);

pause(2); hold off; end

1. Dal punto di vista della stima dell’errore nel caso di spline lineari, ricordiamo che la derivata seconda di f (x) := log(x) è f(2)(x) = −1/x2e quindi |f(2)(x)| = | −1/x2| =1/x2. Di conseguenza, essendo |f(2)(x)| decrescente, si vede subito che

1/b2< |f(2)(ξ)| < 1/a2 per qualsiasi ξ ∈ (a,b).

2. Non c’è molto da commentare nel codice eccetto che per la implementazione delle spline cubiche naturali. A tal proposito abbiamo usato il comando

pp=csape(x,y,’variational’); t = ppval(pp,s);

Per capire il significato dicsapeci aiutiamo, come al solito, con l’help di Matlab/Octave relativamente acsape.

CSAPE Cubic spline interpolation with various end-conditions. PP = CSAPE(X,Y)

returns the cubic spline interpolant (in ppform) to the given

data (X,Y) using Lagrange end-conditions (see default in table below). PP = CSAPE(X,Y,CONDS) uses the end-conditions specified in CONDS, with default values (which depend on the particular conditions).

(12)

CONDS may be a *string* whose first character matches one of the following: ’complete’ or ’clamped’, ’not-a-knot’, ’periodic’, ’second’, ’variational’, with the following meanings:

’complete’ : match endslopes (as given in VALCONDS, with default as under *default*)

’not-a-knot’ : make spline C^3 across first and last interior break (ignoring VALCONDS if given)

’periodic’ : match first and second derivatives at first data point with those at last data point

(ignoring VALCONDS if given)

’second’ : match end second derivatives (as given in VALCONDS, with default [0 0], i.e., as in variational) ’variational’ : set end second derivatives equal to zero

(ignoring VALCONDS if given)

The *default* : match endslopes to the slope of the cubic that matches the first four data at the respective end. ... ... x = 0:4; y=-2:2; s2 = 1/sqrt(2); clear v v(3,:,:) = [0 1 s2 0 -s2 -1 0].’*[1 1 1 1 1]; v(2,:,:) = [1 0 s2 1 s2 0 -1].’*[0 1 0 -1 0]; v(1,:,:) = [1 0 s2 1 s2 0 -1].’*[1 0 -1 0 1]; sph = csape({x,y},v,{’clamped’,’periodic’}); values = fnval(sph,{0:.1:4,-2:.1:2}); surf(squeeze(values(1,:,:)),squeeze(values(2,:,:)),squeeze(values(3,:,:))) % the previous two lines could have been replaced by: fnplt(sph)

axis equal, axis off See also CSAPI, SPAPI, SPLINE.

L’uso difnvalcrea problemi nelle vecchie releases di Matlab ed Octave ed è stato sostituito conppval.

Pur non essendo chiarissimo, si capisce che pp = csape(x,y,conds)

serve per costruire la spline cubica con vincoli che devono essere descritti nella vari-abileconds come ’variational’ se si desidera la spline naturale. Dal breve esempio (che essendo bidimensionale, non ci interessa) si capisce chefnval serve per val-utare la spline definita dapp nei nodi s.

Vediamo i risultati al variare del parametrointtype tra 1 e 3 (analizzando quindi nell’ordine le interpolanti splines lineari a tratti, cubiche con vincolinaturali o not a knot.).

(13)

[N]: 3 [ERR. (INF)] 1.03e-002 [EST.][MIN]: 6.94e-003 [MAX]: 2.78e-002 [OK] [N]: 4 [ERR. (INF)] 6.21e-003 [EST.][MIN]: 3.91e-003 [MAX]: 1.56e-002 [OK] [N]: 5 [ERR. (INF)] 4.15e-003 [EST.][MIN]: 2.50e-003 [MAX]: 1.00e-002 [OK] [N]: 6 [ERR. (INF)] 2.97e-003 [EST.][MIN]: 1.74e-003 [MAX]: 6.94e-003 [OK] [N]: 7 [ERR. (INF)] 2.23e-003 [EST.][MIN]: 1.28e-003 [MAX]: 5.10e-003 [OK] [N]: 8 [ERR. (INF)] 1.73e-003 [EST.][MIN]: 9.77e-004 [MAX]: 3.91e-003 [OK] [N]: 9 [ERR. (INF)] 1.39e-003 [EST.][MIN]: 7.72e-004 [MAX]: 3.09e-003 [OK] [N]: 10 [ERR. (INF)] 1.14e-003 [EST.][MIN]: 6.25e-004 [MAX]: 2.50e-003 [OK] [SPLINE CUBICA NATURALE]

[N]: 3 [ERR. (INF)] 5.22e-003 [N]: 4 [ERR. (INF)] 2.93e-003 [N]: 5 [ERR. (INF)] 1.91e-003 [N]: 6 [ERR. (INF)] 1.34e-003 [N]: 7 [ERR. (INF)] 9.86e-004 [N]: 8 [ERR. (INF)] 7.57e-004 [N]: 9 [ERR. (INF)] 6.00e-004 [N]: 10 [ERR. (INF)] 4.86e-004 [SPLINE CUBICA NOT A KNOT] [N]: 3 [ERR. (INF)] 8.28e-004 [N]: 4 [ERR. (INF)] 2.63e-004 [N]: 5 [ERR. (INF)] 1.29e-004 [N]: 6 [ERR. (INF)] 6.94e-005 [N]: 7 [ERR. (INF)] 4.07e-005 [N]: 8 [ERR. (INF)] 2.54e-005 [N]: 9 [ERR. (INF)] 1.67e-005 [N]: 10 [ERR. (INF)] 1.14e-005

5 Un esempio sull’utilizzo delle spline per approssimare

una curva

Sia una funzione f : [a,b] → R2, definita come

f (t ) = µ u(t ) v(t ) ¶ (11) con u, v : [a,b] → R. Noti i valori u(ti), v(ti) per i = 0,..., N si possono calcolare le

rispettive interpolanti splines su, sve quindi approssimare f con ˜f dove

˜f(t) =µ su(t)

sv(t)

(14)

del cerchio f (t ) = µ cos(t) sin(t) ¶ (13) per t = [0,2π]. Se tk=2kπ N , k = 0,..., N ,

l’interpolante spline puó essere facilmente calcolata via il comando Matlabinterp1

applicato alla coppia di vettorit,uet,vdove al solito t = (tk), u = (u(tk)), v =

(v(tk)).

Per testare il comportamento di tale ricostruzione si utilizzi il seguente codiceparmspline.m

per N = 4,8,12,16,20 (nel nostro caso eseguiamo il caso N = 6) N=6;

a=-pi; b=pi; % INTERVALLO. h=(b-a)/N; % PASSO PARAMETRI. % PUNTI INTP.

t=a:h:b; % PARAMETRI CURVA INTP. xt=cos(t); % ASCISSA PTO IN CURVA. yt=sin(t); % ORDINATA PTO IN CURVA. % TEST POINTS.

htest=h/100; % PASSO PARAMETRO t. ttest=a:htest:b; % PARAMETRI CURVA TEST. % SPLINES INTP. DELLA CURVA PARAMETRICA. xttest=interp1(t,xt,ttest,’spline’); yttest=interp1(t,yt,ttest,’spline’); % PLOT.

theta=0:htest:2*pi;

plot(xttest,yttest,’k-’,cos(theta),sin(theta),’r-’);

Osserviamo che il plot del cerchio può essereovalizzato dalla parte grafica (come il plot di Matlab o il GNUPLOT per Octave). Aiutandosi con l’help di Matlab cercare quali parametri possono sostituire’spline’nel comando’interp1’e provarli, verificando le differenze nella ricostruzione del cerchio per N = 8.

Per ulteriori approfondimenti, si considerino [2], [5]. Le equazioni parametriche sono tratte da [4].

6 Calcolo della derivata con splines

(15)

−1.5 −1 −0.5 0 0.5 1 −1 −0.8 −0.6 −0.4 −0.2 0 0.2 0.4 0.6 0.8 1

Figure 4: Ricostruzione del cerchio con spline cubiche parametriche, per N = 6 in

parmspline.m.

6.1 Commenti all’esercitazione

Occorre usare la functionspline. Tanto in Matlab quanto in Octave, la sin-tassi del comando è lapp=spline(X,Y)doveppè una struttura dati contenente, tra l’altro,pp.P, una matrice di ordine (n −1)×4 in cui alla riga k-sima sono immagazz-inati i coefficienti ak,3, ..., ak,0della restrizione della spline (polinomio ak,3x3+...+ ak,0) all’intervallo Ik. Occorre quindi creare una nuova struttura (diciamopp1),

del tipo dipp, contenente la matricepp.P1 di ordine (n − 1) × 3 dei coefficienti

(16)

Il vettorepp ottenuto dal comandopp=spline(X,Y)contiene varie informazioni. Un tipico esempio: form: ’pp’ breaks: [1x11 double] coefs: [10x4 double] pieces: 10 order: 4 dim: 1

Per disporre dei breaks e dei coefficienti, si esegue il comando [breaks,coeffs]=unmkpp(pp)

Se il fileunmkppnon è disponibile tra le functions di Matlab, si copi il seguente codice function [x, P, n, k, d] = unmkpp(pp) if nargin == 0 usage("[x, P, n, k, d] = unmkpp(pp)") endif if !isstruct(pp)

error("unmkpp: expecting piecewise polynomial structure"); endif x = pp.x; P = pp.P; n = pp.n; k = pp.k; d = pp.d; endfunction

o lo si scarichi dal sito

http://users.powernet.co.uk/kienzle/octave/matcompat/scripts/datafun/ Alternativamente provare un comando del tipo

coeffs = pp.P;

Una volta modificata la matrice di coefficienticoeffsindcoeffsper il calcolo delle derivate bisogna ricostruire una struttura dati adatta alle spline e quindi simile a

coeffs. A tal proposito basta eseguire il comando

pp1=mkpp(breaks,dcoeffs)

Per valutare i polinomi a tratti, si usa la funzioneppvalvalutata supp1. Si può pro-durre un grafico di tutto il dominio [0,1] per valutare la bontà dell’approssimazione della derivata e di un intorno di un nodo di interpolazione per valutare il carattere non interpolatorio.

(17)

a=0; b=1;

% Interpolazione con splines. h=(b-a)/10;

x=a:h:b; y=sin(10*x); pp=spline(x,y);

[breaks,coeffs]=unmkpp(pp); % Derivata con splines. N=size(coeffs,1);

dcoeffs=[zeros(N,1) 3*coeffs(:,1) 2*coeffs(:,2) coeffs(:,3)]; pp1=mkpp(breaks,dcoeffs);

u=a:0.005:b; dsu=ppval(pp1,u); dfu=10*cos(10*u); % Plot errore assoluto. semilogy(u,abs(dsu-dfu),’-’);

7 Online

Qualora si vogliano ulteriori delucidazioni si confrontino i seguenti links http://en.wikipedia.org/wiki/Spline_%28mathematics%29

http://it.wikipedia.org/wiki/Interpolazione_spline

http://www.dmi.units.it/~bellen/calcolo_numerico/CAPIT-5A.PDF

References

[1] K. Atkinson,Introduction to Numerical Analysis, Wiley, 1989.

[2] V. Comincioli,Analisi Numerica, metodi modelli applicazioni, Mc Graw-Hill, 1990.

[3] S.D. Conte e C. de Boor,Elementary Numerical Analysis, 3rd Edition, Mc Graw-Hill, 1980.

[4] The MathWorks Inc., Numerical Computing with Matlab,

http://www.mathworks.com/moler.

[5] A. Quarteroni e F. Saleri,Introduzione al calcolo scientifico, Springer Verlag, 2006.

Riferimenti

Documenti correlati

Solution proposed by Roberto Tauraso, Dipartimento di Matematica, Universit`a di Roma “Tor Vergata”, via della Ricerca Scientifica, 00133 Roma, Italy.. The answer

[r]

Here we show four families of Padua points for interpolation at any even or odd degree n, and we present a stable and efficient implementation of the corresponding

We have recently proved that the Lebesgue constant of these points grows like log 2 (n), n being the de- gree, as with the best known points for the square, and we have imple- mented

In this paper we present a stable and efficient Fortran implementation of the Lagrange interpolation formula at the Padua points, with cost O(n 3 ) flops for the evaluation (once

Keywords: bivariate Lagrange interpolation, Padua points, bivariate Chebyshev or- thogonal basis, nontensorial Clenshaw-Curtis-like cubature, matrix product formula- tion, FFT. ∗

The Padua points (recently studied during an international collaboration at the University of Padua) give a near-optimal point set for total-degree polynomial interpolation and even

Compression errors (in max-norm) for the Franke test function on [0, 1] 2 , sampled at randomly generated point sets; last row and column: actual errors of the Padua and