Jump to content

LU decomposition: Difference between revisions

Added Python version
(Simplified D code)
(Added Python version)
Line 380:
[0, 1, 0, 0],
[0, 0, 0, 1]]</pre>
 
=={{header|Python}}==
{{trans|D}}
<lang python>from pprint import pprint
 
def matrixMul(A, B):
TB = zip(*B)
return [[sum(ea*eb for ea,eb in zip(a,b)) for b in TB] for a in A]
 
def pivotize(m):
"""Creates the pivoting matrix for m."""
n = len(m)
ID = [[float(i == j) for i in xrange(n)] for j in xrange(n)]
for j in xrange(n):
row = max(xrange(j, n), key=lambda i: m[i][j])
if j != row:
ID[j], ID[row] = ID[row], ID[j]
return ID
 
def lu(A):
"""Decomposes a nxn matrix A by PA=LU and returns L, U and P."""
n = len(A)
L = [[0.0] * n for i in xrange(n)]
U = [[0.0] * n for i in xrange(n)]
P = pivotize(A)
A2 = matrixMul(P, A)
for j in xrange(n):
L[j][j] = 1.0
for i in xrange(j+1):
s1 = sum(U[k][j] * L[i][k] for k in xrange(i))
U[i][j] = A2[i][j] - s1
for i in xrange(j, n):
s2 = sum(U[k][j] * L[i][k] for k in xrange(j))
L[i][j] = (A2[i][j] - s2) / U[j][j]
return (L, U, P)
 
a = [[1, 3, 5], [2, 4, 7], [1, 1, 0]]
for part in lu(a):
pprint(part, width=19)
print
print
b = [[11,9,24,2],[1,5,2,6],[3,17,18,1],[2,5,7,1]]
for part in lu(b):
pprint(part)
print</lang>
Output:
<pre>[[1.0, 0.0, 0.0],
[0.5, 1.0, 0.0],
[0.5, -1.0, 1.0]]
 
[[2.0, 4.0, 7.0],
[0.0, 1.0, 1.5],
[0.0, 0.0, -2.0]]
 
[[0.0, 1.0, 0.0],
[1.0, 0.0, 0.0],
[0.0, 0.0, 1.0]]
 
 
[[1.0, 0.0, 0.0, 0.0],
[0.27272727272727271, 1.0, 0.0, 0.0],
[0.090909090909090912, 0.28749999999999998, 1.0, 0.0],
[0.18181818181818182, 0.23124999999999996, 0.0035971223021580693, 1.0]]
 
[[11.0, 9.0, 24.0, 2.0],
[0.0, 14.545454545454547, 11.454545454545455, 0.45454545454545459],
[0.0, 0.0, -3.4749999999999996, 5.6875],
[0.0, 0.0, 0.0, 0.51079136690647597]]
 
[[1.0, 0.0, 0.0, 0.0],
[0.0, 0.0, 1.0, 0.0],
[0.0, 1.0, 0.0, 0.0],
[0.0, 0.0, 0.0, 1.0]]</pre>
 
=={{header|Tcl}}==
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.