19 constexpr real zero_diag_tol = 1
e-15;
22 throw std::invalid_argument(
"Dimension mismatch in Gauss-Seidel solver");
27 for (
idx iter = 0; iter < max_iter; ++iter) {
29 for (
idx i = 0; i < n; ++i) {
30 if (std::abs(A(i, i)) < zero_diag_tol) {
31 throw std::runtime_error(
"Zero diagonal in Gauss-Seidel at row "
35 for (
idx j = 0; j < n; ++j) {
37 sigma += A(i, j) * x[j];
40 x[i] = (b[i] - sigma) / A(i, i);
45#ifdef NUMERICS_HAS_OMP
46 #pragma omp parallel for reduction(+ : res) \
47 schedule(static) if (backend == Backend::omp)
49 for (
idx i = 0; i < n; ++i) {
51 for (
idx j = 0; j < n; ++j) {
56 result.residual = std::sqrt(res);
57 result.iterations = iter + 1;
59 if (result.residual < tol) {
60 result.converged =
true;
SolverResult gauss_seidel(const Matrix &A, const Vector &b, Vector &x, real tol=1e-10, idx max_iter=1000, Backend backend=default_backend)
Gauss-Seidel iterative solver for Ax = b.