Interpolación con splines

Una función spline es una función que interpola varios puntos $(x_j, y_j)$: es un polinomio cúbico $S_j$ en cada intervalo $(x_{j},x_{j+1})$ que interpola los valores dados:

  • $S_j(x_j) = y_j,\; S_j(x_{j+1}) = y_{j+1}$

y además:

  • $S_{j+1}'(x_{j+1})=S_j'(x_{j+1})$, $j=0,1,\ldots,n-2$ ($S'$ es continua en los nodos)
  • $S_{j+1}''(x_{j+1})=S_j''(x_{j+1})$, $j=0,1,\ldots,n-2$ ($S''$ es continua en los nodos)

Estas condiciones plantean un sistema de $4n$ ecuaciones y $4n-2$ incógnitas, de modo que es habitual completarlo con una condición extra en cada extremo: una en $x_0$ y otra en $x_n$ (aunque también es habitual imponer una condición extra en $x_1$ y otra en $x_{n-1}$).

In [21]:
xs = [1:10];
ys = zeros(1,10);
ys(3)=1;
% Evaluamos en un array de puntos x_eval, para dibujar el spline
x_eval = linspace(1,10,200);
y_eval = spline(xs, ys, x_eval);
hold on;
plot(xs, ys, 'o');
plot(x_eval, y_eval,'-');
title('Spline interpolador')
xlabel('x')
ylabel('y')
hold off;
legend('nodos de interpolacion', 'spline')

Ejercicio

Lee la documentación de spline:

  • Aprende a calcular splines con condiciones de frontera restrigida.
  • Aprende a evaluar una función spline en un punto concreto.
  • ¿Con qué condiciones de frontera se ha calculado el ejemplo anterior?
In [ ]:

In [ ]:

Ejercicio

  • Interpola la función $f(x)=\sin(x)$ en el intervalo $[0,2\pi]$ usando $N=6$ puntos de interpolación. Estima el máximo error cometido, compáralo con el error que comete el polinomio interpolador.
  • Interpola la función de Runge $f(x)=\frac{1}{1+25\cdot x^2}$ en el intervalo $[-1,1]$ usando $N=6$ puntos de interpolación. Estima el máximo error cometido, compáralo con el error que comete el polinomio interpolador.
In [ ]:

In [ ]:

In [ ]:

Base de Lagrange

Cuando buscamos el polinomio $P(x)$ tal que $f(x_i)=y_i$ para un conjunto $x_0, \dots, x_n$, la solución se puede expresar en la forma:

$$ f(x)=\sum_{i=0}^n y_i L_{n,i}(x) $$

para los polinomios de la base de Lagrange:

$$ L_{n,i} = \prod_{k=0,k\neq i}\frac{x-x_k}{x_i-x_k} $$

El polinomio $L_{n,i}$ "el único polinomio de grado $\leq n$ tal que": \begin{split} L_{n,i}(x_k)=0 & \text{ si } k\neq i \\ L_{n,i}(x_i)=1 \end{split}

Las splines naturales funcionan igual

Para interpolar sobre un conjunto $x_0,\dots,x_n$, de modo que $f(x_i)=y_i$: $$ f(x)=\sum_{i=0}^n y_i B_{i}(x) $$ donde $B_i$ es _"la única spline cúbica natural en los puntos $x_0,\dots,x_n$ tal que": $$ \begin{array}{rr} B{i}(xk)=0 & \text{ si } k\neq i \ B{i}(x_i)=1 \end{array} $$

Principio de superposición

Definimios $\mathcal{S}_{x_0,\dots,x_n}$ como el conjunto de todas las funciones de clase $\mathcal{C}^{2}$ que además es un polinomio cúbico en cada intervalo $[x_i,x_{i+1}]$, y cuya segunda derivada se anula en $x_0$ y en $x_n$.

$a,b\in\mathbb{R}, f,g\in\mathcal{S}_{x_0,\dots,x_n} \Rightarrow af+bg\in\mathcal{S}_{x_0,\dots,x_n} $

La fórmula de antes: $$ f(x)=\sum_{i=0}^n y_i B_{i}(x) $$ es fácil de demostrar: la función de la derecha es una spline cúbica con condiciones de frontera naturales tal que $f(x_i)=y_i$, pero sabemos que sólo hay función que verifique estas condiciones.

Ejercicio

  • Dibuja todos las funciones de la base de splines para 10 puntos equiespaciados, compáralas con los polinomios de la base de Lagrange.
In [ ]:

In [ ]: