-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmatrixSolve.py
More file actions
59 lines (47 loc) · 1.31 KB
/
matrixSolve.py
File metadata and controls
59 lines (47 loc) · 1.31 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
from numpy import zeros,array, eye, copy, dot
def Gauss(A,b):
size = len(A)
A = array(A)
P = eye(size)
for i in range(size-1):
maxRow = i
for j in range(i+1,size):
if abs(A[j][i]) > abs(A[maxRow][i]):
maxRow = j
if maxRow != i:
#### Swap
P[[maxRow,i]] = P[[i, maxRow]]
A[[maxRow,i]] = A[[i, maxRow]]
for k in range(i+1, size):
A[k][i] /= A[i][i]
for j in range(i+1, size):
A[k][j] -= A[k][i]*A[i][j]
L = eye(size)
for i in range(size):
for j in range(i):
L[i][j] = A[i][j]
U = zeros((size,size))
for i in range(size):
for j in range(i,size):
U[i][j] = A[i][j]
b = array(b)
y = copy(dot(P,b))
# forwards
for i in range(size):
if L[i][i] == 0: #Division by 0
y[i] = 0
continue
for j in range(i):
y[i] = (y[i] - L[i][j]*y[j])/L[i][i]
x = zeros((size,1))
x[size-1] = y[size-1]/U[size-1][size-1]
for i in range(size-1,-1,-1):
if U[i][i] == 0: #Division by 0
x[i] = 0
continue
xv = y[i]
for j in range(i+1,size):
xv -= U[i][j]*x[j]
xv /= U[i][i]
x[i] = xv
return x