Previous: ssptrs Up: ../lapack-s.html Next: sstein
NAME
SSTEBZ - compute the eigenvalues of a symmetric tridiagonal
matrix T
SYNOPSIS
SUBROUTINE SSTEBZ( RANGE, ORDER, N, VL, VU, IL, IU, ABSTOL,
D, E, M, NSPLIT, W, IBLOCK, ISPLIT, WORK,
IWORK, INFO )
CHARACTER ORDER, RANGE
INTEGER IL, INFO, IU, M, N, NSPLIT
REAL ABSTOL, VL, VU
INTEGER IBLOCK( * ), ISPLIT( * ), IWORK( * )
REAL D( * ), E( * ), W( * ), WORK( * )
PURPOSE
SSTEBZ computes the eigenvalues of a symmetric tridiagonal
matrix T. The user may ask for all eigenvalues, all eigen-
values in the half-open interval (VL, VU], or the IL-th
through IU-th eigenvalues.
See W. Kahan "Accurate Eigenvalues of a Symmetric Tridiago-
nal Matrix", Report CS41, Computer Science Dept., Stanford
University, July 21, 1966.
ARGUMENTS
RANGE (input) CHARACTER
= 'A': ("All") all eigenvalues will be found.
= 'V': ("Value") all eigenvalues in the half-open
interval (VL, VU] will be found. = 'I': ("Index")
the IL-th through IU-th eigenvalues (of the entire
matrix) will be found.
ORDER (input) CHARACTER
= 'B': ("By Block") the eigenvalues will be grouped
by split-off block (see IBLOCK, ISPLIT) and ordered
from smallest to largest within the block. = 'E':
("Entire matrix") the eigenvalues for the entire
matrix will be ordered from smallest to largest.
N (input) INTEGER
The dimension of the tridiagonal matrix T. N >= 0.
VL (input) REAL
If RANGE='V', the lower bound of the interval to be
searched for eigenvalues. Eigenvalues less than or
equal to VL will not be returned. Not referenced if
RANGE='A' or 'I'.
VU (input) REAL
If RANGE='V', the upper bound of the interval to be
searched for eigenvalues. Eigenvalues greater than
VU will not be returned. VU must be greater than
VL. Not referenced if RANGE='A' or 'I'.
IL (input) INTEGER
If RANGE='I', the index (from smallest to largest)
of the smallest eigenvalue to be returned. IL must
be at least 1. Not referenced if RANGE='A' or 'V'.
IU (input) INTEGER
If RANGE='I', the index (from smallest to largest)
of the largest eigenvalue to be returned. IU must
be at least IL and no greater than N. Not refer-
enced if RANGE='A' or 'V'.
ABSTOL (input) REAL
The absolute tolerance for the eigenvalues. An
eigenvalue (or cluster) is considered to be located
if it has been determined to lie in an interval
whose width is ABSTOL or less. If ABSTOL is less
than or equal to zero, then ULP*|T| will be used,
where |T| means the 1-norm of T.
D (input) REAL array, dimension (N)
The n diagonal elements of the tridiagonal matrix T.
To avoid overflow, the matrix must be scaled so that
its largest entry is no greater than overflow**(1/2)
* underflow**(1/4) in absolute value, and for
greatest accuracy, it should not be much smaller
than that.
E (input) REAL array, dimension (N-1)
The (n-1) off-diagonal elements of the tridiagonal
matrix T. To avoid overflow, the matrix must be
scaled so that its largest entry is no greater than
overflow**(1/2) * underflow**(1/4) in absolute
value, and for greatest accuracy, it should not be
much smaller than that.
M (output) INTEGER
The actual number of eigenvalues found. 0 <= M <= N.
(See also the description of INFO=2,3.)
NSPLIT (output) INTEGER
The number of diagonal blocks in the matrix T. 1 <=
NSPLIT <= N.
W (output) REAL array, dimension (N)
On exit, the first M elements of W will contain the
eigenvalues. (SSTEBZ may use the remaining N-M ele-
ments as workspace.)
IBLOCK (output) INTEGER array, dimension (N)
At each row/column j where E(j) is zero or small,
the matrix T is considered to split into a block
diagonal matrix. On exit, IBLOCK(i) specifies which
block (from 1 to the number of blocks) the eigen-
value W(i) belongs to. (SSTEBZ may use the remain-
ing N-M elements as workspace.)
ISPLIT (output) INTEGER array, dimension (N)
The splitting points, at which T breaks up into sub-
matrices. The first submatrix consists of
rows/columns 1 to ISPLIT(1), the second of
rows/columns ISPLIT(1)+1 through ISPLIT(2), etc.,
and the NSPLIT-th consists of rows/columns
ISPLIT(NSPLIT-1)+1 through ISPLIT(NSPLIT)=N. (Only
the first NSPLIT elements will actually be used, but
since the user cannot know a priori what value
NSPLIT will have, N words must be reserved for
ISPLIT.)
WORK (workspace) REAL array, dimension (4*N)
IWORK (workspace) INTEGER array, dimension (3*N)
INFO (output) INTEGER
= 0: successful exit
< 0: if INFO = -i, the i-th argument had an illegal
value
> 0: some or all of the eigenvalues failed to con-
verge or
were not computed:
=1 or 3: Bisection failed to converge for some
eigenvalues; these eigenvalues are flagged by a
negative block number. The effect is that the
eigenvalues may not be as accurate as the absolute
and relative tolerances. This is generally caused
by unexpectedly inaccurate arithmetic. =2 or 3:
RANGE='I' only: Not all of the eigenvalues
IL:IU were found.
Effect: M < IU+1-IL
Cause: non-monotonic arithmetic, causing the Sturm
sequence to be non-monotonic. Cure: recalculate,
using RANGE='A', and pick
out eigenvalues IL:IU. In some cases, increasing
the PARAMETER "FUDGE" may make things work. = 4:
RANGE='I', and the Gershgorin interval initially
used was too small. No eigenvalues were computed.
Probable cause: your machine has sloppy floating-
point arithmetic. Cure: Increase the PARAMETER
"FUDGE", recompile, and try again.
PARAMETERS
RELFAC REAL, default = 2.0e0
The relative tolerance. An interval (a,b] lies
within "relative tolerance" if b-a <
RELFAC*ulp*max(|a|,|b|), where "ulp" is the machine
precision (distance from 1 to the next larger float-
ing point number.)
FUDGE REAL, default = 2
A "fudge factor" to widen the Gershgorin intervals.
Ideally, a value of 1 should work, but on machines
with sloppy arithmetic, this needs to be larger.
The default for publicly released versions should be
large enough to handle the worst machine around.
Note that this has no effect on accuracy of the
solution.