mirror of
https://github.com/kuhyx/WUT_Computer_Science.git
synced 2026-07-04 13:03:05 +02:00
fix: calculations of inverse matrix
This commit is contained in:
parent
d74da05da8
commit
70c0da16c0
@ -21,6 +21,7 @@ class EigenvalueMethods:
|
||||
def inverse_power_method(A, max_iter, tol=1e-6):
|
||||
n = len(A)
|
||||
I = [[1 if i == j else 0 for j in range(n)] for i in range(n)]
|
||||
A_inv = [[I[i][j] - A[i][j] for j in range(n)] for i in range(n)]
|
||||
|
||||
A_inv = [LinearAlgebraUtils.gaussian_elimination(A.tolist(), I_col) for I_col in I]
|
||||
A_inv = list(map(list, zip(*A_inv)))
|
||||
|
||||
return 1 / EigenvalueMethods.power_method(A_inv, max_iter, tol)
|
||||
|
||||
@ -41,3 +41,31 @@ class LinearAlgebraUtils:
|
||||
@staticmethod
|
||||
def matrix_matrix_subtraction(A, B):
|
||||
return [[A[i][j] - B[i][j] for j in range(len(A[0]))] for i in range(len(A))]
|
||||
|
||||
@staticmethod
|
||||
def gaussian_elimination(A, b):
|
||||
n = len(A)
|
||||
M = [row[:] for row in A]
|
||||
|
||||
for i in range(n):
|
||||
M[i].append(b[i])
|
||||
|
||||
for k in range(n):
|
||||
if M[k][k] == 0:
|
||||
for i in range(k + 1, n):
|
||||
if M[i][k] != 0:
|
||||
M[k], M[i] = M[i], M[k]
|
||||
break
|
||||
|
||||
for i in range(k + 1, n):
|
||||
factor = M[i][k] / M[k][k]
|
||||
for j in range(k, n + 1):
|
||||
M[i][j] -= factor * M[k][j]
|
||||
|
||||
x = [0] * n
|
||||
for i in range(n - 1, -1, -1):
|
||||
x[i] = M[i][-1] / M[i][i]
|
||||
for k in range(i - 1, -1, -1):
|
||||
M[k][-1] -= M[k][i] * x[i]
|
||||
|
||||
return x
|
||||
|
||||
Loading…
Reference in New Issue
Block a user