Top Description Inners Fields Constructors Methods
org.apache.commons.math3.linear

public Class SymmLQ

extends PreconditionedIterativeLinearSolver
Class Inheritance
Imports
org.apache.commons.math3.exception.DimensionMismatchException, .MaxCountExceededException, .NullArgumentException, org.apache.commons.math3.exception.util.ExceptionContext, org.apache.commons.math3.util.FastMath, .IterationManager, .MathUtils

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

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||.

Default stopping criterion

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.

Iteration count

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.

Initial guess of the solution

The x parameter in

should not be considered as an initial guess, as it is set to zero in the initial phase. If x0 is known to be a good approximation to x, one should compute r0 = b - A · x, solve A · dx = r0, and set x = x0 + dx.

Exception context

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

NonPositiveDefiniteOperatorException might also be thrown in case the preconditioner is not positive definite. The relevant keys to the ExceptionContext are

References

Paige and Saunders (1975)
C. C. Paige and M. A. Saunders, Solution of Sparse Indefinite Systems of Linear Equations, SIAM Journal on Numerical Analysis 12(4): 617-629, 1975
Since
3.0

Nested and Inner Type Summary

Modifier and TypeClass and Description
private static class
SymmLQ.State

A simple container holding the non-final variables used in the iterations.

Field Summary

Modifier and TypeField and Description
private final boolean
check

true if symmetry of matrix and conditioner must be checked.

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.

Constructor Summary

AccessConstructor 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 checked
check
)

Creates 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 checked
check
)

Creates a new instance of this class, with default stopping criterion and custom iteration manager.

Method Summary

Modifier and TypeMethod and Description
public final boolean

Returns:

true if the tests are to be performed
getCheck
()

Returns true if symmetry of the matrix, and symmetry as well as positive definiteness of the preconditioner should be checked.

public RealVector
solve(final RealLinearOperator
the linear operator A of the system
a
,
final RealLinearOperator
the preconditioner, M (can be null)
m
,
final RealVector
the right-hand side vector
b
)

Overrides org.apache.commons.math3.linear.PreconditionedIterativeLinearSolver.solve.

Returns an estimate of the solution to the linear system A · x = b.

public RealVector

Returns:

a reference to x (shallow copy)
solve
(final RealLinearOperator
the linear operator A of the system
a
,
final RealLinearOperator
the preconditioner, M (can be null)
m
,
final RealVector
the right-hand side vector
b
,
final boolean
usually false, except if x is expected to contain a large multiple of b
goodb
,
final double
the 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 null)
m
,
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.apache.commons.math3.linear.PreconditionedIterativeLinearSolver.solve.

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.apache.commons.math3.linear.PreconditionedIterativeLinearSolver.solve.

Returns an estimate of the solution to the linear system A · x = b.

public RealVector

Returns:

a reference to x
solve
(final RealLinearOperator
the linear operator A of the system
a
,
final RealVector
the right-hand side vector
b
,
final boolean
usually false, except if x is expected to contain a large multiple of b
goodb
,
final double
the 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.apache.commons.math3.linear.PreconditionedIterativeLinearSolver.solve.

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 null)
m
,
final RealVector
the right-hand side vector
b
,
final RealVector
the vector to be updated with the solution; x should not be considered as an initial guess (more)
x
)

Implements abstract org.apache.commons.math3.linear.PreconditionedIterativeLinearSolver.solveInPlace.

Returns an estimate of the solution to the linear system A · x = b.

public RealVector

Returns:

a reference to x (shallow copy).
solveInPlace
(final RealLinearOperator
the linear operator A of the system
a
,
final RealLinearOperator
the preconditioner, M (can be null)
m
,
final RealVector
the right-hand side vector
b
,
final RealVector
the vector to be updated with the solution; x should not be considered as an initial guess (more)
x
,
final boolean
usually false, except if x is expected to contain a large multiple of b
goodb
,
final double
the 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 should not be considered as an initial guess (more)
x
)

Overrides org.apache.commons.math3.linear.PreconditionedIterativeLinearSolver.solveInPlace.

Returns an estimate of the solution to the linear system A · x = b.

Inherited from org.apache.commons.math3.linear.PreconditionedIterativeLinearSolver:
checkParameters