diff options
Diffstat (limited to 'src/eigen.c')
-rw-r--r-- | src/eigen.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/src/eigen.c b/src/eigen.c index 8fcf5c4..c4af461 100644 --- a/src/eigen.c +++ b/src/eigen.c @@ -49,12 +49,12 @@ double dominant_eigenvalue(Matrix_double *m, Array_double *v, double tolerance, return lambda; } -double least_dominant_eigenvalue(Matrix_double *m, Array_double *v, - double tolerance, size_t max_iterations) { +double shift_inverse_power_eigenvalue(Matrix_double *m, Array_double *v, + double shift, double tolerance, + size_t max_iterations) { assert(m->rows == m->cols); assert(m->rows == v->size); - double shift = 0.0; Matrix_double *m_c = copy_matrix(m); for (size_t y = 0; y < m_c->rows; ++y) m_c->data[y]->data[y] = m_c->data[y]->data[y] - shift; @@ -69,17 +69,22 @@ double least_dominant_eigenvalue(Matrix_double *m, Array_double *v, 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); + Array_double *mx = m_dot_v(m, normalized_eigenvector_2); double new_lambda = - v_dot_v(mx, eigenvector_2) / v_dot_v(eigenvector_2, eigenvector_2); + v_dot_v(mx, normalized_eigenvector_2) / + v_dot_v(normalized_eigenvector_2, normalized_eigenvector_2); error = fabs(new_lambda - lambda); lambda = new_lambda; free_vector(eigenvector_1); - eigenvector_1 = eigenvector_2; + eigenvector_1 = normalized_eigenvector_2; } return lambda; } + +double least_dominant_eigenvalue(Matrix_double *m, Array_double *v, + double tolerance, size_t max_iterations) { + return shift_inverse_power_eigenvalue(m, v, 0.0, tolerance, max_iterations); +} |