⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shgeqz.f

📁 计算矩阵的经典开源库.全世界都在用它.相信你也不能例外.
💻 F
📖 第 1 页 / 共 4 页
字号:
            END IF            GO TO 350         ELSE**           Usual case: 3x3 or larger block, using Francis implicit*                       double-shift**                                    2*           Eigenvalue equation is  w  - c w + d = 0,**                                         -1 2        -1*           so compute 1st column of  (A B  )  - c A B   + d*           using the formula in QZIT (from EISPACK)**           We assume that the block is at least 3x3*            AD11 = ( ASCALE*A( ILAST-1, ILAST-1 ) ) /     $             ( BSCALE*B( ILAST-1, ILAST-1 ) )            AD21 = ( ASCALE*A( ILAST, ILAST-1 ) ) /     $             ( BSCALE*B( ILAST-1, ILAST-1 ) )            AD12 = ( ASCALE*A( ILAST-1, ILAST ) ) /     $             ( BSCALE*B( ILAST, ILAST ) )            AD22 = ( ASCALE*A( ILAST, ILAST ) ) /     $             ( BSCALE*B( ILAST, ILAST ) )            U12 = B( ILAST-1, ILAST ) / B( ILAST, ILAST )            AD11L = ( ASCALE*A( IFIRST, IFIRST ) ) /     $              ( BSCALE*B( IFIRST, IFIRST ) )            AD21L = ( ASCALE*A( IFIRST+1, IFIRST ) ) /     $              ( BSCALE*B( IFIRST, IFIRST ) )            AD12L = ( ASCALE*A( IFIRST, IFIRST+1 ) ) /     $              ( BSCALE*B( IFIRST+1, IFIRST+1 ) )            AD22L = ( ASCALE*A( IFIRST+1, IFIRST+1 ) ) /     $              ( BSCALE*B( IFIRST+1, IFIRST+1 ) )            AD32L = ( ASCALE*A( IFIRST+2, IFIRST+1 ) ) /     $              ( BSCALE*B( IFIRST+1, IFIRST+1 ) )            U12L = B( IFIRST, IFIRST+1 ) / B( IFIRST+1, IFIRST+1 )*            V( 1 ) = ( AD11-AD11L )*( AD22-AD11L ) - AD12*AD21 +     $               AD21*U12*AD11L + ( AD12L-AD11L*U12L )*AD21L            V( 2 ) = ( ( AD22L-AD11L )-AD21L*U12L-( AD11-AD11L )-     $               ( AD22-AD11L )+AD21*U12 )*AD21L            V( 3 ) = AD32L*AD21L*            ISTART = IFIRST*            CALL SLARFG( 3, V( 1 ), V( 2 ), 1, TAU )            V( 1 ) = ONE**           Sweep*            DO 290 J = ISTART, ILAST - 2**              All but last elements: use 3x3 Householder transforms.**              Zero (j-1)st column of A*               IF( J.GT.ISTART ) THEN                  V( 1 ) = A( J, J-1 )                  V( 2 ) = A( J+1, J-1 )                  V( 3 ) = A( J+2, J-1 )*                  CALL SLARFG( 3, A( J, J-1 ), V( 2 ), 1, TAU )                  V( 1 ) = ONE                  A( J+1, J-1 ) = ZERO                  A( J+2, J-1 ) = ZERO               END IF*               DO 230 JC = J, ILASTM                  TEMP = TAU*( A( J, JC )+V( 2 )*A( J+1, JC )+V( 3 )*     $                   A( J+2, JC ) )                  A( J, JC ) = A( J, JC ) - TEMP                  A( J+1, JC ) = A( J+1, JC ) - TEMP*V( 2 )                  A( J+2, JC ) = A( J+2, JC ) - TEMP*V( 3 )                  TEMP2 = TAU*( B( J, JC )+V( 2 )*B( J+1, JC )+V( 3 )*     $                    B( J+2, JC ) )                  B( J, JC ) = B( J, JC ) - TEMP2                  B( J+1, JC ) = B( J+1, JC ) - TEMP2*V( 2 )                  B( J+2, JC ) = B( J+2, JC ) - TEMP2*V( 3 )  230          CONTINUE               IF( ILQ ) THEN                  DO 240 JR = 1, N                     TEMP = TAU*( Q( JR, J )+V( 2 )*Q( JR, J+1 )+V( 3 )*     $                      Q( JR, J+2 ) )                     Q( JR, J ) = Q( JR, J ) - TEMP                     Q( JR, J+1 ) = Q( JR, J+1 ) - TEMP*V( 2 )                     Q( JR, J+2 ) = Q( JR, J+2 ) - TEMP*V( 3 )  240             CONTINUE               END IF**              Zero j-th column of B (see SLAGBC for details)**              Swap rows to pivot*               ILPIVT = .FALSE.               TEMP = MAX( ABS( B( J+1, J+1 ) ), ABS( B( J+1, J+2 ) ) )               TEMP2 = MAX( ABS( B( J+2, J+1 ) ), ABS( B( J+2, J+2 ) ) )               IF( MAX( TEMP, TEMP2 ).LT.SAFMIN ) THEN                  SCALE = ZERO                  U1 = ONE                  U2 = ZERO                  GO TO 250               ELSE IF( TEMP.GE.TEMP2 ) THEN                  W11 = B( J+1, J+1 )                  W21 = B( J+2, J+1 )                  W12 = B( J+1, J+2 )                  W22 = B( J+2, J+2 )                  U1 = B( J+1, J )                  U2 = B( J+2, J )               ELSE                  W21 = B( J+1, J+1 )                  W11 = B( J+2, J+1 )                  W22 = B( J+1, J+2 )                  W12 = B( J+2, J+2 )                  U2 = B( J+1, J )                  U1 = B( J+2, J )               END IF**              Swap columns if nec.*               IF( ABS( W12 ).GT.ABS( W11 ) ) THEN                  ILPIVT = .TRUE.                  TEMP = W12                  TEMP2 = W22                  W12 = W11                  W22 = W21                  W11 = TEMP                  W21 = TEMP2               END IF**              LU-factor*               TEMP = W21 / W11               U2 = U2 - TEMP*U1               W22 = W22 - TEMP*W12               W21 = ZERO**              Compute SCALE*               SCALE = ONE               IF( ABS( W22 ).LT.SAFMIN ) THEN                  SCALE = ZERO                  U2 = ONE                  U1 = -W12 / W11                  GO TO 250               END IF               IF( ABS( W22 ).LT.ABS( U2 ) )     $            SCALE = ABS( W22 / U2 )               IF( ABS( W11 ).LT.ABS( U1 ) )     $            SCALE = MIN( SCALE, ABS( W11 / U1 ) )**              Solve*               U2 = ( SCALE*U2 ) / W22               U1 = ( SCALE*U1-W12*U2 ) / W11*  250          CONTINUE               IF( ILPIVT ) THEN                  TEMP = U2                  U2 = U1                  U1 = TEMP               END IF**              Compute Householder Vector*               T = SQRT( SCALE**2+U1**2+U2**2 )               TAU = ONE + SCALE / T               VS = -ONE / ( SCALE+T )               V( 1 ) = ONE               V( 2 ) = VS*U1               V( 3 ) = VS*U2**              Apply transformations from the right.*               DO 260 JR = IFRSTM, MIN( J+3, ILAST )                  TEMP = TAU*( A( JR, J )+V( 2 )*A( JR, J+1 )+V( 3 )*     $                   A( JR, J+2 ) )                  A( JR, J ) = A( JR, J ) - TEMP                  A( JR, J+1 ) = A( JR, J+1 ) - TEMP*V( 2 )                  A( JR, J+2 ) = A( JR, J+2 ) - TEMP*V( 3 )  260          CONTINUE               DO 270 JR = IFRSTM, J + 2                  TEMP = TAU*( B( JR, J )+V( 2 )*B( JR, J+1 )+V( 3 )*     $                   B( JR, J+2 ) )                  B( JR, J ) = B( JR, J ) - TEMP                  B( JR, J+1 ) = B( JR, J+1 ) - TEMP*V( 2 )                  B( JR, J+2 ) = B( JR, J+2 ) - TEMP*V( 3 )  270          CONTINUE               IF( ILZ ) THEN                  DO 280 JR = 1, N                     TEMP = TAU*( Z( JR, J )+V( 2 )*Z( JR, J+1 )+V( 3 )*     $                      Z( JR, J+2 ) )                     Z( JR, J ) = Z( JR, J ) - TEMP                     Z( JR, J+1 ) = Z( JR, J+1 ) - TEMP*V( 2 )                     Z( JR, J+2 ) = Z( JR, J+2 ) - TEMP*V( 3 )  280             CONTINUE               END IF               B( J+1, J ) = ZERO               B( J+2, J ) = ZERO  290       CONTINUE**           Last elements: Use Givens rotations**           Rotations from the left*            J = ILAST - 1            TEMP = A( J, J-1 )            CALL SLARTG( TEMP, A( J+1, J-1 ), C, S, A( J, J-1 ) )            A( J+1, J-1 ) = ZERO*            DO 300 JC = J, ILASTM               TEMP = C*A( J, JC ) + S*A( J+1, JC )               A( J+1, JC ) = -S*A( J, JC ) + C*A( J+1, JC )               A( J, JC ) = TEMP               TEMP2 = C*B( J, JC ) + S*B( J+1, JC )               B( J+1, JC ) = -S*B( J, JC ) + C*B( J+1, JC )               B( J, JC ) = TEMP2  300       CONTINUE            IF( ILQ ) THEN               DO 310 JR = 1, N                  TEMP = C*Q( JR, J ) + S*Q( JR, J+1 )                  Q( JR, J+1 ) = -S*Q( JR, J ) + C*Q( JR, J+1 )                  Q( JR, J ) = TEMP  310          CONTINUE            END IF**           Rotations from the right.*            TEMP = B( J+1, J+1 )            CALL SLARTG( TEMP, B( J+1, J ), C, S, B( J+1, J+1 ) )            B( J+1, J ) = ZERO*            DO 320 JR = IFRSTM, ILAST               TEMP = C*A( JR, J+1 ) + S*A( JR, J )               A( JR, J ) = -S*A( JR, J+1 ) + C*A( JR, J )               A( JR, J+1 ) = TEMP  320       CONTINUE            DO 330 JR = IFRSTM, ILAST - 1               TEMP = C*B( JR, J+1 ) + S*B( JR, J )               B( JR, J ) = -S*B( JR, J+1 ) + C*B( JR, J )               B( JR, J+1 ) = TEMP  330       CONTINUE            IF( ILZ ) THEN               DO 340 JR = 1, N                  TEMP = C*Z( JR, J+1 ) + S*Z( JR, J )                  Z( JR, J ) = -S*Z( JR, J+1 ) + C*Z( JR, J )                  Z( JR, J+1 ) = TEMP  340          CONTINUE            END IF**           ------------------- Begin Timing Code ----------------------            OPST = OPST + ( REAL( 14+30-10+52+12*( ILASTM-IFRSTM )+6*     $             ( NQ+NZ ) )+REAL( ILAST-1-ISTART )*     $             REAL( 14+24+90+20*( ILASTM-IFRSTM )+10*( NQ+NZ ) ) )*           -------------------- End Timing Code -----------------------**           End of Double-Shift code*         END IF*         GO TO 350**        End of iteration loop*  350    CONTINUE*        --------------------- Begin Timing Code -----------------------         OPS = OPS + OPST         OPST = ZERO*        ---------------------- End Timing Code ------------------------**  360 CONTINUE**     Drop-through = non-convergence*  370 CONTINUE*     ---------------------- Begin Timing Code -------------------------      OPS = OPS + OPST      OPST = ZERO*     ----------------------- End Timing Code --------------------------*      INFO = ILAST      GO TO 420**     Successful completion of all QZ steps*  380 CONTINUE**     Set Eigenvalues 1:ILO-1*      DO 410 J = 1, ILO - 1         IF( B( J, J ).LT.ZERO ) THEN            IF( ILSCHR ) THEN               DO 390 JR = 1, J                  A( JR, J ) = -A( JR, J )                  B( JR, J ) = -B( JR, J )  390          CONTINUE            ELSE               A( J, J ) = -A( J, J )               B( J, J ) = -B( J, J )            END IF            IF( ILZ ) THEN               DO 400 JR = 1, N                  Z( JR, J ) = -Z( JR, J )  400          CONTINUE            END IF         END IF         ALPHAR( J ) = A( J, J )         ALPHAI( J ) = ZERO         BETA( J ) = B( J, J )  410 CONTINUE**     Normal Termination*      INFO = 0**     Exit (other than argument error) -- return optimal workspace size*  420 CONTINUE**     ---------------------- Begin Timing Code -------------------------      OPS = OPS + OPST      OPST = ZERO      ITCNT = JITER*     ----------------------- End Timing Code --------------------------*      WORK( 1 ) = REAL( N )      RETURN**     End of SHGEQZ*      END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -