42 givens_c_vec_.setZero();
43 givens_s_vec_.setZero();
47 g_vec_.coeffRef(0) = b_vec_.template
lpNorm<2>();
48 basis_mat_.col(0) = b_vec_ / g_vec_.coeff(0);
54 for (
int j=0;
j<=k; ++
j) {
55 hessenberg_mat_.coeffRef(k,
j) = basis_mat_.col(k+1).dot(basis_mat_.col(
j));
56 basis_mat_.col(k+1).noalias() -= hessenberg_mat_.coeff(k,
j) * basis_mat_.col(
j);
58 hessenberg_mat_.coeffRef(k, k+1) = basis_mat_.col(k+1).template
lpNorm<2>();
59 if (std::abs(hessenberg_mat_.coeff(k, k+1)) < std::numeric_limits<double>::epsilon()) {
63 basis_mat_.col(k+1).array() /= hessenberg_mat_.coeff(k, k+1);
66 for (
int j=0;
j<k; ++
j) {
67 givensRotation(hessenberg_mat_.row(k),
j);
69 const Scalar nu = std::sqrt(hessenberg_mat_.coeff(k, k)*hessenberg_mat_.coeff(k, k)
70 +hessenberg_mat_.coeff(k, k+1)*hessenberg_mat_.coeff(k, k+1));
72 givens_c_vec_.coeffRef(k) = hessenberg_mat_.coeff(k, k) / nu;
73 givens_s_vec_.coeffRef(k) = - hessenberg_mat_.coeff(k, k+1) / nu;
74 hessenberg_mat_.coeffRef(k, k) = givens_c_vec_.coeff(k) * hessenberg_mat_.coeff(k, k)
75 - givens_s_vec_.coeff(k) * hessenberg_mat_.coeff(k, k+1);
76 hessenberg_mat_.coeffRef(k, k+1) = 0.0;
77 givensRotation(g_vec_, k);
80 throw std::runtime_error(
"Lose orthogonality of the basis of the Krylov subspace");
84 for (
int i=k-1;
i>=0; --
i) {
86 for (
int j=
i+1;
j<k; ++
j) {
87 tmp -= hessenberg_mat_.coeff(
j,
i) * givens_c_vec_.coeff(
j);
89 givens_c_vec_.coeffRef(
i) =
tmp / hessenberg_mat_.coeff(
i,
i);
91 for (
int i=0;
i<
dim; ++
i) {
93 for (
int j=0;
j<k; ++
j) {
94 tmp += basis_mat_.coeff(
i,
j) * givens_c_vec_.coeff(
j);