diff options
author | Gael Guennebaud <g.gael@free.fr> | 2018-09-13 23:53:28 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2018-09-13 23:53:28 +0200 |
commit | 1141bcf7940cf18974f72fcad3febc41e07bc6ec (patch) | |
tree | 94e6fdc515ed0c133fa57a83349b4db38c07d90b /Eigen/src/IterativeLinearSolvers | |
parent | 7f3b17e4031c6b921648906f43432ff728bb772d (diff) |
Fix conjugate-gradient for very small rhs
Diffstat (limited to 'Eigen/src/IterativeLinearSolvers')
-rw-r--r-- | Eigen/src/IterativeLinearSolvers/ConjugateGradient.h | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h b/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h index 395daa8e4..f7ce47134 100644 --- a/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +++ b/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h @@ -50,7 +50,8 @@ void conjugate_gradient(const MatrixType& mat, const Rhs& rhs, Dest& x, tol_error = 0; return; } - RealScalar threshold = tol*tol*rhsNorm2; + const RealScalar considerAsZero = (std::numeric_limits<RealScalar>::min)(); + RealScalar threshold = numext::maxi(tol*tol*rhsNorm2,considerAsZero); RealScalar residualNorm2 = residual.squaredNorm(); if (residualNorm2 < threshold) { @@ -58,7 +59,7 @@ void conjugate_gradient(const MatrixType& mat, const Rhs& rhs, Dest& x, tol_error = sqrt(residualNorm2 / rhsNorm2); return; } - + VectorType p(n); p = precond.solve(residual); // initial search direction |