Práctica 6
Técnicas básicas de interpolación polinómica

Mathematica y la interpolación polinómica

Mathematica proporciona una herramienta específica para resolver cualquier problema de interpolación de Hermite uniforme sin tener que formar y resolver el sistema lineal oportuno.
Este problema consiste en interpolar los valores que una  función y sus derivadas sucesivas toman en un conjunto de nodos, pero considerándose en cada nodo derivadas hasta el orden que se desee, independientemente pero con la condición de que en cada uno de ellos no se puede dejar de considerar ningún orden de derivación intermedio.

Más concretamente, si {x1,x2,...,xn} son los nodos, en cada xi podemos considerar derivadas de órdenes 0,1,...,ni, donde ni es un número natural o cero tan sólo dependiente de xi.

La interpolación de Lagrange, la de Hermite y la de Taylor son
casos particulares.

La sintaxis de la orden es

                                    InterpolatingPolynomial[datos,variable]

Los datos pueden especificarse de dos formas:

   1.-   {f1,f2,...,fn} indica interpolación de los datos f1, f2, ..., fn en los nodos 1, 2, ..., n, respectivamente.
   2.-   {{x1,f1},{x2,f2},...,{xn,fn}} indica interpolación de los datos f1, f2, ..., fn en los nodos x1, x2, ..., xn, respectivamente.

Cada dato fi puede ser una lista que represente los valores de función y de derivadas que se desea interpolar en el nodo xi.

Un ejemplo aclarará la situación.

Disponemos de los nodos {0,2,3}. De una función f se conoce que

    f(0)=1,  f'(0)=-1,  f''(0)=3
    f(2)=-3, f'(2)=0
    f(3)=1

Su polinomio de interpolación (que debe ser de grado menor o igual que 5) es

p = 
      InterpolatingPolynomial[{{0, {1, -1, 3}}, {2, {-3, 0}}, {3, 
            1}}, x]

Expand[p]

Plot[p, {x, 0, 3}]

A continuación mostramos varios ejemplos de interpolación haciendo uso de la orden InterpolatingPolynomial en los espacios de polinomios en los cuales tienen solución única. Observe el grado del polinomio de interpolación resultante.

A) Interpolar f(x)=Cos((3/2) πx - (π/3)) para los datos {f(0),f(1)} (Interpolación de Lagrange en 2 nodos)

f[x_] := Cos[3./2  Pi x - Pi/3]

p1 = InterpolatingPolynomial[{{0, f[0]}, {1, f[1]}}, x]

Plot[{f[x], p1}, {x, 0, 1}]

B) Interpolar f(x) para los datos {f(0), f(1/2),f(1)} (Interpolación de Lagrange en 3 nodos)

p2 = 
      InterpolatingPolynomial[{{0, f[0]}, {(1/2), f[(1/2)]}, {1, f[1]}}, x]

Expand[p2]

Plot[{f[x], p2}, {x, 0, 1}]

C) Interpolar f(x) para los datos {f(0), f'(0),f(1),f'(1)} (Interpolación clásica de Hermite en 2 nodos)

p3=InterpolatingPolynomial[{{0,{f[0],f'[0]}},{1,{f[1],f'[1]}}},x]

Expand[p3]

Plot[{f[x], p3}, {x, 0, 1}]

Interpolación spline

A continuación tratamos de la  interpolación datos de Lagrange o de Hermite en espacios de funciones polinómicas a trozos, llamadas funciones spline.

Definición y visualización de funciones spline

Una función spline de grado n y clase m es una función definida a trozos por polinomios de grado n tal que, en los puntos que unen los distintos tramos, llamados nodos, la función admite derivada hasta el orden m. Por ejemplo, la función definida a trozos por:

f[x_] := Which[x ≤ 0, (x^4) - 2 (x^2), x > 0, (x^4) + (x^2)]

es una función spline de grado 4 continua y con derivada primera continua. Por tanto, es una función spline de grado 4 y clase 1. Para comprobarlo basta con señalar que los límites laterales en x=0 son iguales a 0 y, por tanto, la función es continua. Asimismo, su derivada es

f'[x]

