dstebz(3)
NAME
- DSTEBZ - compute the eigenvalues of a symmetric tridiago
- nal matrix T
SYNOPSIS
SUBROUTINE DSTEBZ( 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
DOUBLE PRECISION ABSTOL, VL, VU
INTEGER IBLOCK( * ), ISPLIT( * ), IWORK( * )
DOUBLE PRECISION D( * ), E( * ), W( * ), WORK(
* )
PURPOSE
- DSTEBZ computes the eigenvalues of a symmetric tridiagonal
- matrix T. The user may ask for all eigenvalues, all eigenvalues
- in the half-open interval (VL, VU], or the IL-th through IU-th
- eigenvalues.
- To avoid overflow, the matrix must be scaled so that its
largest element 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.
- See W. Kahan "Accurate Eigenvalues of a Symmetric Tridiag
- onal 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 small
- est to largest.
- N (input) INTEGER
- The order of the tridiagonal matrix T. N >= 0.
- VL (input) DOUBLE PRECISION
- VU (input) DOUBLE PRECISION If RANGE='V', the
- lower and upper bounds of the interval to be searched for eigen
- values. Eigenvalues less than or equal to VL, or greater than
- VU, will not be returned. VL < VU. Not referenced if RANGE =
- 'A' or 'I'.
- IL (input) INTEGER
- IU (input) INTEGER If RANGE='I', the indices
- (in ascending order) of the smallest and largest eigenvalues to
- be returned. 1 <= IL <= IU <= N, if N > 0; IL = 1 and IU = 0 if
- N = 0. Not referenced if RANGE = 'A' or 'V'.
- ABSTOL (input) DOUBLE PRECISION
- 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.
- Eigenvalues will be computed most accurately when
- ABSTOL is set to twice the underflow threshold 2*DLAMCH('S'), not
- zero.
- D (input) DOUBLE PRECISION array, dimension (N)
- The n diagonal elements of the tridiagonal matrix
- T.
- E (input) DOUBLE PRECISION array, dimension (N-1)
- The (n-1) off-diagonal elements of the tridiagonal
- matrix T.
- 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) DOUBLE PRECISION array, dimension (N)
- On exit, the first M elements of W will contain
- the eigenvalues. (DSTEBZ may use the remaining N-M elements 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, if INFO = 0, IBLOCK(i) specifies to which block (from 1
- to the number of blocks) the eigenvalue W(i) belongs. (DSTEBZ
- may use the remaining N-M elements as workspace.)
- ISPLIT (output) INTEGER array, dimension (N)
- The splitting points, at which T breaks up into
- submatrices. The first submatrix consists of rows/columns 1 to
- ISPLIT(1), the second of rows/columns ISPLIT(1)+1 through IS
- PLIT(2), etc., and the NSPLIT-th consists of rows/columns IS
- PLIT(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 re
- served for ISPLIT.)
- WORK (workspace) DOUBLE PRECISION 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 ille
- gal value
> 0: some or all of the eigenvalues failed to
- converge 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 accu
- rate 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 DOUBLE PRECISION, 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 floating point number.)
- FUDGE DOUBLE PRECISION, default = 2
- A "fudge factor" to widen the Gershgorin inter
- vals. Ideally, a value of 1 should work, but on machines with
- sloppy arithmetic, this needs to be larger. The default for pub
- licly released versions should be large enough to handle the
- worst machine around. Note that this has no effect on accuracy
- of the solution.
- LAPACK version 3.0 15 June 2000