From 70c0da16c086171d358780849f767d6c6472160c Mon Sep 17 00:00:00 2001 From: Krzysztof Rudnicki Date: Sun, 20 Oct 2024 19:19:31 +0200 Subject: [PATCH] fix: calculations of inverse matrix --- code/eigenvalue_methods.py | 5 +++-- code/linear_algebra_utils.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/code/eigenvalue_methods.py b/code/eigenvalue_methods.py index 00302d42..0d97defa 100644 --- a/code/eigenvalue_methods.py +++ b/code/eigenvalue_methods.py @@ -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) diff --git a/code/linear_algebra_utils.py b/code/linear_algebra_utils.py index 4e08ee6c..5ff15f83 100644 --- a/code/linear_algebra_utils.py +++ b/code/linear_algebra_utils.py @@ -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