NAG FL Interface
f08jkf (dstein)

Settings help

FL Name Style:


FL Specification Language:


1 Purpose

f08jkf computes the eigenvectors of a real symmetric tridiagonal matrix corresponding to specified eigenvalues, by inverse iteration.

2 Specification

Fortran Interface
Subroutine f08jkf ( n, d, e, m, w, iblock, isplit, z, ldz, work, iwork, ifailv, info)
Integer, Intent (In) :: n, m, iblock(*), isplit(*), ldz
Integer, Intent (Out) :: iwork(n), ifailv(m), info
Real (Kind=nag_wp), Intent (In) :: d(*), e(*), w(*)
Real (Kind=nag_wp), Intent (Inout) :: z(ldz,*)
Real (Kind=nag_wp), Intent (Out) :: work(5*n)
C Header Interface
#include <nag.h>
void  f08jkf_ (const Integer *n, const double d[], const double e[], const Integer *m, const double w[], const Integer iblock[], const Integer isplit[], double z[], const Integer *ldz, double work[], Integer iwork[], Integer ifailv[], Integer *info)
The routine may be called by the names f08jkf, nagf_lapackeig_dstein or its LAPACK name dstein.

3 Description

f08jkf computes the eigenvectors of a real symmetric tridiagonal matrix T corresponding to specified eigenvalues, by inverse iteration (see Jessup and Ipsen (1992)). It is designed to be used in particular after the specified eigenvalues have been computed by f08jjf with order='B', but may also be used when the eigenvalues have been computed by other routines in Chapters F02 or F08.
If T has been formed by reduction of a full real symmetric matrix A to tridiagonal form, then eigenvectors of T may be transformed to eigenvectors of A by a call to f08fgf or f08ggf.
f08jjf determines whether the matrix T splits into block diagonal form:
T = ( T1 T2 . . . Tp )  
and passes details of the block structure to this routine in the arrays iblock and isplit. This routine can then take advantage of the block structure by performing inverse iteration on each block Ti separately, which is more efficient than using the whole matrix.

4 References

Golub G H and Van Loan C F (1996) Matrix Computations (3rd Edition) Johns Hopkins University Press, Baltimore
Jessup E and Ipsen I C F (1992) Improving the accuracy of inverse iteration SIAM J. Sci. Statist. Comput. 13 550–572

5 Arguments

1: n Integer Input
On entry: n, the order of the matrix T.
Constraint: n0.
2: d(*) Real (Kind=nag_wp) array Input
Note: the dimension of the array d must be at least max(1,n).
On entry: the diagonal elements of the tridiagonal matrix T.
3: e(*) Real (Kind=nag_wp) array Input
Note: the dimension of the array e must be at least max(1,n-1).
On entry: the off-diagonal elements of the tridiagonal matrix T.
4: m Integer Input
On entry: m, the number of eigenvectors to be returned.
Constraint: 0mn.
5: w(*) Real (Kind=nag_wp) array Input
Note: the dimension of the array w must be at least max(1,n).
On entry: the eigenvalues of the tridiagonal matrix T stored in w(1) to w(m), as returned by f08jjf with order='B'. Eigenvalues associated with the first sub-matrix must be supplied first, in nondecreasing order; then those associated with the second sub-matrix, again in nondecreasing order; and so on.
Constraint: if iblock(i)=iblock(i+1), w(i)w(i+1), for i=1,2,,m-1.
6: iblock(*) Integer array Input
Note: the dimension of the array iblock must be at least max(1,n).
On entry: the first m elements must contain the sub-matrix indices associated with the specified eigenvalues, as returned by f08jjf with order='B'. If the eigenvalues were not computed by f08jjf with order='B', set iblock(i) to 1, for i=1,2,,m.
Constraint: iblock(i)iblock(i+1), for i=1,2,,m-1.
7: isplit(*) Integer array Input
Note: the dimension of the array isplit must be at least max(1,n).
On entry: the points at which T breaks up into sub-matrices, as returned by f08jjf with order='B'. If the eigenvalues were not computed by f08jjf with order='B', set isplit(1) to n.
8: z(ldz,*) Real (Kind=nag_wp) array Output
Note: the second dimension of the array z must be at least max(1,m).
On exit: the m eigenvectors, stored as columns of Z; the ith column corresponds to the ith specified eigenvalue, unless info>0 (in which case see Section 6).
9: ldz Integer Input
On entry: the first dimension of the array z as declared in the (sub)program from which f08jkf is called.
Constraint: ldz max(1,n) .
10: work(5×n) Real (Kind=nag_wp) array Workspace
11: iwork(n) Integer array Workspace
12: ifailv(m) Integer array Output
On exit: if info=i>0, the first i elements of ifailv contain the indices of any eigenvectors which have failed to converge. The rest of the first m elements of ifailv are set to 0.
13: info Integer Output
On exit: info=0 unless the routine detects an error (see Section 6).

6 Error Indicators and Warnings

info<0
If info=-i, argument i had an illegal value. An explanatory message is output, and execution of the program is terminated.
info>0
value eigenvectors (as indicated by argument ifailv) each failed to converge in five iterations. The current iterate after five iterations is stored in the corresponding column of z.

7 Accuracy

Each computed eigenvector zi is the exact eigenvector of a nearby matrix A+Ei, such that
Ei = O(ε) A ,  
where ε is the machine precision. Hence the residual is small:
Azi-λizi = O(ε) A .  
However, a set of eigenvectors computed by this routine may not be orthogonal to so high a degree of accuracy as those computed by f08jef.

8 Parallelism and Performance

f08jkf is threaded by NAG for parallel execution in multithreaded implementations of the NAG Library.
f08jkf makes calls to BLAS and/or LAPACK routines, which may be threaded within the vendor library used by this implementation. Consult the documentation for the vendor library for further information.
Please consult the X06 Chapter Introduction for information on how to control and interrogate the OpenMP environment used within this routine. Please also consult the Users' Note for your implementation for any additional implementation-specific information.

9 Further Comments

The complex analogue of this routine is f08jxf.

10 Example

See f08fgf.