Interpolación Polinomial Lagrangiana con Python
Introducción.-
La interpolacion polinomial es el método para determinar un polinomio que se ajuste a un conjunto de puntos dados.
Existen varios enfoques para la interpolacion polinómica, los los cuales uno de los más conocidos es el método lagrangiano. En esta publicación se presenta el método lagrangiano de interpolacion de polinomios y como realizar el procedimiento en Python.
Antecedentes.-
La interpolación de Lagrange, nombrada en honor a Joseph-Louis Lagrange, es un método matemático para encontrar un polinomio que pase exactamente por un conjunto dado de puntos. Aunque el método lleva el nombre de Lagrange, su desarrollo y aplicación tienen una historia más rica y compleja que involucra a varios matemáticos a lo largo de los años.
![]() |
| Joseph Louis Lagrange |
Orígenes Tempranos: La idea de la interpolación, es decir, encontrar una función que pase por un conjunto de puntos dados, tiene sus raíces en la matemática antigua, pero comenzó a tomar forma más concreta con el trabajo de matemáticos del siglo XVII.
Edward Waring y Thomas Simpson (Siglo XVIII): Antes de Lagrange, Edward Waring en 1779 y Thomas Simpson en 1743 ya habían trabajado en problemas similares de interpolación. Sin embargo, su enfoque y formulaciones diferían de lo que hoy conocemos como la fórmula de interpolación de Lagrange.
Joseph-Louis Lagrange (Siglo XVIII): Lagrange, en 1795, introdujo la forma que ahora lleva su nombre en un artículo sobre la resolución de ecuaciones numéricas. Su trabajo fue un avance significativo ya que proporcionó un método simple y sistemático para la interpolación de polinomios. A diferencia de los métodos anteriores, el método de Lagrange era más general y elegante.
Leonhard Euler: Interesantemente, Leonhard Euler había trabajado en un método similar antes que Lagrange, pero su enfoque era más complicado y menos directo que el método presentado por Lagrange.
Desarrollo Posterior: A lo largo de los siglos XIX y XX, la interpolación de Lagrange se ha refinado y aplicado en diversas áreas, como la aproximación de funciones, la resolución numérica de ecuaciones diferenciales y en análisis numérico en general.
Aplicaciones Modernas: En la era moderna, la interpolación de Lagrange se utiliza ampliamente en ciencia computacional, ingeniería y análisis numérico. Es especialmente útil en situaciones donde se necesitan estimaciones precisas entre puntos de datos conocidos.
El método de Lagrange es valorado por su simplicidad conceptual y su aplicabilidad general, aunque en la práctica, otros métodos como los splines cúbicos son a menudo preferidos debido a su mejor comportamiento en conjuntos de datos más grandes o más complejos. La interpolación de Lagrange es un ejemplo clásico de cómo un concepto matemático puede desarrollarse y refinarse a lo largo del tiempo, incorporando contribuciones de múltiples matemáticos.
Planteamiento del Problema.-
Interpolación Polinomial Lagrangiano.-
El método lagrangiano de interpolación polinomial utiliza polinomios
lagrangianos para ajustar un polinomio a un conjunto dado de puntos de
datos. El polinomio de interpolación de Lagrange viene dado por el
siguiente teorema:
Para un conjunto de puntos $(x_0,y_0),(x_1,y1), \ldots, (x_n,y_n)$ sin un punto $x$ duplicado y existe una función $f$ que evalúa estos puntos, entonces hay un polinomio único $P(x)$ de grado $\leq n$, el polinomio viene dado por:
$$ \large{P(x) = f(x_o)L_{n,0}(x) + \cdots + f(x_n)L_{n,n}(x) = \sum^n_{k=0} f(x_k) L_{n,k}(x)} $$
Donde cada $k$ en $k=0,1,\ldots , n$ es:
$$ \large{L_{n,k} = \frac{(x - x_0)(x - x_1) \cdots (x - x_{k-1})(x - x_{k+1}) \cdots (x - x_n)}{(x_k - x_0)(x_k - x_1) \cdots (x_k - x_{k-1})(x_k - x_{k+1}) \cdots (x_k - x_n)} = \underset{i \neq k}{\prod^n_{i=0}} \frac{(x - x_i)}{(x_k - x_i)}}$$.
Ejemplo.-
Se considera un data set siguiente:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# Crear un dataset de 10 puntos
# Para reproducibilidad
np.random.seed(0)
# Generar 10 puntos en x entre 0 y 10
x_points = np.linspace(0, 10, 4)
# Generar y como sin(x) con ruido
y_points = np.sin(x_points) + np.random.normal(0, 0.1, 4)
# Generando el Dataframe de pandas
df = pd.DataFrame({'x': x_points, 'y': y_points})
df
| x | y | |
|---|---|---|
| 0 | 0.000000 | 0.176405 |
| 1 | 3.333333 | -0.150552 |
| 2 | 6.666667 | 0.472025 |
| 3 | 10.000000 | -0.319932 |
Cuya gráfica de estos $10$ puntos es:
Deseamos encontrar un polinomio que pase por estos puntos.
$$\begin{aligned}L_1(x) & =\dfrac{(x-3.333333)(x-6.66667)(x-10)}{(0-3.333333)(0-6.666667)(0 - 10)} =\\ & = -\dfrac{9}{200} (x-10)(x-6.66667)(x-3.3333) \\ L_2(x) & =\dfrac{(x-3.333333)(x-6.66667)(x-10)}{(3.333333-0)(3.333333- 6.666667)(3.33333 - 10)} =\\ & = \dfrac{27}{200} (x-10)(x-6.66667)(x-3.3333) \\ L_3(x) & = \dfrac{(x-3.333333)(x-6.66667)(x-10)}{(6.666667-0)(6.666667- 3.333333)(6.666667 - 10)} =\\ & = -\dfrac{27}{200} (x-10)(x-6.66667)(x-3.3333) \\ L_4(x) & = \dfrac{(x-3.333333)(x-6.66667)(x-10)}{(10-0)(10- 3.333333)(10 - 6.666667)} =\\ & = \dfrac{9}{200} (x-10)(x-6.66667)(x-3.3333) \\ \end{aligned}$$
Estos polinomios se multiplican por los elementos del vector $y$ correspondiente y se suman o se restan dependiendo del signo de los elementos del vector $y$, dando como resultado el siguiente polinomio.
$$0.176405\cdot\left(-\dfrac{9}{200} (x-10)(x-6.66667)(x-3.3333)\right) - \\ 0.150552\cdot\left(\dfrac{27}{200} (x-10)(x-6.66667)(x-3.3333) \right) + \\ 0.472025\cdot\left(-\dfrac{27}{200} (x-10)(x-6.66667)(x-3.3333)\right) - \\ 0.319932\cdot\left(\dfrac{9}{200} (x-10)(x-6.66667)(x-3.3333)\right)$$
Simplificando algebraicamente se tiene:
$$-\dfrac{5}{47} (x-10)(x.6.666667)(x-3.33333)$$
Desarrollo de Scripts e Implementación con Python.-
# Función de interpolación de Lagrange
def lagrange_interpolation(x_points, y_points, x):
if len(x_points) != len(y_points):
raise ValueError("Las listas x_points y y_points deben tener la misma longitud.")
sum = 0
n = len(x_points)
for i in range(n):
term = y_points[i]
for j in range(n):
if j != i:
term = term * (x - x_points[j]) / (x_points[i] - x_points[j])
sum += term
return sum
# Usar la función de interpolación para un conjunto de puntos en x
np.random.seed(0) # Para reproducibilidad
x_interp = np.linspace(0, 10, 4)
y_interp = [lagrange_interpolation(x_points, y_points, x) for x in x_interp]
# Visualizar el resultado
plt.figure(figsize=(10, 6))
plt.plot(x_points, y_points, 'o', label='Puntos de datos')
plt.plot(x_interp, y_interp, '-', label='Polinomio interpolante de Lagrange')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Interpolación de Lagrange con 10 puntos')
plt.legend()
plt.grid(True)
plt.show()
El cual ejecuta la siguiente gráfica.
Interpretacion de resultados.-
La interpolación es un método matemático y estadístico utilizado para estimar valores desconocidos entre dos valores conocidos. La interpolación permite estimar el valor de un punto que se encuentra entre estos dos puntos conocidos. Los puntos generados son los que generan los puntos intermedios con las conocidas funciones: $L_1(x), L_2(x),L_3(x)$ y $L_4(x)$, que inician con los elementos del vector $x$ y luego con los elementos del vector $y$. Al utilizar polinomios para modelar la relación entre los puntos de datos, es más flexible que la interpolación lineal y puede ajustarse para un conjunto de datos más complejos.
Conclusiones.-
Después de aplicar la interpolación de Lagrange al conjunto de datos simulados, se pueden extraer varias conclusiones importantes:
Ajuste Exacto para los Puntos Dados: La interpolación de Lagrange proporciona un ajuste exacto para los puntos de datos específicos utilizados en el cálculo. Esto significa que el polinomio interpolante pasa exactamente por cada uno de los puntos de datos.
Comportamiento entre Puntos: Mientras que la interpolación de Lagrange garantiza un ajuste exacto en los puntos de datos, su comportamiento entre estos puntos puede ser menos predecible, especialmente si los puntos están muy separados o si el número de puntos es grande. En nuestro caso, con 10 puntos y una función subyacente relativamente suave (seno con ruido), el polinomio interpolante parece capturar bien la tendencia general, pero podría haber oscilaciones notables, especialmente cerca de los extremos del intervalo.
Sensibilidad al Ruido: La interpolación de Lagrange es sensible al ruido en los datos. Dado que se ajusta exactamente a los puntos de datos, cualquier error o ruido en los datos se reflejará en el polinomio interpolante. Esto puede llevar a un fenómeno conocido como "fenómeno de Runge", donde el polinomio oscila significativamente, particularmente hacia los extremos del intervalo de interpolación.
Utilidad en Datos Suaves y Bien Comportados: La técnica es más efectiva cuando se aplica a datos que son suaves y están bien comportados, como en el caso de nuestra simulación donde los datos siguen una función de seno con un pequeño ruido añadido.
Limitaciones para Grandes Conjuntos de Datos: Para conjuntos de datos grandes, la interpolación de Lagrange puede no ser la mejor opción debido a su complejidad computacional y a las oscilaciones excesivas. En tales casos, otros métodos como la interpolación por splines pueden ser más adecuados.
Bibliografía.-
Cheney, E. W., & Kincaid, D. (2013). Numerical mathematics and computing (6th ed.). Boston, MA: Brooks/Cole, Cengage Learning.
Burden, R. L., & Faires, J. D. (2011). Numerical analysis (9th ed.). Boston, MA: Brooks/Cole, Cengage Learning.



Comentarios
Publicar un comentario