Saltar al contenido

Interpolación de Lagrange en Python

Este grupo especializado despúes de muchos días de investigación y de recopilar de datos, dieron con la respuesta, esperamos que resulte de utilidad para tu proyecto.

Solución:

Probar

def interpolate(x, x_values, y_values):
    def _basis(j):
        p = [(x - x_values[m])/(x_values[j] - x_values[m]) for m in xrange(k) if m != j]
        return reduce(operator.mul, p)
    assert len(x_values) != 0 and (len(x_values) == len(y_values)), 'x and y cannot be empty and must have the same length'
    k = len(x_values)
    return sum(_basis(j)*y_values[j] for j in xrange(k))

Puedes confirmarlo de la siguiente manera:

>>> interpolate(1,[1,2,4],[1,0,2])
1.0
>>> interpolate(2,[1,2,4],[1,0,2])
0.0
>>> interpolate(4,[1,2,4],[1,0,2])
2.0
>>> interpolate(3,[1,2,4],[1,0,2])
0.33333333333333331

Entonces, el resultado es el valor interpolado basado en el polinomio que pasa por los puntos dados. En este caso, los 3 puntos definen una parábola y las primeras 3 pruebas muestran que el valor de y indicado se devuelve para el valor de x dado.

Llegué casi una década tarde a la fiesta, pero encontré esto buscando una implementación simple de la interpolación de Lagrange. La respuesta de @smichr es excelente, pero Python está un poco desactualizado y también quería algo que funcionara bien con np.ndarrays para que pudiera hacer un trazado fácil. Tal vez otros encuentren esto útil:

import numpy as np
import matplotlib.pyplot as plt


class LagrangePoly:

    def __init__(self, X, Y):
        self.n = len(X)
        self.X = np.array(X)
        self.Y = np.array(Y)

    def basis(self, x, j):
        b = [(x - self.X[m]) / (self.X[j] - self.X[m])
             for m in range(self.n) if m != j]
        return np.prod(b, axis=0) * self.Y[j]

    def interpolate(self, x):
        b = [self.basis(x, j) for j in range(self.n)]
        return np.sum(b, axis=0)


X  = [-9, -4, -1, 7]
Y  = [5, 2, -2, 9]

plt.scatter(X, Y, c='k')

lp = LagrangePoly(X, Y)

xx = np.arange(-100, 100) / 10

plt.plot(xx, lp.basis(xx, 0))
plt.plot(xx, lp.basis(xx, 1))
plt.plot(xx, lp.basis(xx, 2))
plt.plot(xx, lp.basis(xx, 3))
plt.plot(xx, lp.interpolate(xx), linestyle=':')
plt.show()

Verifique los índices, Wikipedia dice “k + 1 puntos de datos”, pero está configurando k = len(x_values) donde debería estar k = len(x_values) - 1 si seguiste la fórmula exactamente.

Si posees alguna perplejidad y capacidad de aclarar nuestro post puedes escribir una ilustración y con mucho gusto lo ojearemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *