forked from burakbayramli/books
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcholeski.py
33 lines (29 loc) · 911 Bytes
/
choleski.py
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
## module choleski
''' L = choleski(a)
Choleski decomposition: [L][L]transpose = [a]
x = choleskiSol(L,b)
Solution phase of Choleski's decomposition method
'''
from numpy import dot
from math import sqrt
import error
def choleski(a):
n = len(a)
for k in range(n):
try:
a[k,k] = sqrt(a[k,k] - dot(a[k,0:k],a[k,0:k]))
except ValueError:
error.err('Matrix is not positive definite')
for i in range(k+1,n):
a[i,k] = (a[i,k] - dot(a[i,0:k],a[k,0:k]))/a[k,k]
for k in range(1,n): a[0:k,k] = 0.0
return a
def choleskiSol(L,b):
n = len(b)
# Solution of [L]{y} = {b}
for k in range(n):
b[k] = (b[k] - dot(L[k,0:k],b[0:k]))/L[k,k]
# Solution of [L_transpose]{x} = {y}
for k in range(n-1,-1,-1):
b[k] = (b[k] - dot(L[k+1:n,k],b[k+1:n]))/L[k,k]
return b