In [20]:
from __future__ import division

import numpy
import numpy.linalg as la
In [21]:
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
In [22]:
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
[[1 1]
 [0 1]]

In [23]:
weights = la.solve(Vt, rhs)

print weights
[ 0.5  0.5]

In [25]:
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)
Error at degree 0: 0
Error at degree 1: 0
Error at degree 2: 0.166667

In [24]: