diff options
author | Gael Guennebaud <g.gael@free.fr> | 2015-06-05 14:37:57 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2015-06-05 14:37:57 +0200 |
commit | 56d4ef7ad6856f95730aa4a143e1c1db757a6ce0 (patch) | |
tree | 305c4edd214d4d8e2d9553aa63d502dca9ab8c8e /Eigen/src/IterativeLinearSolvers | |
parent | 98a8d434577713cc0de3259c0aacff9b523eaea9 (diff) |
BiCGSTAB: set default guess to 0, and improve restart mechanism by recomputing the accurate residual.
Diffstat (limited to 'Eigen/src/IterativeLinearSolvers')
-rw-r--r-- | Eigen/src/IterativeLinearSolvers/BiCGSTAB.h | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h b/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h index e67f09184..be98993f0 100644 --- a/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +++ b/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h @@ -59,20 +59,21 @@ bool bicgstab(const MatrixType& mat, const Rhs& rhs, Dest& x, VectorType s(n), t(n); - RealScalar tol2 = tol*tol; + RealScalar tol2 = tol*tol*rhs_sqnorm; RealScalar eps2 = NumTraits<Scalar>::epsilon()*NumTraits<Scalar>::epsilon(); Index i = 0; Index restarts = 0; - while ( r.squaredNorm()/rhs_sqnorm > tol2 && i<maxIters ) + while ( r.squaredNorm() > tol2 && i<maxIters ) { Scalar rho_old = rho; rho = r0.dot(r); if (abs(rho) < eps2*r0_sqnorm) { - // The new residual vector became too orthogonal to the arbitrarily choosen direction r0 + // The new residual vector became too orthogonal to the arbitrarily chosen direction r0 // Let's restart with a new r0: + r = rhs - mat * x; r0 = r; rho = r0_sqnorm = r.squaredNorm(); if(restarts++ == 0) @@ -202,8 +203,8 @@ public: template<typename Rhs,typename Dest> void _solve_impl(const MatrixBase<Rhs>& b, Dest& x) const { - // x.setZero(); - x = b; + x.resize(this->rows(),b.cols()); + x.setZero(); _solve_with_guess_impl(b,x); } |