23 const std::vector<real>&
beta,
28 for (
idx j = 0; j < m; ++j) {
31 H(j - 1, j) =
beta[j - 1];
33 H(j + 1, j) =
beta[j];
47 requires SymmetricLinearOperator<Op, Vector, Vector>
55 if (A.rows() != n || A.cols() != n || x.
size() != n) {
56 throw std::invalid_argument(
"minres: dimension mismatch");
61 for (
idx i = 0; i < n; ++i) {
65 const real beta0 =
norm(r0, backend);
67 if (result.converged) {
71 const idx mmax = std::min(max_iter, n);
72 std::vector<Vector> V;
74 V.emplace_back(n, 0.0);
75 for (
idx i = 0; i < n; ++i) {
76 V[0][i] = r0[i] / beta0;
79 std::vector<real> alpha;
80 std::vector<real>
beta;
84 Vector w(n), q_prev(n, 0.0);
85 for (
idx j = 0; j < mmax; ++j) {
86 result.iterations = j + 1;
89 axpy(-
beta[j - 1], q_prev, w, backend);
92 const real a =
dot(V[j], w, backend);
94 axpy(-a, V[j], w, backend);
97 beta.push_back(bnext);
101 for (
idx col = 0; col <= j; ++col) {
102 axpy(y[col], V[col], x_candidate, backend);
105 A.apply(x_candidate, Ax);
107 for (
idx i = 0; i < n; ++i) {
108 const real ri = b[i] - Ax[i];
111 result.residual = std::sqrt(rsq);
112 if (result.residual < tol) {
113 x = std::move(x_candidate);
114 result.converged =
true;
118 if (bnext <
real(1
e-15)) {
119 x = std::move(x_candidate);
128 x = std::move(x_candidate);
constexpr idx size() const noexcept
Storage and operator concepts for numerical routines.
Backend enum and default backend selection.
Vector minres_projected_solve(const std::vector< real > &alpha, const std::vector< real > &beta, real beta0, idx m, Backend backend)
void qr_solve(const QRResult &f, const Vector &b, Vector &x)
Solve .
QRResult qr(const Matrix &A, Backend backend=lapack_backend)
Factor as .
real beta(real a, real b)
B(a, b) – beta function.
SolverResult minres(const Op &A, const Vector &b, Vector &x, real tol=1e-10, idx max_iter=1000, Backend backend=default_backend)
void scale(Vector &v, real alpha, Backend b=default_backend)
Compute .
real dot(const Vector &x, const Vector &y, Backend b=default_backend)
Compute .
real norm(const Vector &x, Backend b=default_backend)
Compute .
void axpy(real alpha, const Vector &x, Vector &y, Backend b=default_backend)
Compute .
constexpr Backend default_backend
QR factorization via Householder reflections.
Common result type shared by all iterative solvers.
Dense vector storage and operations.