forked from bellshade/Python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLU_decomposition.py
More file actions
41 lines (33 loc) · 955 Bytes
/
LU_decomposition.py
File metadata and controls
41 lines (33 loc) · 955 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# https://en.wikipedia.org/wiki/LU_decomposition#Algorithms
def LU(A) -> tuple:
"""
>>> A = [[2, 3, 1], [4, 7, 7], [-2, 4, 5]]
>>> L, U = LU(A)
>>> L
[[1, 0, 0], [2.0, 1, 0], [-1.0, 7.0, 1]]
>>> U
[[2, 3, 1], [0.0, 1.0, 5.0], [0.0, 0.0, -29.0]]
"""
n = len(A)
L = [[1 if i == j else 0 for j in range(n)] for i in range(n)]
U = [[A[i][j] for j in range(n)] for i in range(n)]
for k in range(n - 1):
if U[k][k] == 0:
raise ValueError("Faktorisasi LU tidak ada")
for i in range(k + 1, n):
L[i][k] = U[i][k] / U[k][k]
for j in range(k, n):
U[i][j] -= L[i][k] * U[k][j]
return L, U
def main(args=None):
import doctest
doctest.testmod()
A = [[2, 3, 1], [4, 7, 7], [-2, 4, 5]]
L, U = LU(A)
for row in L:
print(row)
print("\n")
for row in U:
print(row)
if __name__ == "__main__":
main()