y también verifica que los límites laterales en x=0 son iguales a 0, por lo que la función es de clase 1. También se puede comprobar la continuidad de la función y de su derivada gráficamente:

Plot[f[x], {x, -2, 2}, PlotRange -> All];

Plot[f'[x],{x, -2, 2},PlotRange -> All];

En cambio la derivada segunda no es continua en x=0:

Plot[f''[x],{x, -2, 2},PlotRange -> All];

Interpolación por poligonales

La función spline más sencilla que se puede construir es la de grado 1 y clase 0, es decir, la poligonal que une cierto número de puntos.
Por ejemplo, vamos a construir la poligonal que une los puntos (-2,2), (-1,3), (0,-1) y (2,3).

Los nodos son x1 = -2, x2 = -1, x3 = 0 y x4 = 2, y los valores que deseamos interpolar son y1 = 2, y2 = 3, y3 = -1 e y4 = 3. Por tanto, el interpolante spline está formado por tres trozos polinómicos de grado <=1 que verifican las condiciones de interpolación dadas. Estos tramos polinómicos son:

\(nod = {\(-2\), \(-1\), 0, 2}; 
y = {2, 3, \(-1\), 3}; 

    sp1 = InterpolatingPolynomial[{{
            nod[[1]], 
            y[[1]]}, {
            nod[[2]], 
            y[[2]]}}, x]\)sp2 = 
      InterpolatingPolynomial[{{
            nod[[2]], 
            y[[2]]}, {
            nod[[3]], 
            y[[3]]}}, x]sp3 = 
      InterpolatingPolynomial[{{
            nod[[3]], 
            y[[3]]}, {
            nod[[4]], 
            y[[4]]}}, x]

Luego la función spline de grado 1 continua que interpola los puntos dados es

sp = 
      Which[nod[[1]] ≤ x 
          ≤ nod[[2]], sp1, 
        nod[[2]] ≤ x 
          ≤ nod[[3]], sp2, 
        nod[[3]] ≤ x 
          ≤ nod[[4]], sp3];

grasp = 
      Plot[sp, {x, nod[[1]], 
          nod[[4]]}];

Se trata obviamente de la poligonal que une los puntos dados,como podemos observar a continuación.

punt = 
      ListPlot[Table[{nod[[i]], 
            y[[i]]}, {i, 1, 4}], 
        PlotStyle -> PointSize[0.03]];

Show[grasp, punt];

A continuación se visualiza la gráfica de esta función spline, en primer lugar, tramo a tramo y, a continuación, globalmente:

Interpolación mediante splines cúbicas de clase 1

En este caso, fijados unos nodos x1,....,xn, se trata de interpolar datos de Hermite clásicos en los mismos, es decir, valor de función y valor de derivada primera en los nodos, mediante splines de grado 3 y clase 1.

Como ejemplo, vamos a interpolar los puntos (-2,1), (-1,3), (0,-1), (1,3) y (2,1) con pendientes 1,-1,0,1 y -1, respectivamente. Es decir, se trata de hallar una función spline cúbica de clase 1, sp, que verifique:
                         sp(-2) = 1,  sp'(-2) = 1,
                         sp(-1) = 3,  sp'(-1) = -1,
                         sp(0) = -1,  sp'(0) = 0,
                         sp(1) = 3,   sp'(1) = 1,
                         sp(2) = 1,  sp'(2) = -1.

nod = {-2, -1, 0, 1, 2}y = {1, 3, -1, 3, 1}d = {1, -1, 0, 1, -1}

Los tramos polinómicos son:

sp1 = 
      InterpolatingPolynomial[{{
            nod[[1]], {
              y[[1]], 
              d[[1]]}}, {
            nod[[2]], {
              y[[2]], 
              d[[2]]}}}, x]sp2 = 
      InterpolatingPolynomial[{{
            nod[[2]], {
              y[[2]], 
              d[[2]]}}, {
            nod[[3]], {
              y[[3]], 
              d[[3]]}}}, x]sp3 = 
      InterpolatingPolynomial[{{
            nod[[3]], {
              y[[3]], 
              d[[3]]}}, {
            nod[[4]], {
              y[[4]], 
              d[[4]]}}}, x]sp4 = 
      InterpolatingPolynomial[{{
            nod[[4]], {
              y[[4]], 
              d[[4]]}}, {
            nod[[5]], {
              y[[5]], 
              d[[5]]}}}, x]

Luego la función spline es

sp = 
      Which[nod[[1]] ≤ x 
          ≤ nod[[2]], sp1, 
        nod[[2]] ≤ x 
          ≤ nod[[3]], sp2, 
        nod[[3]] ≤ x 
          ≤ nod[[4]], sp3, 
        nod[[4]] ≤ x 
          ≤ nod[[5]], sp4];

grasp = 
      Plot[sp, {x, nod[[1]], 
          nod[[5]]}];

Interpolación mediante splines cuadráticas de clase 1

Se trata de interpolar un conjunto de puntos mediante una función spline cuadrática de clase 1. Se puede probar que este problema tiene solución única si además se conoce la derivada en uno de los puntos, por ejemplo el extremo de la izquierda.

Como ejemplo, hallemos la función spline cuadrática de clase 1 que interpola los puntos (-2,1), (-1,-2), (0,3) y (2,0) sabiendo que la derivada en el primer nodo (en x = -2) es 0.

\(nod = {\(-2\), \(-1\), 0, 2}; 
y = {1, \(-2\), 3, 0}; 
d = 0; \)

El primer tramo es un polinomio de grado 2 que interpola los dos primeros puntos y tal que la derivada en el primer nodo es 0:

sp1 = 
      InterpolatingPolynomial[{{
            nod[[1]], {
              y[[1]], d}}, {
            nod[[2]], 
            y[[2]]}}, x]

La derivada de este polinomio en el nodo de la derecha es

d = 
      D[sp1, x] /. {x -> nod[[2]]}

El segundo tramo es un polinomio de grado 2 que interpola los nodos segundo y tercero y tal que la derivada en el nodo segundo es d:

sp2 = 
      InterpolatingPolynomial[{{
            nod[[2]], {
              y[[2]], d}}, {
            nod[[3]], 
            y[[3]]}}, x]

La derivada de este polinomio en el nodo de la derecha es

d = 
      D[sp2, x] /. {x -> nod[[3]]}

Por último, el tercer tramo es un polinomio de grado 2 que interpola los nodos tercero y cuarto y tal que la derivada en el nodo tercero es d:

sp3 = 
      InterpolatingPolynomial[{{
            nod[[3]], {
              y[[3]], d}}, {
            nod[[4]], 
            y[[4]]}}, x]

sp = 
      Which[nod[[1]] ≤ x 
          ≤ nod[[2]], sp1, 
        nod[[2]] ≤ x 
          ≤ nod[[3]], sp2, 
        nod[[3]] ≤ x 
          ≤ nod[[4]], sp3];

grasp = 
      Plot[sp, {x, nod[[1]], 
          nod[[4]]}];

Ejercicios

1.- Calcule el polinomio de primer grado que en x=10 vale 13 y  en x=15   toma el valor 12.

2.- Calcule el polinomio de segundo grado que en x=10 vale 13, en x=15  vale 12   y en 14 vale 17. Dibuje la recta del ejercicio 1 y la parábola de éste en un mismo gráfico.

3.- Calcule el polinomio de tercer grado que vale 13 en x=10,  en x=15  vale 12 y es tal que su derivada en x=10 vale 5 y en x=15 toma el valor  -7. Dibuje, juntas, las tres curvas obtenidas en estos tres primeros ejercicios.

4.- Hallar la poligonal que interpola los puntos (-2,5), (0,-2) , (2,3) y (4,0)

5.- Hallar la función spline cúbica de clase 1 que interpola la función f(x)=sen x en los  nodos -Pi, -Pi/2, 0, Pi/2 y Pi.

6.-Hallar la función spline cuadrática de clase 1 que interpola la función f(x)=sen x en los nodos-Pi,-Pi/2,0,Pi/2 y Pi y la derivada de f(x) en-Pi.

7.- Reconstruya mediante interpolación spline cuadrática de clase 1 el contorno superior de un corte geológico utilizando 9 datos apropiados.