📄 slaed5.f
字号:
SUBROUTINE SLAED5( I, D, Z, DELTA, RHO, DLAM )** -- LAPACK routine (instrumented to count operations, version 3.0) --* Univ. of Tennessee, Oak Ridge National Lab, Argonne National Lab,* Courant Institute, NAG Ltd., and Rice University* September 30, 1994** .. Scalar Arguments .. INTEGER I REAL DLAM, RHO* ..* .. Array Arguments .. REAL D( 2 ), DELTA( 2 ), Z( 2 )* ..* Common block to return operation count and iteration count* ITCNT is unchanged, OPS is only incremented* .. Common blocks .. COMMON / LATIME / OPS, ITCNT* ..* .. Scalars in Common .. REAL ITCNT, OPS* ..** Purpose* =======** This subroutine computes the I-th eigenvalue of a symmetric rank-one* modification of a 2-by-2 diagonal matrix** diag( D ) + RHO * Z * transpose(Z) .** The diagonal elements in the array D are assumed to satisfy** D(i) < D(j) for i < j .** We also assume RHO > 0 and that the Euclidean norm of the vector* Z is one.** Arguments* =========** I (input) INTEGER* The index of the eigenvalue to be computed. I = 1 or I = 2.** D (input) REAL array, dimension (2)* The original eigenvalues. We assume D(1) < D(2).** Z (input) REAL array, dimension (2)* The components of the updating vector.** DELTA (output) REAL array, dimension (2)* The vector DELTA contains the information necessary* to construct the eigenvectors.** RHO (input) REAL* The scalar in the symmetric updating formula.** DLAM (output) REAL* The computed lambda_I, the I-th updated eigenvalue.** Further Details* ===============** Based on contributions by* Ren-Cang Li, Computer Science Division, University of California* at Berkeley, USA** =====================================================================** .. Parameters .. REAL ZERO, ONE, TWO, FOUR PARAMETER ( ZERO = 0.0E0, ONE = 1.0E0, TWO = 2.0E0, $ FOUR = 4.0E0 )* ..* .. Local Scalars .. REAL B, C, DEL, TAU, TEMP, W* ..* .. Intrinsic Functions .. INTRINSIC ABS, SQRT* ..* .. Executable Statements ..* DEL = D( 2 ) - D( 1 ) IF( I.EQ.1 ) THEN W = ONE + TWO*RHO*( Z( 2 )*Z( 2 )-Z( 1 )*Z( 1 ) ) / DEL IF( W.GT.ZERO ) THEN OPS = OPS + 33 B = DEL + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) ) C = RHO*Z( 1 )*Z( 1 )*DEL** B > ZERO, always* TAU = TWO*C / ( B+SQRT( ABS( B*B-FOUR*C ) ) ) DLAM = D( 1 ) + TAU DELTA( 1 ) = -Z( 1 ) / TAU DELTA( 2 ) = Z( 2 ) / ( DEL-TAU ) ELSE OPS = OPS + 31 B = -DEL + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) ) C = RHO*Z( 2 )*Z( 2 )*DEL IF( B.GT.ZERO ) THEN TAU = -TWO*C / ( B+SQRT( B*B+FOUR*C ) ) ELSE TAU = ( B-SQRT( B*B+FOUR*C ) ) / TWO END IF DLAM = D( 2 ) + TAU DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU ) DELTA( 2 ) = -Z( 2 ) / TAU END IF TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) ) DELTA( 1 ) = DELTA( 1 ) / TEMP DELTA( 2 ) = DELTA( 2 ) / TEMP ELSE** Now I=2* OPS = OPS + 24 B = -DEL + RHO*( Z( 1 )*Z( 1 )+Z( 2 )*Z( 2 ) ) C = RHO*Z( 2 )*Z( 2 )*DEL IF( B.GT.ZERO ) THEN TAU = ( B+SQRT( B*B+FOUR*C ) ) / TWO ELSE TAU = TWO*C / ( -B+SQRT( B*B+FOUR*C ) ) END IF DLAM = D( 2 ) + TAU DELTA( 1 ) = -Z( 1 ) / ( DEL+TAU ) DELTA( 2 ) = -Z( 2 ) / TAU TEMP = SQRT( DELTA( 1 )*DELTA( 1 )+DELTA( 2 )*DELTA( 2 ) ) DELTA( 1 ) = DELTA( 1 ) / TEMP DELTA( 2 ) = DELTA( 2 ) / TEMP END IF RETURN** End OF SLAED5* END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -