# Cubic Spline/1002/Lu Decomposition.py

## No older revisions available

from Numeric import *
from ArrayPrinter import *

class LuDecomposition:
def __init__(self, aSquareArray):
assert len(aSquareArray) == len(aSquareArray[0])
self.array = aSquareArray
self.n = len(aSquareArray)

self.l = self.makeEmptySquareMatrix(self.n)
self.u = self.makeEmptySquareMatrix(self.n)

for i in range(self.n):
self.u[i][i] = 1.0

def makeEmptySquareMatrix(self, n):
matrix = []
for i in range(0,n):
row = []
for j in range(0,n):
row.append(0.0)
matrix.append(row)
return matrix

def perform(self):
for i in range(self.n):
self._writeL(i)
self._writeU(i)
return self.l, self.u

def _writeL(self, aCol):
for eachRow in range(aCol, self.n):
self.l[eachRow][aCol] = self.array[eachRow][aCol] - self._minusForWriteL(eachRow, aCol)

def _minusForWriteL(self, aRow, aCol):
totalMinus = 0
for n in range(0, aCol):
totalMinus += self.l[aRow][n] * self.u[n][aCol]

def _writeU(self, aRow):
for eachCol in range(aRow+1, self.n):
self.u[aRow][eachCol] = float(self.array[aRow][eachCol] - self._minusForWriteU(eachCol, aRow)) / float(self.l[aRow][aRow])

def _minusForWriteU(self, aCol, aRow):
totalMinus = 0
for n in range(0, aRow):
totalMinus += self.l[aRow][n] * self.u[n][aCol]

def _getL(self):
return self.l

def _getU(self):
return self.u

if __name__=="__main__":
a = [[1.0,2.0,3.0],[4.0,5.0,6.0],[7.0,8.0,9.0]]
l, u = LuDecomposition(a).perform()
print "array : "
print array2string(array(a))
print "Lu Decomposition - L"
print array2string(array(l))
print "Lu Decomposition - U"
print array2string(array(u))