#!/usr/bin/env python
import numpy as np
from matplotlib import pyplot as plt
data_fname = 'knot_points.csv'
# x1,y1
# x2,y2
# ...
def read_data(fname):
X = []
Y = []
with open(fname, 'r') as f:
for line in f:
(x, y) = line.split(',')
X.append(float(x))
Y.append(float(y))
return (X, Y)
def langrange_polynomial(X, Y):
def L(i):
return lambda x: np.prod([(x-X[j])/(X[i]-X[j]) for j in range(len(X)) if i != j]) * Y[i]
Sx = [L(i) for i in range(len(X))] # summands
return lambda x: np.sum([s(x) for s in Sx])
# F = langrange_polynomial(*read_data(data_fname))
(X, Y) = read_data(data_fname)
F = langrange_polynomial(X, Y)
x_range = np.linspace(X[0], X[-1], 100)
plt.plot(X, Y, 'ro')
plt.plot(x_range, map(F, x_range))
plt.xlabel(r'$x$')
plt.ylabel(r'$F(x)$')
plt.title('Lagrange polynomial interpolation')
plt.grid(True)
plt.show()