13 constexpr real zero_diag_tol = 1
e-15;
16 throw std::invalid_argument(
"Dimension mismatch in Jacobi solver");
22 for (
idx iter = 0; iter < max_iter; ++iter) {
24#ifdef NUMERICS_HAS_OMP
25 #pragma omp parallel for schedule(static) if (backend == Backend::omp)
27 for (
idx i = 0; i < n; ++i) {
28 if (std::abs(A(i, i)) < zero_diag_tol) {
29 throw std::runtime_error(
"Zero diagonal in Jacobi solver at row "
33 for (
idx j = 0; j < n; ++j) {
35 sigma += A(i, j) * x[j];
38 x_new[i] = (b[i] - sigma) / A(i, i);
41 for (
idx i = 0; i < n; ++i) {
47#ifdef NUMERICS_HAS_OMP
48 #pragma omp parallel for reduction(+ : res) \
49 schedule(static) if (backend == Backend::omp)
51 for (
idx i = 0; i < n; ++i) {
53 for (
idx j = 0; j < n; ++j) {
58 result.residual = std::sqrt(res);
59 result.iterations = iter + 1;
61 if (result.residual < tol) {
62 result.converged =
true;
SolverResult jacobi(const Matrix &A, const Vector &b, Vector &x, real tol=1e-10, idx max_iter=1000, Backend backend=default_backend)
Jacobi iterative solver for Ax = b.