JMSLTM Numerical Library 7.2.0
com.imsl.math

• All Implemented Interfaces:
Serializable

extends Object
implements Serializable
Solves a real symmetric definite linear system using the conjugate gradient method with optional preconditioning.

Class ConjugateGradient solves the symmetric positive or negative definite linear system using the conjugate gradient method with optional preconditioning. This method is described in detail by Golub and Van Loan (1983, Chapter 10), and in Hageman and Young (1981, Chapter 7).

The preconditioning matrix M is a matrix that approximates A, and for which the linear system Mz=r is easy to solve. These two properties are in conflict; balancing them is a topic of current research. If no preconditioning matrix is specified, is set to the identity, i.e. .

The number of iterations needed depends on the matrix and the error tolerance. As a rough guide,

where n is the order of matrix A.

See the references for details.

Let M be the preconditioning matrix, let b,p,r,x and z be vectors and let be the desired relative error. Then the algorithm used is as follows:

Here, is an estimate of , the largest eigenvalue of the iteration matrix . The stopping criterion is based on the result (Hageman and Young 1981, pp. 148-151)

where

It is also known that

where the are the symmetric, tridiagonal matrices

with and, for ,

Usually, the eigenvalue computation is needed for only a few of the iterations.

Example without preconditioning, Example with different preconditioners, Serialized Form
• ### Constructor Detail

Parameters:
n - an int scalar value defining the order of the matrix.
argF - a Function that defines the user-supplied function which computes . If argF implements Preconditioner then right preconditioning is performed using this user supplied function. Otherwise, no preconditioning is performed. Note that argF can be used to act upon the coefficients of matrix A stored in different storage modes.
• ### Method Detail

• #### getIterations

public int getIterations()
Returns the number of iterations needed by the conjugate gradient algorithm.
Returns:
an int value indicating the number of iterations needed.
• #### getJacobi

public double[] getJacobi()
Returns the Jacobi preconditioning matrix.
Returns:
a double vector diagonal containing the diagonal of the Jacobi preconditioner M, that is, diagonal[i]=, A the input matrix.
• #### getMaxIterations

public int getMaxIterations()
Returns the maximum number of iterations allowed.
Returns:
an int value specifying the maximum number of iterations allowed.
• #### getRelativeError

public double getRelativeError(double errorRelative)
Returns the relative error used for stopping the algorithm.
Returns:
a double containing the relative error.
• #### setJacobi

public void setJacobi(double[] diagonal)
Defines a Jacobi preconditioner as the preconditioning matrix, that is, M is the diagonal of A.
Parameters:
diagonal - a double vector containing the diagonal of A as the Jacobi preconditioner M, that is, diagonal[i]=.
Throws:
IllegalArgumentException - is thrown if the length of vector diagonal is not equal to the order n of input matrix A.
• #### setMaxIterations

public void setMaxIterations(int maxIterations)
Sets the maximum number of iterations allowed.
Parameters:
maxIterations - an int value specifying the maximum number of iterations allowed. By default, maxIterations = .
Throws:
IllegalArgumentException - is thrown if maxIterations is less than or equal to 0.
• #### setRelativeError

public void setRelativeError(double tolerance)
Sets the relative error used for stopping the algorithm.
Parameters:
tolerance - a double specifying the relative error. By default, tolerance = 1.49e-08, the square root of the precision.
Throws:
IllegalArgumentException - is thrown if tolerance is less than 0.
JMSLTM Numerical Library 7.2.0