public class SymmLQ extends PreconditionedIterativeLinearSolver
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 MathIllegalArgumentException, this class might throw
 MathIllegalArgumentException if the linear operator or the
 preconditioner are not symmetric.
 
"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).
 MathIllegalArgumentException might also be thrown in case the
 preconditioner is not positive definite.
 
| Constructor and Description | 
|---|
| SymmLQ(int maxIterations,
      double delta,
      boolean check)Creates a new instance of this class, with default
 stopping criterion. | 
| SymmLQ(IterationManager manager,
      double delta,
      boolean check)Creates a new instance of this class, with default
 stopping criterion and custom iteration manager. | 
| Modifier and Type | Method and Description | 
|---|---|
| boolean | getCheck()Deprecated. 
 as of 1.4, replaced by  shouldCheck() | 
| boolean | shouldCheck()Returns  trueif symmetry of the matrix, and symmetry as well as
 positive definiteness of the preconditioner should be checked. | 
| RealVector | solve(RealLinearOperator a,
     RealLinearOperator m,
     RealVector b)Returns an estimate of the solution to the linear system A · x =
 b. | 
| RealVector | solve(RealLinearOperator a,
     RealLinearOperator m,
     RealVector b,
     boolean goodb,
     double shift)Returns an estimate of the solution to the linear system (A - shift
 · I) · x = b. | 
| RealVector | solve(RealLinearOperator a,
     RealLinearOperator m,
     RealVector b,
     RealVector x)Returns an estimate of the solution to the linear system A · x =
 b. | 
| RealVector | solve(RealLinearOperator a,
     RealVector b)Returns an estimate of the solution to the linear system A · x =
 b. | 
| RealVector | solve(RealLinearOperator a,
     RealVector b,
     boolean goodb,
     double shift)Returns the solution to the system (A - shift · I) · x = b. | 
| RealVector | solve(RealLinearOperator a,
     RealVector b,
     RealVector x)Returns an estimate of the solution to the linear system A · x =
 b. | 
| RealVector | solveInPlace(RealLinearOperator a,
            RealLinearOperator m,
            RealVector b,
            RealVector x)Returns an estimate of the solution to the linear system A · x =
 b. | 
| RealVector | solveInPlace(RealLinearOperator a,
            RealLinearOperator m,
            RealVector b,
            RealVector x,
            boolean goodb,
            double shift)Returns an estimate of the solution to the linear system (A - shift
 · I) · x = b. | 
| RealVector | solveInPlace(RealLinearOperator a,
            RealVector b,
            RealVector x)Returns an estimate of the solution to the linear system A · x =
 b. | 
checkParameterscheckParameters, getIterationManagerpublic SymmLQ(int maxIterations,
              double delta,
              boolean check)
check to true
 entails an extra matrix-vector product in the initial phase.maxIterations - the maximum number of iterationsdelta - the δ parameter for the default stopping criterioncheck - true if self-adjointedness of both matrix and
 preconditioner should be checkedpublic SymmLQ(IterationManager manager, double delta, boolean check)
check to true entails an extra matrix-vector product in
 the initial phase.manager - the custom iteration managerdelta - the δ parameter for the default stopping criterioncheck - true if self-adjointedness of both matrix and
 preconditioner should be checked@Deprecated public final boolean getCheck()
shouldCheck()true if symmetry of the matrix, and symmetry as well as
 positive definiteness of the preconditioner should be checked.true if the tests are to be performedpublic final boolean shouldCheck()
true if symmetry of the matrix, and symmetry as well as
 positive definiteness of the preconditioner should be checked.true if the tests are to be performedpublic RealVector solve(RealLinearOperator a, RealLinearOperator m, RealVector b) throws MathIllegalArgumentException, NullArgumentException, MathIllegalStateException, MathIllegalArgumentException
