
% Copyright (C) 2007 Alvise Sommariva. This is a free document; you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation; either version 2 of the License, or
% at your option) any later version. This document is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
% GNU General Public License for more details. You should have received a copy of the GNU General Public License
% along with this program; if not, write to the Free Software
% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA}

\documentclass[final]{siamltex}


%------------------------------------------------------------------------------------------------------------------------
% USEPACKAGE.
%------------------------------------------------------------------------------------------------------------------------

\usepackage[italian]{babel}
\usepackage[dvips]{graphicx}
\usepackage{amssymb}
\usepackage{amsmath}
\usepackage{times}
\usepackage{epsf}
\usepackage{graphicx,psfrag,color,pst-grad}
\usepackage{latexsym}
\usepackage{psboxit,pstricks}
\usepackage{fancyhdr}
\usepackage{fancyvrb}
\usepackage[colorlinks=true,linkcolor=purple,urlcolor=purple]{hyperref}

\usepackage{float}
\floatstyle{ruled}
\newfloat{program}{thp}{lop}
\floatname{program}{Codice}
\pdfpagewidth 8.5in
\pdfpageheight 11in

% \usepackage{palatino}
% \usepackage[latin1]{inputenc}
\usepackage{calc}
\usepackage{multicol}



%------------------------------------------------------------------------------------------------------------------------
% NEW COMMAND.
%------------------------------------------------------------------------------------------------------------------------

