Skip to content

Latest commit

 

History

History
76 lines (53 loc) · 2.08 KB

File metadata and controls

76 lines (53 loc) · 2.08 KB

Iterative Solvers Module

Krylov-subspace iterative solvers for large sparse linear systems.

Solvers

ConjugateGradient(T)

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 error

BiCGSTAB(T)

Bi-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);

GMRES(T)

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);

MINRES(T)

Minimal Residual — for symmetric (not necessarily positive definite) systems.

LeastSquaresConjugateGradient(T)

CG-based solver for least-squares problems (A may be rectangular).


Preconditioners

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

Usage with Solvers

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);