Krylov-subspace iterative solvers for large sparse linear systems.
For symmetric positive definite systems.
var cg = Zigen.ConjugateGradient(f64).init(allocator, n);
defer cg.deinit();
cg.setMaxIterations(1000);
cg.setTolerance(1e-10);
try cg.compute(A); // A is SparseMatrix
var x = try cg.solve(b); // Solve Ax = b
defer x.deinit();
cg.iterations() // Number of iterations taken
cg.error() // Residual errorBi-Conjugate Gradient Stabilized — for non-symmetric systems.
var solver = Zigen.BiCGSTAB(f64).init(allocator, n);
defer solver.deinit();
try solver.compute(A);
var x = try solver.solve(b);Generalized Minimal Residual — for general non-symmetric systems.
var solver = Zigen.GMRES(f64).init(allocator, n);
defer solver.deinit();
try solver.compute(A);
var x = try solver.solve(b);Minimal Residual — for symmetric (not necessarily positive definite) systems.
CG-based solver for least-squares problems (A may be rectangular).
Preconditioners accelerate convergence of iterative solvers.
| Preconditioner | Description | Best For |
|---|---|---|
DiagonalPreconditioner(T) |
Jacobi (diagonal) | General use, low cost |
IdentityPreconditioner(T) |
No-op | Baseline/testing |
LeastSquareDiagonalPreconditioner(T) |
Diagonal for AᵀA | Least-squares problems |
IncompleteLUT(T) |
Incomplete LU with thresholding | Difficult systems |
var cg = Zigen.ConjugateGradient(f64).init(allocator, n);
var precond = try Zigen.DiagonalPreconditioner(f64).init(allocator, A);
cg.setPreconditioner(&precond);
try cg.compute(A);
var x = try cg.solve(b);