import numpy as np def LU(A): n = A.shape[0] L = np.zeros((n,n)) U = np.array(A) for i in range(n-1): L[i,i] = 1.0 L[i+1:n,i] = U[i+1:n,i]/U[i,i] for j in range(i+1,n): U[j,i+1:n] = U[j,i+1:n] - L[j,i] * U[i,i+1:n] U[i+1:n,i] = 0.0 L[n-1,n-1] = 1.0 return L,U def LUSolve(L,U,b): n = L.shape[0] # solve Ly = b y = 0*b for i in range(n): y[i] = (b[i] - L[i,0:i].dot(y[0:i]))/L[i,i] # solve Ux = y x = 0*b for i in range(n-1,-1,-1): x[i] = (y[i] - U[i,i+1:n].dot(x[i+1:n]))/U[i,i] return x n = 3 A = np.random.rand(n,n) L,U = LU(A) print A print L print U print A - L.dot(U) b = np.random.rand(n) x = LUSolve(L,U,b) print A.dot(x) - b