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.