-
Notifications
You must be signed in to change notification settings - Fork 199
/
Copy pathLUdecomp5.py
41 lines (33 loc) · 1.03 KB
/
LUdecomp5.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
34
35
36
37
38
39
40
41
## module LUdecomp5
''' d,e,f = LUdecomp5(d,e,f).
LU decomposition of symetric pentadiagonal matrix
[f\e\d\e\f]. On output {d},{e} and {f} are the
diagonals of the decomposed matrix.
x = LUsolve5(d,e,f,b).
Solves [f\e\d\e\f]{x} = {b}, where {d}, {e} and {f}
are the vectors returned from LUdecomp5.
'''
def LUdecomp5(d,e,f):
n = len(d)
for k in range(n-2):
lam = e[k]/d[k]
d[k+1] = d[k+1] - lam*e[k]
e[k+1] = e[k+1] - lam*f[k]
e[k] = lam
lam = f[k]/d[k]
d[k+2] = d[k+2] - lam*f[k]
f[k] = lam
lam = e[n-2]/d[n-2]
d[n-1] = d[n-1] - lam*e[n-2]
e[n-2] = lam
return d,e,f
def LUsolve5(d,e,f,b):
n = len(d)
b[1] = b[1] - e[0]*b[0]
for k in range(2,n):
b[k] = b[k] - e[k-1]*b[k-1] - f[k-2]*b[k-2]
b[n-1] = b[n-1]/d[n-1]
b[n-2] = b[n-2]/d[n-2] - e[n-2]*b[n-1]
for k in range(n-3,-1,-1):
b[k] = b[k]/d[k] - e[k]*b[k+1] - f[k]*b[k+2]
return b