Implementation of the SYMMLQ iterative linear solver proposed by Paige and Saunders (1975). This implementation is largely based on the FORTRAN code by Pr. Michael A. Saunders, available here.
SYMMLQ is designed to solve the system of linear equations A · x = b
where A is an n × n self-adjoint linear operator (defined as a
RealLinearOperator), and b is a given vector. The operator A is not
required to be positive definite. If A is known to be definite, the method of
conjugate gradients might be preferred, since it will require about the same
number of iterations as SYMMLQ but slightly less work per iteration.
SYMMLQ is designed to solve the system (A - shift · I) · x = b, where shift is a specified scalar value. If shift and b are suitably chosen, the computed vector x may approximate an (unnormalized) eigenvector of A, as in the methods of inverse iteration and/or Rayleigh-quotient iteration. Again, the linear operator (A - shift · I) need not be positive definite (but must be self-adjoint). The work per iteration is very slightly less if shift = 0.
Preconditioning may reduce the number of iterations required. The solver may be provided with a positive definite preconditioner M = PT · P that is known to approximate (A - shift · I)-1 in some sense, where matrix-vector products of the form M · y = x can be computed efficiently. Then SYMMLQ will implicitly solve the system of equations P · (A - shift · I) · PT · xhat = P · b, i.e. Ahat · xhat = bhat, where Ahat = P · (A - shift · I) · PT, bhat = P · b, and return the solution x = PT · xhat. The associated residual is rhat = bhat - Ahat · xhat = P · [b - (A - shift · I) · x] = P · r.
In the case of preconditioning, the IterativeLinearSolverEvents that
this solver fires are such that
IterativeLinearSolverEvent#getNormOfResidual() returns the norm of
the preconditioned, updated residual, ||P · r||, not the norm
of the true residual ||r||.
A default stopping criterion is implemented. The iterations stop when || rhat || ≤ δ || Ahat || || xhat ||, where xhat is the current estimate of the solution of the transformed system, rhat the current estimate of the corresponding residual, and δ a user-specified tolerance.
In the present context, an iteration should be understood as one evaluation of the matrix-vector product A · x. The initialization phase therefore counts as one iteration. If the user requires checks on the symmetry of A, this entails one further matrix-vector product in the initial phase. This further product is not accounted for in the iteration count. In other words, the number of iterations required to reach convergence will be identical, whether checks have been required or not.
The present definition of the iteration count differs from that adopted in the original FOTRAN code, where the initialization phase was not taken into account.
The x parameter in
solve(RealLinearOperator, RealVector, RealVector),solve(RealLinearOperator, RealLinearOperator, RealVector, RealVector)},solveInPlace(RealLinearOperator, RealVector, RealVector),solveInPlace(RealLinearOperator, RealLinearOperator, RealVector, RealVector),solveInPlace(RealLinearOperator, RealLinearOperator, RealVector, RealVector, boolean, double),
Besides standard DimensionMismatchException, this class might throw
NonSelfAdjointOperatorException if the linear operator or the
preconditioner are not symmetric. In this case, the ExceptionContext
provides more information
"operator" points to the offending linear operator, say L,"vector1" points to the first offending vector, say x,
"vector2" points to the second offending vector, say y, such
that xT · L · y ≠ yT · L
· x (within a certain accuracy).
NonPositiveDefiniteOperatorException might also be thrown in case the
preconditioner is not positive definite. The relevant keys to the
ExceptionContext are
"operator", which points to the offending linear operator,
say L,"vector", which points to the offending vector, say x, such
that xT · L · x < 0.| Modifier and Type | Class and Description |
|---|---|
| private static class | SymmLQ.
A simple container holding the non-final variables used in the iterations. |
| Modifier and Type | Field and Description |
|---|---|
| private final boolean | check
|
| private final double | delta
The value of the custom tolerance δ for the default stopping criterion. |
| private static final String | OPERATOR
Key for the exception context. |
| private static final String | THRESHOLD
Key for the exception context. |
| private static final String | VECTOR
Key for the exception context. |
| private static final String | VECTOR1
Key for the exception context. |
| private static final String | VECTOR2
Key for the exception context. |
| Access | Constructor and Description |
|---|---|
| public | SymmLQ(final int
the maximum number of iterations maxIterations, final double the δ parameter for the default stopping criterion delta, final boolean true if self-adjointedness of both matrix and
preconditioner should be checkedCreates a new instance of this class, with default stopping criterion. |
| public | SymmLQ(final IterationManager
the custom iteration manager manager, final double the δ parameter for the default stopping criterion delta, final boolean true if self-adjointedness of both matrix and
preconditioner should be checkedCreates a new instance of this class, with default stopping criterion and custom iteration manager. |
| Modifier and Type | Method and Description |
|---|---|
| public final boolean | Returns: true if the tests are to be performedReturns |
| public RealVector | solve(final RealLinearOperator
the linear operator A of the system a, final RealLinearOperator the preconditioner, M (can be m, final RealVector null)the right-hand side vector b)Overrides org. Returns an estimate of the solution to the linear system A · x = b. |
| public RealVector | Returns: a reference tox (shallow copy)the linear operator A of the system a, final RealLinearOperator the preconditioner, M (can be m, final RealVector null)the right-hand side vector b, final boolean usually goodb, final double false, except if x is expected to
contain a large multiple of bthe amount to be subtracted to all diagonal elements of A shift)Returns an estimate of the solution to the linear system (A - shift · I) · x = b. |
| public RealVector | solve(final RealLinearOperator
the linear operator A of the system a, final RealLinearOperator the preconditioner, M (can be m, final RealVector null)the right-hand side vector b, final RealVector not meaningful in this implementation; should not be considered
as an initial guess (more) x)Overrides org. Returns an estimate of the solution to the linear system A · x = b. |
| public RealVector | solve(final RealLinearOperator
the linear operator A of the system a, final RealVector the right-hand side vector b)Overrides org. Returns an estimate of the solution to the linear system A · x = b. |
| public RealVector | Returns: a reference toxthe linear operator A of the system a, final RealVector the right-hand side vector b, final boolean usually goodb, final double false, except if x is expected to
contain a large multiple of bthe amount to be subtracted to all diagonal elements of A shift)Returns the solution to the system (A - shift · I) · x = b. |
| public RealVector | solve(final RealLinearOperator
the linear operator A of the system a, final RealVector the right-hand side vector b, final RealVector not meaningful in this implementation; should not be considered
as an initial guess (more) x)Overrides org. Returns an estimate of the solution to the linear system A · x = b. |
| public RealVector | solveInPlace(final RealLinearOperator
the linear operator A of the system a, final RealLinearOperator the preconditioner, M (can be m, final RealVector null)the right-hand side vector b, final RealVector the vector to be updated with the solution; x)x should
not be considered as an initial guess (more)Implements abstract org. Returns an estimate of the solution to the linear system A · x = b. |
| public RealVector | Returns: a reference tox (shallow copy).the linear operator A of the system a, final RealLinearOperator the preconditioner, M (can be m, final RealVector null)the right-hand side vector b, final RealVector the vector to be updated with the solution; x, final boolean x should
not be considered as an initial guess (more)usually goodb, final double false, except if x is expected to
contain a large multiple of bthe amount to be subtracted to all diagonal elements of A shift)Returns an estimate of the solution to the linear system (A - shift · I) · x = b. |
| public RealVector | solveInPlace(final RealLinearOperator
the linear operator A of the system a, final RealVector the right-hand side vector b, final RealVector the vector to be updated with the solution; x)x should
not be considered as an initial guess (more)Overrides org. Returns an estimate of the solution to the linear system A · x = b. |