53 int max_iter = 1000) {
54 using T =
typename Vector::value_type;
56 Vector residual = b - A * x_vector;
57 Vector director = residual;
58 T r_norm_sq = residual.dot(residual);
60 for (
int i = 0; i < max_iter; ++i) {
61 Vector Ap = A * director;
62 T alpha = r_norm_sq / director.dot(Ap);
63 x_vector += alpha * director;
64 residual -= alpha * Ap;
65 T r_norm_sq_new = residual.dot(residual);
67 if (std::sqrt(r_norm_sq_new) < tol) {
71 T beta = r_norm_sq_new / r_norm_sq;
72 director = residual + beta * director;
73 r_norm_sq = r_norm_sq_new;
76 throw std::runtime_error(
"Conjugate Gradient did not converge after " + std::to_string(max_iter)
Vector conjugate_gradient2(const Matrix &A, const Vector &b, Vector &x_vector, double tol=1e-5, int max_iter=1000)
Definition conjugate_gradient2.hpp:52