Interpolación de Lagrange en Python

Quiero interpolar un polinomio con el método de Lagrange, pero este código no funciona:

def interpolate(x_values, y_values): def _basis(j): p = [(x - x_values[m])/(x_values[j] - x_values[m]) for m in xrange(k + 1) 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) for j in xrange(k)) 

Seguí Wikipedia , pero cuando lo ejecuto recibo un IndexError en la línea 3.

Gracias

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 siguió exactamente la fórmula.

Tratar

 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 atraviesa los puntos dados. En este caso, los 3 puntos definen una parábola y las primeras 3 pruebas muestran que el valor y_ indicado se devuelve para el valor_x dado.