solve in class PreconditionedIterativeLinearSolvera - the linear operator A of the systemm - the preconditioner, M (can be null)b - the right-hand side vectorMathIllegalArgumentException - if getCheck() is
 true, and a or m is not self-adjointMathIllegalArgumentException - if m is not
 positive definiteMathIllegalArgumentException - if a is ill-conditionedNullArgumentException - if one of the parameters is nullMathIllegalStateException - at exhaustion of the iteration count,
 unless a custom
 callback
 has been set at construction of the IterationManagerpublic RealVector solve(RealLinearOperator a, RealLinearOperator m, RealVector b, boolean goodb, double shift) throws MathIllegalArgumentException, NullArgumentException, MathIllegalStateException
 If the solution x is expected to contain a large multiple of b
 (as in Rayleigh-quotient iteration), then better precision may be
 achieved with goodb set to true; this however requires an
 extra call to the preconditioner.
 
 shift should be zero if the system A · x = b is to be
 solved. Otherwise, it could be an approximation to an eigenvalue of A,
 such as the Rayleigh quotient bT · A · b /
 (bT · b) corresponding to the vector b. If b is
 sufficiently like an eigenvector corresponding to an eigenvalue near
 shift, then the computed x may have very large components. When
 normalized, x may be closer to an eigenvector than b.
 
a - the linear operator A of the systemm - the preconditioner, M (can be null)b - the right-hand side vectorgoodb - usually false, except if x is expected to
 contain a large multiple of bshift - the amount to be subtracted to all diagonal elements of Ax (shallow copy)NullArgumentException - if one of the parameters is nullMathIllegalArgumentException - if a or m is not squareMathIllegalArgumentException - if m or b have dimensions
 inconsistent with aMathIllegalStateException - at exhaustion of the iteration count,
 unless a custom
 callback
 has been set at construction of the IterationManagerMathIllegalArgumentException - if getCheck() is
 true, and a or m is not self-adjointMathIllegalArgumentException - if m is not
 positive definiteMathIllegalArgumentException - if a is ill-conditionedpublic RealVector solve(RealLinearOperator a, RealLinearOperator m, RealVector b, RealVector x) throws MathIllegalArgumentException, NullArgumentException, MathIllegalArgumentException, MathIllegalStateException
solve in class PreconditionedIterativeLinearSolverx - not meaningful in this implementation; should not be considered
 as an initial guess (more)a - the linear operator A of the systemm - the preconditioner, M (can be null)b - the right-hand side vectorMathIllegalArgumentException - if getCheck() is
 true, and a or m is not self-adjointMathIllegalArgumentException - if m is not positive
 definiteMathIllegalArgumentException - if a is ill-conditionedNullArgumentException - if one of the parameters is nullMathIllegalStateException - at exhaustion of the iteration count,
 unless a custom
 callback
 has been set at construction of the IterationManagerpublic RealVector solve(RealLinearOperator a, RealVector b) throws MathIllegalArgumentException, NullArgumentException, MathIllegalArgumentException, MathIllegalStateException
solve in class PreconditionedIterativeLinearSolvera - the linear operator A of the systemb - the right-hand side vectorMathIllegalArgumentException - if getCheck() is
 true, and a is not self-adjointMathIllegalArgumentException - if a is ill-conditionedNullArgumentException - if one of the parameters is nullMathIllegalStateException - at exhaustion of the iteration count,
 unless a custom
 callback
 has been set at construction of the IterationManagerpublic RealVector solve(RealLinearOperator a, RealVector b, boolean goodb, double shift) throws MathIllegalArgumentException, NullArgumentException, MathIllegalStateException
 If the solution x is expected to contain a large multiple of b
 (as in Rayleigh-quotient iteration), then better precision may be
 achieved with goodb set to true.
 
 shift should be zero if the system A · x = b is to be
 solved. Otherwise, it could be an approximation to an eigenvalue of A,
 such as the Rayleigh quotient bT · A · b /
 (bT · b) corresponding to the vector b. If b is
 sufficiently like an eigenvector corresponding to an eigenvalue near
 shift, then the computed x may have very large components. When
 normalized, x may be closer to an eigenvector than b.
 
a - the linear operator A of the systemb - the right-hand side vectorgoodb - usually false, except if x is expected to
 contain a large multiple of bshift - the amount to be subtracted to all diagonal elements of AxNullArgumentException - if one of the parameters is nullMathIllegalArgumentException - if a is not squareMathIllegalArgumentException - if b has dimensions
 inconsistent with aMathIllegalStateException - at exhaustion of the iteration count,
 unless a custom
 callback
 has been set at construction of the IterationManagerMathIllegalArgumentException - if getCheck() is
 true, and a is not self-adjointMathIllegalArgumentException - if a is ill-conditionedpublic RealVector solve(RealLinearOperator a, RealVector b, RealVector x) throws MathIllegalArgumentException, NullArgumentException, MathIllegalArgumentException, MathIllegalStateException
