2024-10-20 16:30:42 +02:00
|
|
|
from linear_algebra_utils import LinearAlgebraUtils
|
|
|
|
|
|
|
|
|
|
class EigenvalueMethods:
|
|
|
|
|
@staticmethod
|
|
|
|
|
def power_method(A, max_iter=1000, tol=1e-6):
|
|
|
|
|
n = len(A)
|
|
|
|
|
x = [1] * n
|
|
|
|
|
lambda_old = 0
|
|
|
|
|
|
|
|
|
|
for _ in range(max_iter):
|
|
|
|
|
x = LinearAlgebraUtils.matrix_vector_multiply(A, x)
|
|
|
|
|
lambda_new = LinearAlgebraUtils.vector_norm(x)
|
2024-10-20 17:47:37 +02:00
|
|
|
x = LinearAlgebraUtils.vector_scalar_divide(x, lambda_new)
|
2024-10-20 16:30:42 +02:00
|
|
|
if abs(lambda_new - lambda_old) < tol:
|
|
|
|
|
break
|
|
|
|
|
lambda_old = lambda_new
|
|
|
|
|
|
|
|
|
|
return lambda_new
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def inverse_power_method(A, max_iter=1000, 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)]
|
|
|
|
|
|
|
|
|
|
return 1 / EigenvalueMethods.power_method(A_inv, max_iter, tol)
|