Práctica 4:Interpolación polinómica

InterpolatingPolynomial[datos,variable]

Interpolación polinómica de Lagrange

A partir de datos cualesquiera:

nodos = {-1, 4, 3, 7, 5, 2};
valores = {1, -1, 4, 2, 0, 3};
datos = Transpose[{nodos, valores}];
Print["datos tipo Lagrange = ", datos]

1. Primero lo haremos resolviendo el sistema de Vandermonde:

n = Length[nodos];
A = 
        Table[nodos[[i]]^(j - 1), {i, n}, {j, 
            n}];
MatrixForm[A]

a = LinearSolve[A, valores];
p1[x_] := 
        Sum[a[[i]] x^(i - 1), {i, n}];
Print["p1(x) = ", p1[x] // Expand]

2. En segundo lugar, usando la fórmula de Lagrange:

n = Length[nodos];
p2[
          x_] := (∑_(i = 1)^n) valores[[i]]*
            Product[If[j == i, 
                1, ((x - nodos[[j]])/(nodos[[i]] - nodos[[j]]))], {j, n}];
Print["p2(x) = ", Expand[p2[x]]];

3. Y finalmente, usando el comando InterpolatingPolynomial[datos,variable]

p3[x_] := 
      InterpolatingPolynomial[datos, 
          t] /. {t -> x}
Print["p3(x) = ", p3[x] // Expand]

4. Ahora dibujamos los datos y el polinomio de interpolación

ptos = 
        ListPlot[datos, 
          PlotStyle -> {PointSize[0.03]}];
poli = 
        Plot[p3[x], {x, Min[nodos], 
            Max[nodos]}];
Show[poli, ptos]

A partir de datos de una función:

Clear[nodos, valores, datos, p]
f[x_] := E^ x;
nodos = {-1, 0, 1};
valores = f[nodos];
datos = Transpose[{nodos, valores}];
Print["datos de la función f(x) -> ", datos]

p[x_] := InterpolatingPolynomial[datos, 
          t]/.{t -> 
            x}

Plot[{f[x], p[x]}, {x, Min[nodos], Max[nodos]}, 
        PlotStyle -> {RGBColor[0, 0, 1], 
            RGBColor[1, 0, 0]}];
Plot[{f[x], p[x]}, {x, Min[nodos] - 3, Max[nodos] + 1}, 
        PlotStyle -> {RGBColor[0, 0, 1], 
            RGBColor[1, 0, 0]}];

Interpolación polinómica de Hermite

Clear[nodos, valores, datos, p]
nodos = {0, 1, 2};
valores = {1, 1, 1};
derivadas = {0, -1, 3};
datos = 
        Table[{nodos[[i]], {valores[[i]], derivadas[[i]]}}, {i, 
            3}];
Print["datos tipo Hermite = ", datos]

¡Observar el modo en el que se introducen las derivadas!

p[x_] := 
      InterpolatingPolynomial[datos, 
          t] /. {t -> x}
Print["p(x) = ", p[x] // Expand]
poli = Plot[p[x], {x, Min[nodos], Max[nodos]}];

ptos = 
        ListPlot[Transpose[{nodos, valores}], 
          PlotStyle -> {PointSize[0.03]}];
deriv = 
        Graphics[{{Thickness[ .01], Line[{{0, 1}, {0.5, 1}}]}, 
            Polygon[{{ .6, 1}, {0.45, 1.03}, {0.45, 
                  0.97}}], {Thickness[ .01], Line[{{1, 1}, {1.3, 0.69}}]}, 
            Polygon[{{1.35, 0.64}, {1.35, 0.72}, {1.26, 
                  0.67}}], {Thickness[ .01], Line[{{2, 1}, {2.13, 1.4}}]}, 
            Polygon[{{2.15, 1.47}, {2.09, 1.41}, {2.18, 
                  1.4}}]}];
Show[deriv, ptos, poli,  Axes -> True]

Interpolación polinómica de Taylor

Lo haremos sobre los datos de la función Seno y sus 5 primeras derivadas en cero:

Clear[nodos, valores, datos, p]
f[x_] := Sin[x];
nodo = 0;
valores = 
      Table[D[f[x], {x, i}] /. {x -> nodo}, {i, 0, 
          5}]
datos = {{nodo, valores}};
Print["datos tipo Taylor = ", datos]

p[x_] := 
      InterpolatingPolynomial[datos, 
          t] /. {t -> x}
Print["p(x) = ", p[x] // Expand]
Plot[{p[x], Sin[x]}, {x, -3, 3}, 
        PlotStyle -> {RGBColor[0, 0, 1], 
            RGBColor[1, 0, 0]}];

Veamos que coincide con el polinomio de Taylor de grado 5 de la función Seno en el punto cero que calcularemos con un comando directo de Mathematica.

Series[Sin[x], {x, 0, 5}] 
Normal[Series[Sin[x], {x, 0, 5}]]

Errores PIPL

datos = Table[{i, 1}, {i, 20}];
Print["datos = ", 
      MatrixForm[Transpose[datos]]]
p[x_] := 
      InterpolatingPolynomial[datos, 
          t] /. {t -> x}
Print["polinomio interpolador: p(x)=", 
      p[x]]
ptos = 
        ListPlot[datos, 
          PlotStyle -> {PointSize[0.03]}];
poli = 
        Plot[p[x], {x, 1, 20}, 
          PlotStyle -> {Thickness[ .01], 
              RGBColor[1, 0, 0]}];
Show[ptos, poli]

datos[[10, 2]] = 1.01;
Print["datos = ", 
      MatrixForm[Transpose[datos]]]
p[x_] := 
      InterpolatingPolynomial[datos, 
          t] /. {t -> x}
Print["polinomio interpolador: p(x)=", 
      p[x] // Expand]
ptos = 
        ListPlot[datos, 
          PlotStyle -> {PointSize[0.03]}];
poli = 
        Plot[p[x], {x, 1, 20}, 
          PlotStyle -> {Thickness[ .01], 
              RGBColor[1, 0, 0]}];
Show[ptos, poli]

Ejercicios:

1. Aproxima el valor de Sen(1) y Sen(3) por el valor de su polinomio de interpolación: 

    A. De tipo Lagrange en los nodos {((-π)/3),  ((-π)/4),  ((-π)/6), 
        0,  (π/6),  (π/4) ,  (π/3)}.
    B. De tipo Hermite en los mismos nodos.
    C. De tipo Taylor usando sus primeras 7 derivadas en el punto cero.
    D. De tipo Hermite generalizado, usando 2 derivadas en los nodos anteriores.
    
 Compara los resultados con el resultado exacto.

2. A. Calcula el polinomio de primer grado que en x=10 vale 13 y  en x=15 toma el valor 12.
    B. Calcula el polinomio de segundo grado que en x=10 vale 13, en x=15  vale 12 y en 14 vale 17.
    C. Calcula 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. 
    D. Dibuja juntas y con diferente color las tres curvas obtenidas.