fix: calculations of inverse matrix

This commit is contained in:
Krzysztof Rudnicki 2024-10-20 19:19:31 +02:00
parent d74da05da8
commit 70c0da16c0
2 changed files with 31 additions and 2 deletions

View File

@ -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)

View File

@ -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