\newcommand{\ptenm}[2]{#1\mbox{-E#2}}
\newcommand{\ptenp}[2]{#1\mbox{+E#2}}
\newcommand{\mye}{\`e }
\newcommand{\myer}{\'e }
\newcommand{\myu}{\`u }
\newcommand{\myur}{\'u }
\newcommand{\mya}{\`a }
\newcommand{\myo}{\`o }
\newcommand{\myod}{\'o }
\newcommand{\myi}{\`i }
\newcommand{\myid}{\'i }
\newcommand{\myfl}{\mbox{fl}}
\newcommand{\smsp}{\vspace{0.2cm}}
\newcommand{\Rset}{\mathbb{R}}
\newcommand{\bs}{\boldsymbol}
\newcommand{\mylbar}{|}
\newcommand{\myrbar}{|}

%\pagestyle{fancy}
%\headheight 35pt
%\rhead{}
%\chead{}
%\lhead{}
%\rfoot{}
%\cfoot{\thepage}
%\lfoot{}



%------------------------------------------------------------------------------------------------------------------------
% NEW THEOREM.
%------------------------------------------------------------------------------------------------------------------------

%\newtheorem{theorem}{Theorem}[section]
%\newtheorem{lemma}[theorem]{Lemma}
%\newtheorem{proposition}[theorem]{Proposition}
%\newtheorem{corollary}[theorem]{Corollary}
% \newtheorem{remark}[theorem]{Nota}
%\newenvironment{proof}[1][Proof]{\begin{trivlist}
%\item[\hskip \labelsep {\bfseries #1}]}{\end{trivlist}}
%\newenvironment{definition}[1][Definition:]{\begin{trivlist}
%\item[\hskip \labelsep {\bfseries #1}]}{\end{trivlist}}
%\newenvironment{example}[1][Esempio]{\begin{trivlist}
%\item[\hskip \labelsep {\bfseries #1}]}{\end{trivlist}}
%\newenvironment{remark}[1][Nota]{\begin{trivlist}
%\item[\hskip \labelsep {\bfseries #1}]}{\end{trivlist}}


%------------------------------------------------------------------------------------------------------------------------
% NEW COMMAND.
%------------------------------------------------------------------------------------------------------------------------

\renewcommand{\figurename}{Figura}

%\newcommand{\qed}{\nobreak \ifvmode \relax \else
%     \ifdim\lastskip<1.5em \hskip-\lastskip
%    \hskip1.5em plus0em minus0.5em \fi \nobreak
% \vrule height0.75em width0.5em depth0.25em\fi}



%------------------------------------------------------------------------------------------------------------------------
% DEF.
%------------------------------------------------------------------------------------------------------------------------

\def\P{{\mathbb P}}
\def\n{{\mathcal N}}
\def\R{\mathbb{R}}
\def\N{\mathbb{N}}
\def\Z{\mathbb{Z}}
\def\F{{\mathcal F}}
\newcommand{\LL}{\mathcal L}
\def\C{\mathbb{C}}
\def\K{\mathbb{K}}
\def\T{\mathbb{T}}
\def\qed{\vbox{\hrule height0.6pt\hbox{%
   \vrule height1.3ex width0.6pt\hskip0.8ex
   \vrule width0.6pt}\hrule height0.6pt
  }}

\begin{document}

\title{\bf Splines \thanks{Ultima revisione: \today}}

\author{{A. Sommariva
{\thanks{Dipartimento di Matematica Pura ed Applicata, Universit\`a degli Studi di  Padova, via Trieste 63, 35121 Padova, Italia ({\tt alvise@math.unipd.it})}}} {\mbox{ e}}  {M.Venturin
{\thanks{Dipartimento di Informatica, Universit\`a degli Studi di Verona, Strada Le Grazie 15, 37134 Verona, Italia ({\tt manolo.venturin@gmail.com})}} }
}

\maketitle


\section{Introduzione}

Si \`e visto che nel caso dell'interpolazione polinomiale,
 dati $N+1$ punti $a=x_0<\ldots<x_N=b$, e i valori $y_0,\ldots,y_N$ ivi
assunti da una funzione $y=f(x)$, esiste uno ed un solo polinomio $p_N$ di
grado $N$ tale che
\begin{equation}
p_N(x_i)=f_i, \, \, i=0,\ldots,N.
\end{equation}

\noindent
Nel caso di nodi equispaziati
\begin{equation}
x_k=a+ k \, {\frac {(b-a) } {N}   }, \, \, k=0,\ldots,N ;
\end{equation}
al crescere di $N$, non si pu\'o garantire che $f(x)-p_n(x)$ tenda a $0$
(si ricordi il fenomeno di Runge!).

\noindent
Pi\'u in generale per un teorema di Faber (cf. {\cite[p.132]{COM}}, {\cite{MTF}}), qualsiasi sia l'insieme di nodi
relativi all'intervallo limitato [$a$,$b$]
esiste una funzione continua $f$ tale che l'interpolante $P_n$ in tale set
di punti non converge uniformemente a $f$ (per $n\rightarrow \infty$). In altre parole
al tendere di $n \rightarrow +\infty$, non si ha
$$ \lim_{N \rightarrow \infty}  \max_{x \in [a,b]} |f(x)-P_N(x)| \rightarrow 0.$$

\noindent
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 $p_N \rightarrow f$.

\noindent
Una risposta \`e stata data nel 1946 da Schoenberg (cf. {\cite{WIKISC}}, {\cite{MTS}}), lo scopritore delle splines (cf. {\cite{WIKFS}}, {\cite{WIKSD}}, {\cite{WIKSM}}). Ricordiamo che il termine spline deriva dal termine inglese dato all'omonimo strumento utilizzato da designers {\cite{DEBS}}.

\noindent
Il primo caso \`e quello delle splines di grado $1$, cio\`e funzioni che
in
ogni intervallo $[x_i,x_{i+1}]$ (per $i=0,\ldots,N-1$) sono polinomi di
grado $m=1$ e globalmente funzioni di classe $C^{m-1} =C^0$, cio\`e
continue.

\noindent
Il caso generale di splines di grado $m$ risulta pi\'u complicato. Un
esempio notevole \`e quello
delle splines cubiche $s_3$, cio\`e funzioni che in ogni intervallo
$[x_i,x_{i+1}]$ (per $i=0,\ldots,N-1$) siano polinomi di grado $m=3$ e
globalmente funzioni di classe $C^{m-1}=C^2$.

\noindent
L'unicit\'a dell'interpolante \`e legata (ma non solo!) all'aggiungere
alcune propriet\'a
della spline agli estremi $x_0$, $x_N$.

 \begin{figure}[ht!]\label{fig1aa}
 \centering
   {\includegraphics[scale=0.2725,clip]{Schoenberg.eps}}
      {\includegraphics[scale=0.32,clip]{splinetool2.eps}}
 \caption{Isaac Jacob Schoenberg (1903-1990) e un esempio di una spline per designers.}
 \end{figure}

\noindent
Osserviamo infatti che in ogni intervallo $[x_i,x_{i+1}]$ le spline si
possano rappresentare
come
$$s_3(x)=c_{1,i}+c_{2,i}(x-x_i)+c_{3,i}(x-x_i)^2+c_{4,i}(x-x_i)^3,
\,\,i=0,\ldots,N-1$$
e quindi per determinare $s_3$ in $\{x_i\}_{i=0,\ldots,N}$ servano $4N$
valori $c_{i,j}$.
Da ragionamenti sulle propriet\'a della regolarit\'a della spline
interpolante si vede che sono disponibili solo $4N-2$ condizioni
(di cui $N+1$ dal fatto che $s_3(x_i)=f_i$). Si procede richiedendo quindi
una delle seguenti propriet\'a aggiuntive a $s_3$:
\smsp
\begin{itemize}
\item {\sl{Spline naturale}}: $s_3^{(2)}(a)=s_3^{(2)}(b)=0$.
\smsp
\item {\sl{Spline periodica}}: $s_3^{(1)}(a)=s_3^{(1)}(b)$,
$s_3^{(2)}(a)=s_3^{(2)}(b)$.
\smsp
\item {\sl{Spline vincolata}}: $s_3^{(1)}(a)=f^{(1)}(a),
\,\,s_3^{(1)}(b)=f^{(1)}(b)$.
\end{itemize}
\smsp
Per altri tipi di splines come le {\sl{not a knot}} o le {\sl{Hermite}} si
veda {\cite{ATK}}, p. 170-171.

 \begin{figure}\label{fig1}
 \centering
   {\includegraphics[scale=0.5,clip]{exsp1sin.eps}}
{\includegraphics[scale=0.5,clip]{exsp3sin.eps}}

 \caption{Grafico che illustra l'interpolazione su nodi equispaziati
nell'intervallo $[0,2\pi]$ della funzione
$\sin{(x)}$ mediante una spline lineari a tratti e una spline cubica con
vincolo naturale.}
 \end{figure}


\section{Splines in Matlab ed Octave}

Tra le toolbox di Matlab/Octave, si spera di trovare una procedura
{\tt{spline}} che esegua l'interpolante
lineare spline. Quindi \mye naturale digitare dalla shell di Matlab/Octave
{\tt{help spline}}. Si ottiene un'aiuto
del tipo
\begin{Verbatim}[fontsize=\small, formatcom=\color{blue}]

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:
    This generates a sine curve, then samples the spline over a
    finer mesh:

        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).

\end{Verbatim}
\noindent
L'help \mye interessante per diversi motivi.
\smsp
\begin{enumerate}
\item Si capisce che la function {\tt{spline}} non \mye adatta ai nostri
propositi, perch\mye
serve per il calcolo di spline cubiche (e non lineari). Le utilizzeremo
nella prossima lezione.
\smsp
\item Il primo esempio ci dice come svolgere parte dell'esercizio.
Consideriamo la porzione di codice
\begin{Verbatim}[fontsize=\small, formatcom=\color{blue}]

x = 0:10;  y = sin(x);
xx = 0:.25:10;
yy = spline(x,y,xx);
plot(x,y,'o',xx,yy)

\end{Verbatim}
\noindent
Si capisce subito che valuta su una griglia di numeri naturali
$x=0,\ldots,10$ la funzione $\sin(x)$, la approssima con
spline (cubiche!) interpolanti in tale insieme di ascisse
($x_i,\sin(x_i)$). Proprio quello che vogliamo fare con le spline lineari
a tratti (se solo avessimo la routine adatta e cambiassimo il set di
ascisse, adattandolo al nostro caso).
\smsp
\item Suggerisce di guardare {\tt{interp1}}. Proviamo su Matlab/Octave
{\tt{help interp1}}. Con un po' di fatica capiamo che pare essere la
routine giusta.
\end{enumerate}

\noindent
In una versione abbastanza recente di Matlab troviamo la seguente
descrizione
\begin{Verbatim}[fontsize=\small, formatcom=\color{blue}]

 INTERP1 1-D interpolation (table lookup).
    YI = INTERP1(X,Y,XI) interpolates to find YI, the values of
    the underlying function Y at the points in the vector XI.
    The vector X specifies the points at which the data Y is
    given. If Y is a matrix, then the interpolation is performed
    for each column of Y and YI will be length(XI)-by-size(Y,2).

    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.

\end{Verbatim}
Con un po' di fatica capiamo che la routine che fa al caso nostro \mye
\begin{Verbatim}[fontsize=\small, formatcom=\color{blue}]

v = interp1(x,y,u,'linear')

\end{Verbatim}
\noindent
dove
\smsp
\begin{enumerate}
\item {\tt{x}}, {\tt{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 $s_1$ tale che $s_1(x_i)=y_i$.
\smsp
\item se {\tt{u}} un insieme di ascisse prescelto dall'utente (ad esempio
per plottare $s_1$) allora $v_i=s_1(u_i)$.
\end{enumerate}

\noindent
Per quanto visto deduciamo che in Matlab/Octave, i problemi dell'interpolazione spline sono semplificati
dall'utilizzo, dei comandi {\tt {spline}} e {\tt {interp1}}.

\noindent
Pi\myu precisamente:
\smsp
\begin{enumerate}
\item Per quanto riguarda la spline cubica (not a knot) che interpola le coppie
($x_i,y_i$),
il suo valore $v_i$ nei punti $u_i$ \`e dato da
$${\mbox{\tt{v=spline(x,y,u)}}}.$$
\smsp
\item Simili risultati possono essere raggiunti dal comando {\tt {interp1}}.
Cos\'i
$${\mbox{\tt{v = interp1(x,y,u,'linear')}}};$$
$${\mbox{\tt{v = interp1(x,y,u,'spline')}}};$$
$${\mbox{\tt{v = interp1(x,y,u,'cubic')}}};$$
forniscono i valori $v_i$ dell'interpolante lineare,
cubica not a knot e cubica Hermite nei punti $u_i$.

Rimandiamo i dettagli sul loro utilizzo all'help in linea e agli esempi
allegati al corso.
\end{enumerate}

\subsubsection{Errore dell'interpolante spline lineare e cubica}

Sia $s_1:[a,b] \rightarrow \R$ una spline di grado 1, che interpola le coppie
($x_i,f(x_i)$) dove $$x_0=a<x_1< \ldots <x_i < x_{i+1} < \ldots < x_N=b.$$
Dal teorema dell'errore dell'interpolazione polinomiale nel caso
$N=1$
abbiamo che {\sl{puntualmente}}
\begin{equation}\label{2a}
f(x)-p_N(x)= f^{(2)}(\xi) {\frac { (x-x_0) (x-x_1)  }{2}}, \,\,
\xi \in (a,b)
\end{equation}
da cui \`e immediato avere una stima d'errore ({\sl{uniforme}}!) per
funzioni $f \in C^2([a,b])$
\begin{equation}\label{errorelineare}
|f(x)-s_1(x)| \leq    h_i^2 {\frac{M_i }{ 8}}
\end{equation}
per
$$h_i=(x_{i+1}-x_{i}),\,\,i=0,\ldots,N-1,$$
$$M_i=\max_{x\in(x_i,x_{i+1})}|f^{(2)}(x)|.$$
Infatti, se $x\in [x_i, x_{i+1}]$, da ({\ref{2a}})
\begin{eqnarray}\label{2a1}
|f(x)-s_1(x)| &=& \left|f^{(2)}(\xi) {\frac { (x-x_i) (x-x_{i+1})  }{2}}
\right| \\
              &=& \left|f^{(2)}(\xi) \right|  \left| {\frac { (x-x_i)
(x-x_{i+1})
}{2}} \right| \\
              &\leq& \max_{x \in [x_i,x_{i+1}]} |f^{(2)}(x) | \cdot
\max_{x \in [x_i,x_{i+1}]} \left| {\frac { (x-x_i) (x-x_{i+1})  }{2}}
\right|
\end{eqnarray}
da cui l'asserto in quanto il massimo di
$$\left| {\frac { (x-x_i) (x-x_{i+1})  }{2}} \right|$$
si ha per $c=(x_i+x_{i+1})/2$ e quindi
$$\left| {\frac { (x-x_i) (x-x_{i+1})  }{2}} \right| \leq \left| {\frac {
(c-x_i)
(c-x_{i+1})  }{2}} \right| = {\frac {1}{2}} \left| {\frac { (x_{i+1}-x_i)
}{2}}{\frac {
(x_i-x_{i+1})
}{2}}  \right|={\frac {h_i^2}{8}}.$$

\noindent
Analizziamo ora l'errore effettuato da una spline cubica $s_3:[a,b] \rightarrow \R$ che interpola le coppie
($x_i, f(x_i)$) dove $$x_0=a<x_1< \ldots <x_i < x_{i+1} < \ldots < x_N=b.$$
E' utile ricordare che se $f: [a,b] \rightarrow \R$ \mye una funzione continua, allora
$$\|f\|_{\infty}:=\max_{x \in [a,b]} {|f(x)|}.$$
Per quanto riguarda l'errore, si pu\myo provare (non facile!) quanto segue
(cf. {\cite{COM}}, p. 163, {\cite{ATK}}, p. 163)
\smsp
\begin{theorem}
Supponiamo $f\in C^4([a,b])$. Posto $h=\max h_i$, si consideri una
successione di suddivisioni tale che esista una costante $K$
tale che $${\frac{h}{h_j}} \leq K, \,\,j=0,\ldots,N-1.$$

\noindent
Allora esiste una costante $c_k$ indipendente da $h$ tale che
\begin{equation}
\|f^{(k)}-s^{(k)}_{3,\Delta_N}\|_{\infty} \leq c_k K h^{(4-k)}
||f^{(4)}||_{\infty}, \,\, k=0,1,2,3
\end{equation}
dove $\|f\|_{\infty}=\max_{x \in [a,b]}|f(x)|$,
$\Delta_N=\{x_i\}_{i=0,\ldots,N}$.
\end{theorem}
Nel caso di spline interpolanti e vincolate si ha $c_0=5/384$, $c_1=1/24$,
$c_2=3/8$. Nel caso di splines di tipo {\sl{Hermite}} si ha $c_0=1/384$
(cf. {\cite{SULI}}, p. 301).

\noindent
La condizione su $h$ nel teorema \`e 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$.

\section{Esercizi sull'interpolazione spline lineare a tratti}

Fissato $N \in {\mathcal{N}}$, $N\geq 2$, si calcoli l'interpolante spline
lineare $s$ della funzione {\tt{runge}} nei nodi $$x_k=-5:h_x:5, \,
k=0,\ldots,N$$ dove $h_x=10/N$.
Confrontando il valore dell'interpolante spline con quello della funzione
di Runge
nei nodi $$u_k=-5:h_u:5, \, k=0,\ldots,4\,N$$ con $h_u=hx/4$ e  utilizzando
il comando
{\tt{norm}} (si consulti l'help!) per il calcolo della norma
$\|\cdot\|_{\infty}$ di un vettore, si valuti l'errore compiuto in norma
infinito. Ricordiamo che se $v=\{v_i\}$ allora
$$\|v\|_{\infty}=\max_i |v_i|.$$

\noindent
Nel caso della spline lineare, \'e precisa la classica stima
dell'errore della spline lineare a tratti?


 \begin{figure}\label{fig1s}
 \centering
   {\includegraphics[scale=0.5,clip]{error_spline.eps}}
 \caption{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$.}
 \end{figure}

\begin{figure}\label{fig1t}
 \centering
   {\includegraphics[scale=0.5,clip]{derivata2_runge.eps}}
 \caption{Grafico che illustra il grafico della derivata seconda della funzione di Runge.}
 \end{figure}


{\subsection{Risoluzione}}

In virt\myu di precedenti osservazioni, scriviamo in Matlab nel file
{\tt{splinelineare.m}}
\begin{Verbatim}[fontsize=\small, formatcom=\color{blue}]

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);
semilogy(u,abs(vv-v),'+');  % PLOT ERRORE.

\end{Verbatim}
\noindent
Osserviamo dall'esperimento che la funzione \mye ricostruita cos\myi bene,
che l'interpolante e la funzione di Runge si sovrappongono
in modo indistinguibile. Il plot dell'errore assoluto, che in virt\myu del
comando di pausa viene eseguito dopo 5 secondi, mostra che
il massimo errore \mye compiuto nell'origine.

\noindent
La stima d'errore delle splines lineari a tratti per funzioni $f \in
C^2([a,b])$ \mye
\begin{equation}\label{errorelineare2}
|f(x)-s_1(x)| \leq    h_i^2 {\frac{M_i }{ 8}}
\end{equation}
dove
$$h_i=(x_{i+1}-x_{i}),\,\,i=0,\ldots,N-1,$$
$$M_i=\max_{x\in(x_i,x_{i+1})}|f^{(2)}(x)|.$$

\noindent
Osserviamo ora che
\smsp
\begin{enumerate}
\item Nel caso della funzione di Runge $f$ si ha
$$f^{(2)}(x)=(8\,x^2)/(x^2+1)^3-2/(x^2+1)^2.$$
\smsp
\item Nel nostro esempio, l'ampiezza dell'intervallo \mye costante e vale
$h_i=h$.
\end{enumerate}

\noindent
Quindi se $x \in [x_i,x_{i+1}]$, allora
\begin{equation}\label{errorelineare}
|f(x)-s_1(x)| \leq    h^2 {\frac{M_i }{ 8}}
\end{equation}

\noindent
Si esegua un grafico di $f^{(2)}$ in $[-5,5]$ e trovato il suo massimo in
valore assoluto, diciamo $M$,
si verifichi che {\tt{err}} del programma sopra introdotto sia inferiore a
$h^2 {\frac{M}{ 8}}$.
\'E una buona stima?

{\vspace{0.3cm}}
\noindent
{\bf{Facoltativo}}: se $$M_i=\max_{x\in(x_i,x_{i+1})}|f^{(2)}(x)|$$ la
stima sopracitata \mye buona in ogni subintervallo $[x_i,x_{i+1}]$?
Verificarlo mediante un plot di $ h^2 {\frac{M_i }{ 8}}$ relativamente
alla funzione di Runge $f$, eseguendo un confronto con l'errore
{\tt{abs(vv-v)}}. Motivare qualitativamente perch\mye il massimo errore
compiuto dalla spline \mye nell'origine. A tal proposito si consideri il grafico della derivata seconda della funzione di Runge e ({\ref{errorelineare}}).

\section{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,\ldots,10$ le interpolanti splines lineari a tratti, cubiche con vincoli {\sl{naturali}} o {\sl{not a knot}}.
Qualora possibile stimiamo l'errore commesso.

\noindent
Introduciamo quindi il seguente codice, che salveremo in un file {\sl{splinecf.m}}:
\begin{Verbatim}[fontsize=\small, formatcom=\color{blue}]

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
          fprintf(' [KO]');
        end
    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

\end{Verbatim}
\smsp
\begin{enumerate}
\item Dal punto di vista della stima dell'errore nel caso di spline lineari, ricordiamo che la derivata seconda di $f(x):=\log(x)$ \mye
$f^{(2)}(x)=-1/x^2$ e quindi $|f^{(2)}(x)|=|-1/x^2|=1/x^2$. Di conseguenza, essendo $|f^{(2)}(x)|$ decrescente, si vede subito che
$$ 1/b^2  <  |f^{(2)}(\xi)| < 1/a^2 $$
per qualsiasi $\xi \in (a,b)$.
\smsp
\item Non c'\mye molto da commentare nel codice eccetto che per la implementazione delle spline cubiche naturali.
A tal proposito abbiamo usato il comando
\begin{Verbatim}[fontsize=\small, formatcom=\color{blue}]

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

\end{Verbatim}
\end{enumerate}

\noindent
Per capire il significato di {\tt{csape}} ci aiutiamo, come al solito, con l'help di Matlab/Octave relativamente a {\sl{csape}}.
\begin{Verbatim}[fontsize=\small, formatcom=\color{blue}]

 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).

    PP  = CSAPE(X,Y,CONDS,VALCONDS) uses the end-conditions specified
    in CONDS, with particular values as specified in VALCONDS.

    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.

\end{Verbatim}
\noindent
L'uso di {\tt{fnval}} crea problemi nelle vecchie releases di Matlab ed Octave ed \mye stato sostituito con {\tt{ppval}}.

\noindent
Pur non essendo chiarissimo, si capisce che
\begin{Verbatim}[fontsize=\small, formatcom=\color{blue}]

pp  = csape(x,y,conds)

\end{Verbatim}
\noindent
serve per costruire la spline cubica con vincoli che devono essere descritti nella variabile {\sl{conds}} come {\sl{'variational'}} se si desidera la
spline naturale. Dal breve esempio (che essendo bidimensionale, non ci interessa) si capisce che {\sl{fnval}} serve per valutare la spline definita da
{\sl{pp}} nei nodi {\sl{s}}.

\noindent
Vediamo i risultati al variare del parametro {\sl{inttype}} tra 1 e 3 (analizzando quindi nell'ordine le interpolanti splines lineari a tratti, cubiche
con vincoli {\sl{naturali}} o {\sl{not a knot}}.).
\begin{Verbatim}[fontsize=\small, formatcom=\color{blue}]

 [SPLINE LINEARE]

 [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

\end{Verbatim}
\section{Facoltativo: Un esempio sull'utilizzo delle spline per approssimare una curva}

Sia una funzione $f:[a,b] \rightarrow {\mathbb{R}}^2$, definita come
\begin{equation}
f(t)=\left(
\begin{array}{c}
u(t)\\
v(t)
\end{array}
\right)
\end{equation}
con $u,v:[a,b]\rightarrow {\mathbb{R}}$.
Noti i valori $u(t_i)$, $v(t_i)$ per $i=0,\ldots,N$ si possono calcolare
le rispettive interpolanti splines $s_u$, $s_v$ e quindi approssimare $f$
con ${\tilde{f}} $ dove
\begin{equation}
{\tilde{f}} (t)=\left(
\begin{array}{c}
s_u(t)\\
s_v(t)
\end{array}
\right)
\end{equation}

\noindent
Un esempio interessante \mye l'approssimazione del cerchio con splines.
Essendo l'equazione del cerchio
\begin{equation}
f(t)=\left(
\begin{array}{c}
\cos(t)\\
\sin(t)
\end{array}
\right)
\end{equation}
per $t=[0,2\,\pi]$. Se
$$t_k= {\frac {2 k \pi} {N} }, \, \, k=0,\ldots,N, $$
l'interpolante spline pu\'o essere facilmente calcolata via il comando
Matlab
{\tt {interp1}} applicato alla coppia di vettori {\tt{t}}, {\tt{u}} e
{\tt{t}}, {\tt{v}} dove al solito $t=(t_k)$, $u=(u(t_k))$, $v=(v(t_k))$.

\noindent
Per testare il comportamento di tale ricostruzione si utilizzi il seguente
codice {\tt{parmspline.m}}
per $N=4,8,12,16,20$ (nel nostro caso eseguiamo il caso $N=6$)
\begin{Verbatim}[fontsize=\small, formatcom=\color{blue}]

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-');

\end{Verbatim}

\begin{figure}\label{fig1tt}
 \centering
   {\includegraphics[scale=0.5,clip]{cerchio_spline.eps}}
 \caption{Ricostruzione del cerchio con spline cubiche parametriche, per $N=6$ in {\tt{parmspline.m}}.}
 \end{figure}

\noindent
Osserviamo che il plot del cerchio pu\myo essere {\sl{ovalizzato}} dalla
parte grafica (come il plot di
Matlab o il GNUPLOT per Octave). Aiutandosi con l'help di Matlab cercare
quali parametri possono sostituire
{\tt{'spline'}} nel comando {\tt{'interp1'}} e provarli, verificando le
differenze nella ricostruzione del cerchio per $N=8$.

\noindent
Per ulteriori approfondimenti, si considerino {\cite{COM}},
{\cite{QUA}}. Le equazioni parametriche sono tratte da {\cite{MOL}}.

\section{Facoltativo: Calcolo della derivata con splines}

Si verifichi, mediante grafici, che la derivata dell'interpolazione di
tipo spline cubica della funzione $f(x)=\sin(10 \, x)$ su $n=11$ nodi
equispaziati nell'intervallo $[0,1]$ approssima, senza interpolarla, la
derivata della funzione $f(x)$.

\subsection{Commenti all'esercitazione}

Occorre usare la function {\tt{spline}}. Tanto in Matlab quanto in Octave,
la sintassi del comando \mye la
{\tt{pp=spline(X,Y)}} dove {\tt{pp}} \mye una struttura dati contenente,
tra l'altro,
{\tt{pp.P}}, una matrice di ordine $(n-1) \times 4$ in cui alla
riga $k$-sima sono immagazzinati i coefficienti $a_{k,3}$, $\ldots$,
$a_{k,0}$ della restrizione della spline (polinomio $a_{k,3}
x^3+\ldots+a_{k,0}$) all'intervallo $I_k$. Occorre quindi creare una nuova
struttura (diciamo {\tt{pp1}}), del tipo di {\tt{pp}}, contenente la
matrice {\tt{pp.P1}} di ordine
$(n-1) \times 3$ dei coefficienti $b_{k,2}=3*a_{k,3}$, $\ldots$,
$b_{k,0}=a_{k,1}$ delle
derivate dei polinomi. Si osservi che la derivata di
$$a_{k,3} \, x^3+\ldots+a_{k,0}$$
\mye
$$3*a_{k,3} \, x^2+\ldots+a_{k,1}$$
e quindi se la matrice {\tt{pp.P}} \mye

\begin{displaymath}
pp.P=\left(
\begin{array}{llll}
a_{1,3} & a_{1,2} & a_{1,1} & a_{1,0}\\
a_{2,3} & a_{2,2} & a_{2,1} & a_{2,0}\\
a_{3,3} & a_{3,2} & a_{3,1} & a_{3,0}\\
\ldots  & \ldots  & \ldots  & \ldots
\end{array}
\right)
\end{displaymath}

\noindent
necessariamente

\begin{displaymath}
pp.P1=\left(
\begin{array}{llll}
0 & 3\,\cdot\,a_{1,2} & 2\,\cdot\,a_{1,1} & a_{1,0}\\
0 & 3\,\cdot\,a_{2,2} & 2\,\cdot\,a_{2,1} & a_{2,0}\\
0 & 3\,\cdot\,a_{3,2} & 2\,\cdot\,a_{3,1} & a_{3,0}\\
0 & \ldots  & \ldots  & \ldots
\end{array}
\right)
\end{displaymath}

\noindent
Il vettore {\sl{pp}} ottenuto dal comando {\tt{pp=spline(X,Y)}} contiene
varie informazioni.
Un tipico esempio:
\begin{Verbatim}[fontsize=\small, formatcom=\color{blue}]

      form: 'pp'
    breaks: [1x11 double]
     coefs: [10x4 double]
    pieces: 10
     order: 4
       dim: 1
\end{Verbatim}
\noindent
Per disporre dei breaks e dei coefficienti, si esegue il comando
\begin{Verbatim}[fontsize=\small, formatcom=\color{blue}]

[breaks,coeffs]=unmkpp(pp)

\end{Verbatim}
\noindent
Se il file {\tt{unmkpp}} non \mye disponibile tra le functions di Matlab,
si copi il seguente codice
\begin{Verbatim}[fontsize=\small, formatcom=\color{blue}]

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

\end{Verbatim}
\noindent
o lo si scarichi dal sito
\smsp
\noindent
\href{http://users.powernet.co.uk/kienzle/octave/matcompat/scripts/datafun/}{http://users.powernet.co.uk/kienzle/octave/matcompat/scripts/datafun/}
\smsp
\noindent
Alternativamente provare un comando del tipo
\begin{Verbatim}[fontsize=\small, formatcom=\color{blue}]

coeffs = pp.P;

\end{Verbatim}
\noindent
Una volta modificata la matrice di coefficienti  {\tt{coeffs}} in
{\tt{dcoeffs}} per il calcolo delle derivate bisogna
ricostruire una struttura dati adatta alle spline e quindi simile a
{\tt{coeffs}}. A tal proposito basta eseguire il comando
\begin{Verbatim}[fontsize=\small, formatcom=\color{blue}]

pp1=mkpp(breaks,dcoeffs)

\end{Verbatim}
\noindent
Per valutare i polinomi a tratti, si usa la
funzione {\tt{ppval}} valutata su {\tt{pp1}}. Si pu\myo produrre un
grafico di tutto il dominio $[0,1]$ per valutare la bont\mya
dell'approssimazione della derivata e di un intorno di un nodo di
interpolazione per valutare il carattere non interpolatorio.

\noindent
Un codice Matlab che svolge quanto chiesto \mye il seguente
\begin{Verbatim}[fontsize=\small, formatcom=\color{blue}]

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),'-');

\end{Verbatim}
\section{Online}

Qualora si vogliano ulteriori delucidazioni si confrontino i seguenti links
\smsp
\begin{enumerate}
\item \href{http://it.wikipedia.org/wiki/Funzione\_spline}{http://it.wikipedia.org/wiki/Funzione\_spline}
\smsp
\item \href{http://en.wikipedia.org/wiki/Spline\_\%28mathematics\%29}{http://en.wikipedia.org/wiki/Spline\_\%28mathematics\%29}
\smsp
\item \href{http://it.wikipedia.org/wiki/Interpolazione\_spline}{http://it.wikipedia.org/wiki/Interpolazione\_spline}
\smsp
\item \href{http://www.dmi.units.it/\~bellen/
calcolo\_numerico/CAPIT-5A.PDF}{http://www.dmi.units.it/\~bellen/calcolo\_numerico/CAPIT-5A.PDF}
\end{enumerate}

\noindent
Per chi volesse approfondire l'uso delle splines con Matlab, si suggerisce la monografia gratuita {\sl{Spline Toolbox User's guide}}, scaricabile al sito

\vspace{0.3cm}
\href{http://www.mathworks.com/access/helpdesk/help/pdf\_doc/splines/splines.pdf}{http://www.mathworks.com/access/helpdesk/help/pdf\_doc/splines/splines.pdf}
\vspace{0.3cm}

\noindent
Molto interessante la demo Matlab

\vspace{0.3cm}
\href{http://www.mathworks.com/access/helpdesk/help/toolbox/splines/splines.shtml}{http://www.mathworks.com/access/helpdesk/help/toolbox/splines/splines.shtml}

\noindent
consultabile in molte versioni di Matlab digitando
\begin{Verbatim}[fontsize=\small, formatcom=\color{blue}]

>> demo toolbox splines
>>

\end{Verbatim}
\begin{thebibliography}{99}
\bibitem{ATK} K. Atkinson, {\sl{Introduction to Numerical Analysis}}, Wiley, 1989.
\bibitem{COM} V. Comincioli, {\sl{Analisi Numerica, metodi modelli
applicazioni}}, Mc Graw-Hill, 1990.
\bibitem{CON} S.D. Conte e C. de Boor, {\sl{Elementary Numerical Analysis, 3rd Edition}}, Mc Graw-Hill, 1980.
\bibitem{DEB} Carl DeBoor, {\sl{Spline Toolbox User's guide}}, \\ {\href{http://www.mathworks.com/access/helpdesk/help/pdf\_doc/splines/splines.pdf}{http://www.mathworks.com/access/helpdesk/help/pdf\_doc/splines/splines.pdf}}.
\bibitem{DEBS} Carl DeBoor, {\sl{personal homepage}}, \\ {\href{http://pages.cs.wisc.edu/\~deboor/draftspline.html}{http://pages.cs.wisc.edu/\~deboor/draftspline.html}}.
\bibitem{MTF} Mac Tutor, Georg Faber, \\ {\href{http://www-history.mcs.st-andrews.ac.uk/Biographies/Faber.html}{http://www-history.mcs.st-andrews.ac.uk/Biographies/Faber.html}}.
\bibitem{MTS} Mac Tutor, Isaac Jacob Schoenberg, \\ {\href{http://www-history.mcs.st-andrews.ac.uk/Biographies/Schoenberg.html}{http://www-history.mcs.st-andrews.ac.uk/Biographies/Schoenberg.html}}.
\bibitem{MOL} The MathWorks Inc., {\sl{Numerical Computing with Matlab}}, \\ {\href{http://www.mathworks.com/moler}{http://www.mathworks.com/moler}}.
\bibitem{QUA} A. Quarteroni e F. Saleri, {\sl{Introduzione al calcolo scientifico}}, Springer Verlag, 2006.
\bibitem{SULI} A. Suli e D. Mayers, {\sl{An Introduction to Numerical Analysis}}, Cambridge University Press, 2003.
\bibitem{WIKFS} Wikipedia, Funzione Spline, \\ {\href{http://it.wikipedia.org/wiki/Funzione\_spline}{http://it.wikipedia.org/wiki/Funzione\_spline}}.
\bibitem{WIKSD} Wikipedia, Spline Device, \\ {\href{http://en.wikipedia.org/wiki/Spline\_\%28device\%29}{http://en.wikipedia.org/wiki/Spline\_\%28device\%29}}.
\bibitem{WIKSM} Wikipedia, Spline Mathematics, \\ {\href{http://en.wikipedia.org/wiki/Spline\_\%28mathematics\%29}{http://en.wikipedia.org/wiki/Spline\_\%28mathematics\%29}}.
\bibitem{WIKIS} Wikipedia, Interpolazione Spline, \\ {\href{http://it.wikipedia.org/wiki/Interpolazione\_spline}{http://it.wikipedia.org/wiki/Interpolazione\_spline}}.
\bibitem{WIKISC} Wikipedia, Isaac Jacob Schoenberg, \\ {\href{http://en.wikipedia.org/wiki/Isaac\_Jacob\_Schoenberg}{http://en.wikipedia.org/wiki/Isaac\_Jacob\_Schoenberg}}.
\end{thebibliography}

\end{document}






