From 09dd5c5eb250d866c939965d6ec8ccb919b4dc0a Mon Sep 17 00:00:00 2001 From: Elizabeth Hunt Date: Mon, 27 Nov 2023 10:16:47 -0700 Subject: [PATCH] normalize eigenvector for numerical running purposes --- src/eigen.c | 4 ++++ test/eigen.t.c | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/eigen.c b/src/eigen.c index 83b1127..36ccc92 100644 --- a/src/eigen.c +++ b/src/eigen.c @@ -31,6 +31,10 @@ double dominant_eigenvalue(Matrix_double *m, Array_double *v, double tolerance, while (error >= tolerance && (--iter) > 0) { Array_double *eigenvector_2 = m_dot_v(m, eigenvector_1); + Array_double *normalized_eigenvector_2 = + scale_v(eigenvector_2, 1.0 / linf_norm(eigenvector_2)); + free_vector(eigenvector_2); + eigenvector_2 = normalized_eigenvector_2; Array_double *mx = m_dot_v(m, eigenvector_2); double new_lambda = diff --git a/test/eigen.t.c b/test/eigen.t.c index 31c3500..f271bf2 100644 --- a/test/eigen.t.c +++ b/test/eigen.t.c @@ -25,7 +25,7 @@ UTEST(eigen, leslie_matrix_dominant_eigenvalue) { Array_double *felicity = InitArray(double, {0.0, 1.5, 0.8}); Array_double *survivor_ratios = InitArray(double, {0.8, 0.55}); Matrix_double *leslie = leslie_matrix(survivor_ratios, felicity); - Array_double *v_guess = InitArrayWithSize(double, 3, 1.0); + Array_double *v_guess = InitArrayWithSize(double, 3, 2.0); double tolerance = 0.0001; uint64_t max_iterations = 64;