-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtridiagonal.py
More file actions
68 lines (55 loc) · 1.39 KB
/
tridiagonal.py
File metadata and controls
68 lines (55 loc) · 1.39 KB
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import utils
import numpy as np
import numpy.linalg as lg
class Help:
def __init__(self, matrix, aug, dim):
self.matrix = matrix
self.aug = aug
self.dim = dim
pass
def b(self, ind):
if 0 <= ind < self.dim - 1:
return -self.matrix[ind][ind + 1]
return 0
def c(self, ind):
if 0 <= ind < self.dim:
return self.matrix[ind][ind]
return 0
def a(self, ind):
if 0 < ind < self.dim:
return -self.matrix[ind][ind - 1]
return 0
def f(self, ind):
if 0 <= ind < self.dim:
return self.aug[ind]
return 0
pass
def check(array, index):
if 0 <= index < len(array):
return array[index]
return 0
def main():
m, f = [], []
with open('data/3diag.txt', mode='r') as file:
m = utils.parse(file)
f = utils.parse(file)
dim = len(m)
h = Help(m, f[0], dim)
al, be = [0 for i in range(dim)], [0 for i in range(dim)]
for i in range(dim):
de = h.c(i) - h.a(i) * check(al, i - 1)
al[i] = h.b(i) / de
be[i] = (h.f(i) + check(be, i - 1) * h.a(i)) / de
x = [0 for i in range(dim)]
for i in reversed(range(dim)):
x[i] = al[i] * check(x, i + 1) + be[i]
r = (np.dot(m, x).T - f)[0]
with open('summary/tridiagonal.txt', mode='w+') as file:
file.write('x:')
[file.write('{:<15.5f}'.format(e)) for e in x]
file.write('\nr:')
[file.write('{:<15.5e}'.format(e)) for e in r]
file.write('\n||r|| = {:e}'.format(lg.norm(r.T, ord=np.inf)))
pass
if __name__ == '__main__':
main()