version 1.1, 2010/01/26 15:22:45
|
version 1.9, 2011/11/21 20:43:06
|
Line 1
|
Line 1
|
|
*> \brief \b DTRSEN |
|
* |
|
* =========== DOCUMENTATION =========== |
|
* |
|
* Online html documentation available at |
|
* http://www.netlib.org/lapack/explore-html/ |
|
* |
|
*> \htmlonly |
|
*> Download DTRSEN + dependencies |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dtrsen.f"> |
|
*> [TGZ]</a> |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dtrsen.f"> |
|
*> [ZIP]</a> |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dtrsen.f"> |
|
*> [TXT]</a> |
|
*> \endhtmlonly |
|
* |
|
* Definition: |
|
* =========== |
|
* |
|
* SUBROUTINE DTRSEN( JOB, COMPQ, SELECT, N, T, LDT, Q, LDQ, WR, WI, |
|
* M, S, SEP, WORK, LWORK, IWORK, LIWORK, INFO ) |
|
* |
|
* .. Scalar Arguments .. |
|
* CHARACTER COMPQ, JOB |
|
* INTEGER INFO, LDQ, LDT, LIWORK, LWORK, M, N |
|
* DOUBLE PRECISION S, SEP |
|
* .. |
|
* .. Array Arguments .. |
|
* LOGICAL SELECT( * ) |
|
* INTEGER IWORK( * ) |
|
* DOUBLE PRECISION Q( LDQ, * ), T( LDT, * ), WI( * ), WORK( * ), |
|
* $ WR( * ) |
|
* .. |
|
* |
|
* |
|
*> \par Purpose: |
|
* ============= |
|
*> |
|
*> \verbatim |
|
*> |
|
*> DTRSEN reorders the real Schur factorization of a real matrix |
|
*> A = Q*T*Q**T, so that a selected cluster of eigenvalues appears in |
|
*> the leading diagonal blocks of the upper quasi-triangular matrix T, |
|
*> and the leading columns of Q form an orthonormal basis of the |
|
*> corresponding right invariant subspace. |
|
*> |
|
*> Optionally the routine computes the reciprocal condition numbers of |
|
*> the cluster of eigenvalues and/or the invariant subspace. |
|
*> |
|
*> T must be in Schur canonical form (as returned by DHSEQR), that is, |
|
*> block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; each |
|
*> 2-by-2 diagonal block has its diagonal elemnts equal and its |
|
*> off-diagonal elements of opposite sign. |
|
*> \endverbatim |
|
* |
|
* Arguments: |
|
* ========== |
|
* |
|
*> \param[in] JOB |
|
*> \verbatim |
|
*> JOB is CHARACTER*1 |
|
*> Specifies whether condition numbers are required for the |
|
*> cluster of eigenvalues (S) or the invariant subspace (SEP): |
|
*> = 'N': none; |
|
*> = 'E': for eigenvalues only (S); |
|
*> = 'V': for invariant subspace only (SEP); |
|
*> = 'B': for both eigenvalues and invariant subspace (S and |
|
*> SEP). |
|
*> \endverbatim |
|
*> |
|
*> \param[in] COMPQ |
|
*> \verbatim |
|
*> COMPQ is CHARACTER*1 |
|
*> = 'V': update the matrix Q of Schur vectors; |
|
*> = 'N': do not update Q. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] SELECT |
|
*> \verbatim |
|
*> SELECT is LOGICAL array, dimension (N) |
|
*> SELECT specifies the eigenvalues in the selected cluster. To |
|
*> select a real eigenvalue w(j), SELECT(j) must be set to |
|
*> .TRUE.. To select a complex conjugate pair of eigenvalues |
|
*> w(j) and w(j+1), corresponding to a 2-by-2 diagonal block, |
|
*> either SELECT(j) or SELECT(j+1) or both must be set to |
|
*> .TRUE.; a complex conjugate pair of eigenvalues must be |
|
*> either both included in the cluster or both excluded. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] N |
|
*> \verbatim |
|
*> N is INTEGER |
|
*> The order of the matrix T. N >= 0. |
|
*> \endverbatim |
|
*> |
|
*> \param[in,out] T |
|
*> \verbatim |
|
*> T is DOUBLE PRECISION array, dimension (LDT,N) |
|
*> On entry, the upper quasi-triangular matrix T, in Schur |
|
*> canonical form. |
|
*> On exit, T is overwritten by the reordered matrix T, again in |
|
*> Schur canonical form, with the selected eigenvalues in the |
|
*> leading diagonal blocks. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LDT |
|
*> \verbatim |
|
*> LDT is INTEGER |
|
*> The leading dimension of the array T. LDT >= max(1,N). |
|
*> \endverbatim |
|
*> |
|
*> \param[in,out] Q |
|
*> \verbatim |
|
*> Q is DOUBLE PRECISION array, dimension (LDQ,N) |
|
*> On entry, if COMPQ = 'V', the matrix Q of Schur vectors. |
|
*> On exit, if COMPQ = 'V', Q has been postmultiplied by the |
|
*> orthogonal transformation matrix which reorders T; the |
|
*> leading M columns of Q form an orthonormal basis for the |
|
*> specified invariant subspace. |
|
*> If COMPQ = 'N', Q is not referenced. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LDQ |
|
*> \verbatim |
|
*> LDQ is INTEGER |
|
*> The leading dimension of the array Q. |
|
*> LDQ >= 1; and if COMPQ = 'V', LDQ >= N. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] WR |
|
*> \verbatim |
|
*> WR is DOUBLE PRECISION array, dimension (N) |
|
*> \endverbatim |
|
*> \param[out] WI |
|
*> \verbatim |
|
*> WI is DOUBLE PRECISION array, dimension (N) |
|
*> |
|
*> The real and imaginary parts, respectively, of the reordered |
|
*> eigenvalues of T. The eigenvalues are stored in the same |
|
*> order as on the diagonal of T, with WR(i) = T(i,i) and, if |
|
*> T(i:i+1,i:i+1) is a 2-by-2 diagonal block, WI(i) > 0 and |
|
*> WI(i+1) = -WI(i). Note that if a complex eigenvalue is |
|
*> sufficiently ill-conditioned, then its value may differ |
|
*> significantly from its value before reordering. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] M |
|
*> \verbatim |
|
*> M is INTEGER |
|
*> The dimension of the specified invariant subspace. |
|
*> 0 < = M <= N. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] S |
|
*> \verbatim |
|
*> S is DOUBLE PRECISION |
|
*> If JOB = 'E' or 'B', S is a lower bound on the reciprocal |
|
*> condition number for the selected cluster of eigenvalues. |
|
*> S cannot underestimate the true reciprocal condition number |
|
*> by more than a factor of sqrt(N). If M = 0 or N, S = 1. |
|
*> If JOB = 'N' or 'V', S is not referenced. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] SEP |
|
*> \verbatim |
|
*> SEP is DOUBLE PRECISION |
|
*> If JOB = 'V' or 'B', SEP is the estimated reciprocal |
|
*> condition number of the specified invariant subspace. If |
|
*> M = 0 or N, SEP = norm(T). |
|
*> If JOB = 'N' or 'E', SEP is not referenced. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] WORK |
|
*> \verbatim |
|
*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK)) |
|
*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LWORK |
|
*> \verbatim |
|
*> LWORK is INTEGER |
|
*> The dimension of the array WORK. |
|
*> If JOB = 'N', LWORK >= max(1,N); |
|
*> if JOB = 'E', LWORK >= max(1,M*(N-M)); |
|
*> if JOB = 'V' or 'B', LWORK >= max(1,2*M*(N-M)). |
|
*> |
|
*> If LWORK = -1, then a workspace query is assumed; the routine |
|
*> only calculates the optimal size of the WORK array, returns |
|
*> this value as the first entry of the WORK array, and no error |
|
*> message related to LWORK is issued by XERBLA. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] IWORK |
|
*> \verbatim |
|
*> IWORK is INTEGER array, dimension (MAX(1,LIWORK)) |
|
*> On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LIWORK |
|
*> \verbatim |
|
*> LIWORK is INTEGER |
|
*> The dimension of the array IWORK. |
|
*> If JOB = 'N' or 'E', LIWORK >= 1; |
|
*> if JOB = 'V' or 'B', LIWORK >= max(1,M*(N-M)). |
|
*> |
|
*> If LIWORK = -1, then a workspace query is assumed; the |
|
*> routine only calculates the optimal size of the IWORK array, |
|
*> returns this value as the first entry of the IWORK array, and |
|
*> no error message related to LIWORK is issued by XERBLA. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] INFO |
|
*> \verbatim |
|
*> INFO is INTEGER |
|
*> = 0: successful exit |
|
*> < 0: if INFO = -i, the i-th argument had an illegal value |
|
*> = 1: reordering of T failed because some eigenvalues are too |
|
*> close to separate (the problem is very ill-conditioned); |
|
*> T may have been partially reordered, and WR and WI |
|
*> contain the eigenvalues in the same order as in T; S and |
|
*> SEP (if requested) are set to zero. |
|
*> \endverbatim |
|
* |
|
* Authors: |
|
* ======== |
|
* |
|
*> \author Univ. of Tennessee |
|
*> \author Univ. of California Berkeley |
|
*> \author Univ. of Colorado Denver |
|
*> \author NAG Ltd. |
|
* |
|
*> \date November 2011 |
|
* |
|
*> \ingroup doubleOTHERcomputational |
|
* |
|
*> \par Further Details: |
|
* ===================== |
|
*> |
|
*> \verbatim |
|
*> |
|
*> DTRSEN first collects the selected eigenvalues by computing an |
|
*> orthogonal transformation Z to move them to the top left corner of T. |
|
*> In other words, the selected eigenvalues are the eigenvalues of T11 |
|
*> in: |
|
*> |
|
*> Z**T * T * Z = ( T11 T12 ) n1 |
|
*> ( 0 T22 ) n2 |
|
*> n1 n2 |
|
*> |
|
*> where N = n1+n2 and Z**T means the transpose of Z. The first n1 columns |
|
*> of Z span the specified invariant subspace of T. |
|
*> |
|
*> If T has been obtained from the real Schur factorization of a matrix |
|
*> A = Q*T*Q**T, then the reordered real Schur factorization of A is given |
|
*> by A = (Q*Z)*(Z**T*T*Z)*(Q*Z)**T, and the first n1 columns of Q*Z span |
|
*> the corresponding invariant subspace of A. |
|
*> |
|
*> The reciprocal condition number of the average of the eigenvalues of |
|
*> T11 may be returned in S. S lies between 0 (very badly conditioned) |
|
*> and 1 (very well conditioned). It is computed as follows. First we |
|
*> compute R so that |
|
*> |
|
*> P = ( I R ) n1 |
|
*> ( 0 0 ) n2 |
|
*> n1 n2 |
|
*> |
|
*> is the projector on the invariant subspace associated with T11. |
|
*> R is the solution of the Sylvester equation: |
|
*> |
|
*> T11*R - R*T22 = T12. |
|
*> |
|
*> Let F-norm(M) denote the Frobenius-norm of M and 2-norm(M) denote |
|
*> the two-norm of M. Then S is computed as the lower bound |
|
*> |
|
*> (1 + F-norm(R)**2)**(-1/2) |
|
*> |
|
*> on the reciprocal of 2-norm(P), the true reciprocal condition number. |
|
*> S cannot underestimate 1 / 2-norm(P) by more than a factor of |
|
*> sqrt(N). |
|
*> |
|
*> An approximate error bound for the computed average of the |
|
*> eigenvalues of T11 is |
|
*> |
|
*> EPS * norm(T) / S |
|
*> |
|
*> where EPS is the machine precision. |
|
*> |
|
*> The reciprocal condition number of the right invariant subspace |
|
*> spanned by the first n1 columns of Z (or of Q*Z) is returned in SEP. |
|
*> SEP is defined as the separation of T11 and T22: |
|
*> |
|
*> sep( T11, T22 ) = sigma-min( C ) |
|
*> |
|
*> where sigma-min(C) is the smallest singular value of the |
|
*> n1*n2-by-n1*n2 matrix |
|
*> |
|
*> C = kprod( I(n2), T11 ) - kprod( transpose(T22), I(n1) ) |
|
*> |
|
*> I(m) is an m by m identity matrix, and kprod denotes the Kronecker |
|
*> product. We estimate sigma-min(C) by the reciprocal of an estimate of |
|
*> the 1-norm of inverse(C). The true reciprocal 1-norm of inverse(C) |
|
*> cannot differ from sigma-min(C) by more than a factor of sqrt(n1*n2). |
|
*> |
|
*> When SEP is small, small changes in T can cause large changes in |
|
*> the invariant subspace. An approximate bound on the maximum angular |
|
*> error in the computed right invariant subspace is |
|
*> |
|
*> EPS * norm(T) / SEP |
|
*> \endverbatim |
|
*> |
|
* ===================================================================== |
SUBROUTINE DTRSEN( JOB, COMPQ, SELECT, N, T, LDT, Q, LDQ, WR, WI, |
SUBROUTINE DTRSEN( JOB, COMPQ, SELECT, N, T, LDT, Q, LDQ, WR, WI, |
$ M, S, SEP, WORK, LWORK, IWORK, LIWORK, INFO ) |
$ M, S, SEP, WORK, LWORK, IWORK, LIWORK, INFO ) |
* |
* |
* -- LAPACK routine (version 3.2) -- |
* -- LAPACK computational routine (version 3.4.0) -- |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
* November 2006 |
* November 2011 |
* |
* |
* .. Scalar Arguments .. |
* .. Scalar Arguments .. |
CHARACTER COMPQ, JOB |
CHARACTER COMPQ, JOB |
Line 18
|
Line 330
|
$ WR( * ) |
$ WR( * ) |
* .. |
* .. |
* |
* |
* Purpose |
|
* ======= |
|
* |
|
* DTRSEN reorders the real Schur factorization of a real matrix |
|
* A = Q*T*Q**T, so that a selected cluster of eigenvalues appears in |
|
* the leading diagonal blocks of the upper quasi-triangular matrix T, |
|
* and the leading columns of Q form an orthonormal basis of the |
|
* corresponding right invariant subspace. |
|
* |
|
* Optionally the routine computes the reciprocal condition numbers of |
|
* the cluster of eigenvalues and/or the invariant subspace. |
|
* |
|
* T must be in Schur canonical form (as returned by DHSEQR), that is, |
|
* block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; each |
|
* 2-by-2 diagonal block has its diagonal elemnts equal and its |
|
* off-diagonal elements of opposite sign. |
|
* |
|
* Arguments |
|
* ========= |
|
* |
|
* JOB (input) CHARACTER*1 |
|
* Specifies whether condition numbers are required for the |
|
* cluster of eigenvalues (S) or the invariant subspace (SEP): |
|
* = 'N': none; |
|
* = 'E': for eigenvalues only (S); |
|
* = 'V': for invariant subspace only (SEP); |
|
* = 'B': for both eigenvalues and invariant subspace (S and |
|
* SEP). |
|
* |
|
* COMPQ (input) CHARACTER*1 |
|
* = 'V': update the matrix Q of Schur vectors; |
|
* = 'N': do not update Q. |
|
* |
|
* SELECT (input) LOGICAL array, dimension (N) |
|
* SELECT specifies the eigenvalues in the selected cluster. To |
|
* select a real eigenvalue w(j), SELECT(j) must be set to |
|
* .TRUE.. To select a complex conjugate pair of eigenvalues |
|
* w(j) and w(j+1), corresponding to a 2-by-2 diagonal block, |
|
* either SELECT(j) or SELECT(j+1) or both must be set to |
|
* .TRUE.; a complex conjugate pair of eigenvalues must be |
|
* either both included in the cluster or both excluded. |
|
* |
|
* N (input) INTEGER |
|
* The order of the matrix T. N >= 0. |
|
* |
|
* T (input/output) DOUBLE PRECISION array, dimension (LDT,N) |
|
* On entry, the upper quasi-triangular matrix T, in Schur |
|
* canonical form. |
|
* On exit, T is overwritten by the reordered matrix T, again in |
|
* Schur canonical form, with the selected eigenvalues in the |
|
* leading diagonal blocks. |
|
* |
|
* LDT (input) INTEGER |
|
* The leading dimension of the array T. LDT >= max(1,N). |
|
* |
|
* Q (input/output) DOUBLE PRECISION array, dimension (LDQ,N) |
|
* On entry, if COMPQ = 'V', the matrix Q of Schur vectors. |
|
* On exit, if COMPQ = 'V', Q has been postmultiplied by the |
|
* orthogonal transformation matrix which reorders T; the |
|
* leading M columns of Q form an orthonormal basis for the |
|
* specified invariant subspace. |
|
* If COMPQ = 'N', Q is not referenced. |
|
* |
|
* LDQ (input) INTEGER |
|
* The leading dimension of the array Q. |
|
* LDQ >= 1; and if COMPQ = 'V', LDQ >= N. |
|
* |
|
* WR (output) DOUBLE PRECISION array, dimension (N) |
|
* WI (output) DOUBLE PRECISION array, dimension (N) |
|
* The real and imaginary parts, respectively, of the reordered |
|
* eigenvalues of T. The eigenvalues are stored in the same |
|
* order as on the diagonal of T, with WR(i) = T(i,i) and, if |
|
* T(i:i+1,i:i+1) is a 2-by-2 diagonal block, WI(i) > 0 and |
|
* WI(i+1) = -WI(i). Note that if a complex eigenvalue is |
|
* sufficiently ill-conditioned, then its value may differ |
|
* significantly from its value before reordering. |
|
* |
|
* M (output) INTEGER |
|
* The dimension of the specified invariant subspace. |
|
* 0 < = M <= N. |
|
* |
|
* S (output) DOUBLE PRECISION |
|
* If JOB = 'E' or 'B', S is a lower bound on the reciprocal |
|
* condition number for the selected cluster of eigenvalues. |
|
* S cannot underestimate the true reciprocal condition number |
|
* by more than a factor of sqrt(N). If M = 0 or N, S = 1. |
|
* If JOB = 'N' or 'V', S is not referenced. |
|
* |
|
* SEP (output) DOUBLE PRECISION |
|
* If JOB = 'V' or 'B', SEP is the estimated reciprocal |
|
* condition number of the specified invariant subspace. If |
|
* M = 0 or N, SEP = norm(T). |
|
* If JOB = 'N' or 'E', SEP is not referenced. |
|
* |
|
* WORK (workspace/output) DOUBLE PRECISION array, dimension (MAX(1,LWORK)) |
|
* On exit, if INFO = 0, WORK(1) returns the optimal LWORK. |
|
* |
|
* LWORK (input) INTEGER |
|
* The dimension of the array WORK. |
|
* If JOB = 'N', LWORK >= max(1,N); |
|
* if JOB = 'E', LWORK >= max(1,M*(N-M)); |
|
* if JOB = 'V' or 'B', LWORK >= max(1,2*M*(N-M)). |
|
* |
|
* If LWORK = -1, then a workspace query is assumed; the routine |
|
* only calculates the optimal size of the WORK array, returns |
|
* this value as the first entry of the WORK array, and no error |
|
* message related to LWORK is issued by XERBLA. |
|
* |
|
* IWORK (workspace) INTEGER array, dimension (MAX(1,LIWORK)) |
|
* On exit, if INFO = 0, IWORK(1) returns the optimal LIWORK. |
|
* |
|
* LIWORK (input) INTEGER |
|
* The dimension of the array IWORK. |
|
* If JOB = 'N' or 'E', LIWORK >= 1; |
|
* if JOB = 'V' or 'B', LIWORK >= max(1,M*(N-M)). |
|
* |
|
* If LIWORK = -1, then a workspace query is assumed; the |
|
* routine only calculates the optimal size of the IWORK array, |
|
* returns this value as the first entry of the IWORK array, and |
|
* no error message related to LIWORK is issued by XERBLA. |
|
* |
|
* INFO (output) INTEGER |
|
* = 0: successful exit |
|
* < 0: if INFO = -i, the i-th argument had an illegal value |
|
* = 1: reordering of T failed because some eigenvalues are too |
|
* close to separate (the problem is very ill-conditioned); |
|
* T may have been partially reordered, and WR and WI |
|
* contain the eigenvalues in the same order as in T; S and |
|
* SEP (if requested) are set to zero. |
|
* |
|
* Further Details |
|
* =============== |
|
* |
|
* DTRSEN first collects the selected eigenvalues by computing an |
|
* orthogonal transformation Z to move them to the top left corner of T. |
|
* In other words, the selected eigenvalues are the eigenvalues of T11 |
|
* in: |
|
* |
|
* Z'*T*Z = ( T11 T12 ) n1 |
|
* ( 0 T22 ) n2 |
|
* n1 n2 |
|
* |
|
* where N = n1+n2 and Z' means the transpose of Z. The first n1 columns |
|
* of Z span the specified invariant subspace of T. |
|
* |
|
* If T has been obtained from the real Schur factorization of a matrix |
|
* A = Q*T*Q', then the reordered real Schur factorization of A is given |
|
* by A = (Q*Z)*(Z'*T*Z)*(Q*Z)', and the first n1 columns of Q*Z span |
|
* the corresponding invariant subspace of A. |
|
* |
|
* The reciprocal condition number of the average of the eigenvalues of |
|
* T11 may be returned in S. S lies between 0 (very badly conditioned) |
|
* and 1 (very well conditioned). It is computed as follows. First we |
|
* compute R so that |
|
* |
|
* P = ( I R ) n1 |
|
* ( 0 0 ) n2 |
|
* n1 n2 |
|
* |
|
* is the projector on the invariant subspace associated with T11. |
|
* R is the solution of the Sylvester equation: |
|
* |
|
* T11*R - R*T22 = T12. |
|
* |
|
* Let F-norm(M) denote the Frobenius-norm of M and 2-norm(M) denote |
|
* the two-norm of M. Then S is computed as the lower bound |
|
* |
|
* (1 + F-norm(R)**2)**(-1/2) |
|
* |
|
* on the reciprocal of 2-norm(P), the true reciprocal condition number. |
|
* S cannot underestimate 1 / 2-norm(P) by more than a factor of |
|
* sqrt(N). |
|
* |
|
* An approximate error bound for the computed average of the |
|
* eigenvalues of T11 is |
|
* |
|
* EPS * norm(T) / S |
|
* |
|
* where EPS is the machine precision. |
|
* |
|
* The reciprocal condition number of the right invariant subspace |
|
* spanned by the first n1 columns of Z (or of Q*Z) is returned in SEP. |
|
* SEP is defined as the separation of T11 and T22: |
|
* |
|
* sep( T11, T22 ) = sigma-min( C ) |
|
* |
|
* where sigma-min(C) is the smallest singular value of the |
|
* n1*n2-by-n1*n2 matrix |
|
* |
|
* C = kprod( I(n2), T11 ) - kprod( transpose(T22), I(n1) ) |
|
* |
|
* I(m) is an m by m identity matrix, and kprod denotes the Kronecker |
|
* product. We estimate sigma-min(C) by the reciprocal of an estimate of |
|
* the 1-norm of inverse(C). The true reciprocal 1-norm of inverse(C) |
|
* cannot differ from sigma-min(C) by more than a factor of sqrt(n1*n2). |
|
* |
|
* When SEP is small, small changes in T can cause large changes in |
|
* the invariant subspace. An approximate bound on the maximum angular |
|
* error in the computed right invariant subspace is |
|
* |
|
* EPS * norm(T) / SEP |
|
* |
|
* ===================================================================== |
* ===================================================================== |
* |
* |
* .. Parameters .. |
* .. Parameters .. |
Line 422
|
Line 532
|
$ IERR ) |
$ IERR ) |
ELSE |
ELSE |
* |
* |
* Solve T11'*R - R*T22' = scale*X. |
* Solve T11**T*R - R*T22**T = scale*X. |
* |
* |
CALL DTRSYL( 'T', 'T', -1, N1, N2, T, LDT, |
CALL DTRSYL( 'T', 'T', -1, N1, N2, T, LDT, |
$ T( N1+1, N1+1 ), LDT, WORK, N1, SCALE, |
$ T( N1+1, N1+1 ), LDT, WORK, N1, SCALE, |