from __future__ import division
import numpy
import numpy.linalg as la
nodes = [0, 1]
#nodes = [0, 0.5, 1]
#nodes = [3, 3.5, 4]
#nodes = [0, 1, 2]
#nodes = np.linspace(0, 1, 12)
max_degree = len(nodes)-1
nodes = np.array(nodes)
powers = np.arange(max_degree+1)
Vt = nodes ** powers.reshape(-1, 1)
a = nodes[0]
b = nodes[-1]
rhs = 1/(powers+1) * (b**(powers+1) - a**(powers+1))
if len(nodes) <= 4:
print Vt
weights = la.solve(Vt, rhs)
print weights
for i in range(len(nodes) + 1):
approx = np.dot(weights, nodes**i)
true = 1/(i+1)*(b**(i+1) - a**(i+1))
print "Error at degree %d: %g" % (i, approx-true)