5.3 Interpolación de Lagrange

Referencia: Chapra 18.2 pdf 540

El polinomio de interpolación de lagrange es una reformulación del polinomio de Newton que evita el cálculo de las diferencias divididas. Se crea como:

f_{n} (x) = \sum_{i=0}^{n} L_{i} (x) f(x_{i}) L_{i} (x) = \prod_{j=0, j \neq i}^{n} \frac{x-x_j}{x_i - x_j}

Ejemplo: dados los 4 puntos en la tabla se requiere generar un polinomio de grado 3 de la forma:

p(x) = a0x3 + a1x2 + a2x1 + a3

xi 0 0.2 0.3 0.4
fi 1 1.6 1.7 2.0
Polinomio de Lagrange, expresiones
400.0*x*(x - 0.4)*(x - 0.3) - 566.666666666667*x*(x - 0.4)*(x - 0.2) + 250.0*x*(x - 0.3)*(x - 0.2) + 8.33333333333333*(-5.0*x + 1.0)*(x - 0.4)*(x - 0.3)

Polinomio de Lagrange: 
41.666666666667*x**3 - 27.5*x**2 + 6.83333333333336*x + 1.0
>>> 

Propuesta de algoritmo usando Python, como tarea realice la gráfica del polinomio resultante.

# Interpolacion de Lagrange
# Polinomio en forma simbólica
import numpy as np
import sympy as sym
import matplotlib.pyplot as plt

# INGRESO , Datos de prueba
xi = np.array([0, 0.2, 0.3, 0.4])
fi = np.array([1, 1.6, 1.7, 2.0])

# PROCEDIMIENTO
n = len(xi)
x = sym.Symbol('x')
# Polinomio
polinomio = 0
for i in range(0,n,1):
    # Termino de Lagrange
    termino = 1
    for j  in range(0,n,1):
        if (j!=i):
            termino = termino*(x-xi[j])/(xi[i]-xi[j])
    polinomio = polinomio + termino*fi[i]
# Expande el polinomio
px = polinomio.expand()
# para evaluacion numérica
pxn = sym.lambdify(x,polinomio)

# Puntos para la gráfica
a = np.min(xi)
b = np.max(xi)
muestras = 101
xi_p = np.linspace(a,b,muestras)
fi_p = pxn(xi_p)

# Salida
print('Polinomio de Lagrange, expresiones')
print(polinomio)
print()
print('Polinomio de Lagrange: ')
print(px)

# Gráfica
plt.title('Interpolación Lagrange')
plt.plot(xi,fi,'o', label = 'Puntos')
plt.plot(xi_p,fi_p, label = 'Polinomio')
plt.legend()
plt.show()