solve in class PreconditionedIterativeLinearSolverx - not meaningful in this implementation; should not be considered
 as an initial guess (more)a - the linear operator A of the systemb - the right-hand side vectorMathIllegalArgumentException - if getCheck() is
 true, and a is not self-adjointMathIllegalArgumentException - if a is ill-conditionedNullArgumentException - if one of the parameters is nullMathIllegalStateException - at exhaustion of the iteration count,
 unless a custom
 callback
 has been set at construction of the IterationManagerpublic RealVector solveInPlace(RealLinearOperator a, RealLinearOperator m, RealVector b, RealVector x) throws MathIllegalArgumentException, NullArgumentException, MathIllegalArgumentException, MathIllegalStateException
solveInPlace in class PreconditionedIterativeLinearSolverx - the vector to be updated with the solution; x should
 not be considered as an initial guess (more)a - the linear operator A of the systemm - the preconditioner, M (can be null)b - the right-hand side vectorx0 (shallow copy) updated with the
 solutionMathIllegalArgumentException - if getCheck() is
 true, and a or m is not self-adjointMathIllegalArgumentException - if m is not
 positive definiteMathIllegalArgumentException - if a is ill-conditionedNullArgumentException - if one of the parameters is nullMathIllegalStateException - at exhaustion of the iteration count,
 unless a custom
 callback
 has been set at construction of the IterationManagerpublic RealVector solveInPlace(RealLinearOperator a, RealLinearOperator m, RealVector b, RealVector x, boolean goodb, double shift) throws MathIllegalArgumentException, NullArgumentException, MathIllegalStateException
 If the solution x is expected to contain a large multiple of b
 (as in Rayleigh-quotient iteration), then better precision may be
 achieved with goodb set to true; this however requires an
 extra call to the preconditioner.
 
 shift should be zero if the system A · x = b is to be
 solved. Otherwise, it could be an approximation to an eigenvalue of A,
 such as the Rayleigh quotient bT · A · b /
 (bT · b) corresponding to the vector b. If b is
 sufficiently like an eigenvector corresponding to an eigenvalue near
 shift, then the computed x may have very large components. When
 normalized, x may be closer to an eigenvector than b.
 
a - the linear operator A of the systemm - the preconditioner, M (can be null)b - the right-hand side vectorx - the vector to be updated with the solution; x should
 not be considered as an initial guess (more)goodb - usually false, except if x is expected to
 contain a large multiple of bshift - the amount to be subtracted to all diagonal elements of Ax (shallow copy).NullArgumentException - if one of the parameters is nullMathIllegalArgumentException - if a or m is not squareMathIllegalArgumentException - if m, b or x
 have dimensions inconsistent with a.MathIllegalStateException - at exhaustion of the iteration count,
 unless a custom
 callback
 has been set at construction of the IterationManagerMathIllegalArgumentException - if getCheck() is
 true, and a or m is not self-adjointMathIllegalArgumentException - if m is not positive definiteMathIllegalArgumentException - if a is ill-conditionedpublic RealVector solveInPlace(RealLinearOperator a, RealVector b, RealVector x) throws MathIllegalArgumentException, NullArgumentException, MathIllegalArgumentException, MathIllegalStateException
solveInPlace in class PreconditionedIterativeLinearSolverx - the vector to be updated with the solution; x should
 not be considered as an initial guess (more)a - the linear operator A of the systemb - the right-hand side vectorx0 (shallow copy) updated with the
 solutionMathIllegalArgumentException - if getCheck() is
 true, and a is not self-adjointMathIllegalArgumentException - if a is ill-conditionedNullArgumentException - if one of the parameters is nullMathIllegalStateException - at exhaustion of the iteration count,
 unless a custom
 callback
 has been set at construction of the IterationManagerCopyright © 2016–2020 Hipparchus.org. All rights reserved.