import numpy as np
import numpy.linalg as la
n = 4 # crank up--8 is a good example
nums = np.arange(n).astype(np.float64)
nums
B = 1 + nums[:, np.newaxis] + nums
B
A = 1/B
from scipy.linalg import hilbert
A2 = hilbert(n)
print "difference: %g" % la.norm(A-A2)
print "cond: %g" % np.linalg.cond(A)
b = np.ones((n,))
b1 = b.copy()
b1[-1] = 2.0/3.0
x1 = la.solve(A, b1)
print "residual of x1: %g"%(la.norm(b - np.dot(A, x1)))
b2 = b.copy()
b2[-1] = 0.667
x2 = la.solve(A, b2)
print "residual of x2: %g"%(la.norm(b - np.dot(A, x2)))
print "rel err in RHS: %g"%(la.norm(b2-b1)/la.norm(b1))
print "rel err in solution: %g"%(la.norm(x2-x1)/la.norm(x1))
x = np.ones((n,))
b = np.dot(A, x)
x3 = la.solve(A,b)
print "residual of x3: %g"%(la.norm(b - np.dot(A, x3)))
print "rel err in solution: %g"%(la.norm(x3-x)/la.norm(x))