home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / FORTRAN / LLSQ.ZIP / SVA.FOR < prev    next >
Encoding:
Text File  |  1984-02-23  |  15.5 KB  |  194 lines

  1.       SUBROUTINE SVA (A,MDA,M,N,MDATA,B,SING,NAMES,ISCALE,D)            SVA00100
  2. C     C.L.LAWSON AND R.J.HANSON, JET PROPULSION LABORATORY, 1973 JUN 12 SVA00200
  3. C     TO APPEAR IN 'SOLVING LEAST SQUARES PROBLEMS', PRENTICE-HALL, 1974SVA00300
  4. C               SINGULAR VALUE ANALYSIS PRINTOUT                        SVA00400
  5. C                                                                       SVA00500
  6. C     ISCALE       SET BY USER TO 1, 2, OR 3 TO SELECT COLUMN SCALING   SVA00600
  7. C                  OPTION.                                              SVA00700
  8. C                  1   SUBR WILL USE IDENTITY SCALING AND IGNORE THE D()SVA00800
  9. C                      ARRAY.                                           SVA00900
  10. C                  2   SUBR WILL SCALE NONZERO COLS TO HAVE UNIT EUCLIDESVA01000
  11. C                      LENGTH AND WILL STORE RECIPROCAL LENGTHS OF      SVA01100
  12. C                      ORIGINAL NONZERO COLS IN D().                    SVA01200
  13. C                  3   USER SUPPLIES COL SCALE FACTORS IN D(). SUBR     SVA01300
  14. C                      WILL MULT COL J BY D(J) AND REMOVE THE SCALING   SVA01400
  15. C                      FROM THE SOLN AT THE END.                        SVA01500
  16. C                                                                       SVA01600
  17.       DIMENSION  A(MDA,N), B(M), SING(01),D(N)                          SVA01700
  18. C     SING(3*N)                                                         SVA01800
  19.       DIMENSION NAMES(N)                                                SVA01900
  20.       LOGICAL TEST                                                      SVA02000
  21.       DOUBLE PRECISION   SB, DZERO                                      SVA02100
  22.       DZERO=0.D0                                                        SVA02200
  23.       ONE=1.                                                            SVA02300
  24.       ZERO=0.                                                           SVA02400
  25.       IF (M.LE.0 .OR. N.LE.0) RETURN                                    SVA02500
  26.       NP1=N+1                                                           SVA02600
  27.       WRITE (6,270)                                                     SVA02700
  28.       WRITE (6,260) M,N,MDATA                                           SVA02800
  29.       GO TO (60,10,10), ISCALE                                          SVA02900
  30. C                                                                       SVA03000
  31. C     APPLY COLUMN SCALING TO A                                         SVA03100
  32. C                                                                       SVA03200
  33.    10      DO 50 J=1,N                                                  SVA03300
  34.            A1=D(J)                                                      SVA03400
  35.            GO TO (20,20,40), ISCALE                                     SVA03500
  36.    20      SB=DZERO                                                     SVA03600
  37.                 DO 30 I=1,M                                             SVA03700
  38.    30           SB=SB+DBLE(A(I,J))**2                                   SVA03800
  39.            A1=DSQRT(SB)                                                 SVA03900
  40.            IF (A1.EQ.ZERO) A1=ONE                                       SVA04000
  41.            A1=ONE/A1                                                    SVA04100
  42.            D(J)=A1                                                      SVA04200
  43.    40           DO 50 I=1,M                                             SVA04300
  44.    50           A(I,J)=A(I,J)*A1                                        SVA04400
  45.       WRITE (6,280) ISCALE,(D(J),J=1,N)                                 SVA04500
  46.       GO TO 70                                                          SVA04600
  47.    60 CONTINUE                                                          SVA04700
  48.       WRITE (6,290)                                                     SVA04800
  49.    70 CONTINUE                                                          SVA04900
  50. C                                                                       SVA05000
  51. C     OBTAIN  SING. VALUE DECOMP. OF SCALED MATRIX.                     SVA05100
  52. C                                                                       SVA05200
  53. C**********************************************************             SVA05300
  54.       CALL SVDRS (A,MDA,M,N,B,1,1,SING)                                 SVA05400
  55. C**********************************************************             SVA05500
  56. C                                                                       SVA05600
  57. C     PRINT THE V MATRIX.                                               SVA05700
  58. C                                                                       SVA05800
  59.       CALL MFEOUT (A,MDA,N,N,NAMES,1)                                   SVA05900
  60.       IF (ISCALE.EQ.1) GO TO 90                                         SVA06000
  61. C                                                                       SVA06100
  62. C     REPLACE V BY D*V IN THE ARRAY A()                                 SVA06200
  63. C                                                                       SVA06300
  64.            DO 80 I=1,N                                                  SVA06400
  65.                 DO 80 J=1,N                                             SVA06500
  66.    80           A(I,J)=D(I)*A(I,J)                                      SVA06600
  67. C                                                                       SVA06700
  68. C     G  NOW IN  B ARRAY.  V NOW IN A ARRAY.                            SVA06800
  69. C                                                                       SVA06900
  70. C                                                                       SVA07000
  71. C     OBTAIN SUMMARY OUTPUT.                                            SVA07100
  72. C                                                                       SVA07200
  73.    90 CONTINUE                                                          SVA07300
  74.       WRITE (6,220)                                                     SVA07400
  75. C                                                                       SVA07500
  76. C     COMPUTE CUMULATIVE SUMS OF SQUARES OF COMPONENTS OF               SVA07600
  77. C     G AND STORE THEM IN SING(I), I=MINMN+1,...,2*MINMN+1              SVA07700
  78. C                                                                       SVA07800
  79.       SB=DZERO                                                          SVA07900
  80.       MINMN=MIN0(M,N)                                                   SVA08000
  81.       MINMN1=MINMN+1                                                    SVA08100
  82.       IF (M.EQ.MINMN) GO TO 110                                         SVA08200
  83.            DO 100 I=MINMN1,M                                            SVA08300
  84.   100      SB=SB+DBLE(B(I))**2                                          SVA08400
  85.   110 SING(2*MINMN+1)=SB                                                SVA08500
  86.            DO 120 JJ=1,MINMN                                            SVA08600
  87.            J=MINMN+1-JJ                                                 SVA08700
  88.            SB=SB+DBLE(B(J))**2                                          SVA08800
  89.            JS=MINMN+J                                                   SVA08900
  90.   120      SING(JS)=SB                                                  SVA09000
  91.       A3=SING(MINMN+1)                                                  SVA09100
  92.       A4=SQRT(A3/FLOAT(MAX0(1,MDATA)))                                  SVA09200
  93.       WRITE (6,230) A3,A4                                               SVA09300
  94. C                                                                       SVA09400
  95.       NSOL=0                                                            SVA09500
  96. C                                                                       SVA09600
  97. C                                                                       SVA09700
  98. C                                                                       SVA09800
  99.            DO 160 K=1,MINMN                                             SVA09900
  100.            IF (SING(K).EQ.ZERO) GO TO 130                               SVA10000
  101.            NSOL=K                                                       SVA10100
  102.            PI=B(K)/SING(K)                                              SVA10200
  103.            A1=ONE/SING(K)                                               SVA10300
  104.            A2=B(K)**2                                                   SVA10400
  105.            A3=SING(MINMN1+K)                                            SVA10500
  106.            A4=SQRT(A3/FLOAT(MAX0(1,MDATA-K)))                           SVA10600
  107.            TEST=SING(K).GE.100..OR.SING(K).LT..001                      SVA10700
  108.            IF (TEST) WRITE (6,240) K,SING(K),PI,A1,B(K),A2,A3,A4        SVA10800
  109.            IF (.NOT.TEST) WRITE (6,250) K,SING(K),PI,A1,B(K),A2,A3,A4   SVA10900
  110.            GO TO 140                                                    SVA11000
  111.   130      WRITE (6,240) K,SING(K)                                      SVA11100
  112.            PI=ZERO                                                      SVA11200
  113.   140           DO 150 I=1,N                                            SVA11300
  114.                 A(I,K)=A(I,K)*PI                                        SVA11400
  115.   150           IF (K.GT.1) A(I,K)=A(I,K)+A(I,K-1)                      SVA11500
  116.   160      CONTINUE                                                     SVA11600
  117. C                                                                       SVA11700
  118. C     COMPUTE AND PRINT VALUES OF YNORM AND RNORM.                      SVA11800
  119. C                                                                       SVA11900
  120.       WRITE (6,300)                                                     SVA12000
  121.       J=0                                                               SVA12100
  122.       YSQ=ZERO                                                          SVA12200
  123.       GO TO 180                                                         SVA12300
  124.   170 J=J+1                                                             SVA12400
  125.       YSQ=YSQ+(B(J)/SING(J))**2                                         SVA12500
  126.   180 YNORM=SQRT(YSQ)                                                   SVA12600
  127.       JS=MINMN1+J                                                       SVA12700
  128.       RNORM=SQRT(SING(JS))                                              SVA12800
  129.       YL=-1000.                                                         SVA12900
  130.       IF (YNORM.GT.0.) YL=ALOG10(YNORM)                                 SVA13000
  131.       RL=-1000.                                                         SVA13100
  132.       IF (RNORM.GT.0.) RL=ALOG10(RNORM)                                 SVA13200
  133.       WRITE (6,310) J,YNORM,RNORM,YL,RL                                 SVA13300
  134.       IF (J.LT.NSOL) GO TO 170                                          SVA13400
  135. C                                                                       SVA13500
  136. C     COMPUTE VALUES OF XNORM AND RNORM FOR A SEQUENCE OF VALUES OF     SVA13600
  137. C     THE LEVENBERG-MARQUARDT PARAMETER.                                SVA13700
  138. C                                                                       SVA13800
  139.       IF (SING(1).EQ.ZERO) GO TO 210                                    SVA13900
  140.       EL=ALOG10(SING(1))+ONE                                            SVA14000
  141.       EL2=ALOG10(SING(NSOL))-ONE                                        SVA14100
  142.       DEL=(EL2-EL)/20.                                                  SVA14200
  143.       TEN=10.                                                           SVA14300
  144.       ALN10=ALOG(TEN)                                                   SVA14400
  145.       WRITE (6,320)                                                     SVA14500
  146.            DO 200 IE=1,21                                               SVA14600
  147. C     COMPUTE        ALAMB=10.**EL                                      SVA14700
  148.            ALAMB=EXP(ALN10*EL)                                          SVA14800
  149.            YS=0.                                                        SVA14900
  150.            JS=MINMN1+NSOL                                               SVA15000
  151.            RS=SING(JS)                                                  SVA15100
  152.                 DO 190 I=1,MINMN                                        SVA15200
  153.                 SL=SING(I)**2+ALAMB**2                                  SVA15300
  154.                 YS=YS+(B(I)*SING(I)/SL)**2                              SVA15400
  155.                 RS=RS+(B(I)*(ALAMB**2)/SL)**2                           SVA15500
  156.   190           CONTINUE                                                SVA15600
  157.            YNORM=SQRT(YS)                                               SVA15700
  158.            RNORM=SQRT(RS)                                               SVA15800
  159.            RL=-1000.                                                    SVA15900
  160.            IF (RNORM.GT.ZERO) RL=ALOG10(RNORM)                          SVA16000
  161.            YL=-1000.                                                    SVA16100
  162.            IF (YNORM.GT.ZERO) YL=ALOG10(YNORM)                          SVA16200
  163.            WRITE (6,330) ALAMB,YNORM,RNORM,EL,YL,RL                     SVA16300
  164.            EL=EL+DEL                                                    SVA16400
  165.   200      CONTINUE                                                     SVA16500
  166. C                                                                       SVA16600
  167. C     PRINT CANDIDATE SOLUTIONS.                                        SVA16700
  168. C                                                                       SVA16800
  169.   210 IF (NSOL.GE.1) CALL MFEOUT (A,MDA,N,NSOL,NAMES,2)                 SVA16900
  170.       RETURN                                                            SVA17000
  171.   220 FORMAT (42H0 INDEX  SING. VALUE       P COEF         ,48HRECIP. S.SVA17100
  172.      1V.             G COEF            G**2  ,39H            C.S.S.     SVA17200
  173.      2    N.S.R.C.S.S.)                                                 SVA17300
  174.   230 FORMAT (1H ,5X,1H0,88X,1PE15.4,1PE17.4)                           SVA17400
  175.   240 FORMAT (1H ,I6,E12.4,1P(E15.4,4X,E15.4,4X,E15.4,4X,E15.4,4X,E15.4,SVA17500
  176.      12X,E15.4))                                                        SVA17600
  177.   250 FORMAT (1H ,I6,F12.4,1P(E15.4,4X,E15.4,4X,E15.4,4X,E15.4,4X,E15.4,SVA17700
  178.      12X,E15.4))                                                        SVA17800
  179.   260 FORMAT (5H0M = ,I6,8H,   N = ,I4,12H,   MDATA = ,I8)              SVA17900
  180.   270 FORMAT (45H0SINGULAR VALUE ANALYSIS OF THE LEAST SQUARES,42H PROBLSVA18000
  181.      1EM,  A*X=B,  SCALED AS  (A*D)*Y=B  .)                             SVA18100
  182.   280 FORMAT (19H0SCALING OPTION NO.,I2,18H.  D IS A DIAGONAL,46H MATRIXSVA18200
  183.      1 WITH THE FOLLOWING DIAGONAL ELEMENTS../(5X,10E12.4))             SVA18300
  184.   290 FORMAT (50H0SCALING OPTION NO. 1.   D IS THE IDENTITY MATRIX./1X) SVA18400
  185.   300 FORMAT (6H0INDEX,13X,28H         YNORM         RNORM,14X,28H  LOG1SVA18500
  186.      10(YNORM)  LOG10(RNORM)/1X)                                        SVA18600
  187.   310 FORMAT (1H ,I4,14X,2E14.5,14X,2F14.5)                             SVA18700
  188.   320 FORMAT (54H0NORMS OF SOLUTION AND RESIDUAL VECTORS FOR A RANGE OF,SVA18800
  189.      144H VALUES OF THE LEVENBERG-MARQUARDT PARAMETER,9H, LAMBDA./1H0,4XSVA18900
  190.      2,42H        LAMBDA         YNORM         RNORM,42H LOG10(LAMBDA)  SVA19000
  191.      3LOG10(YNORM)  LOG10(RNORM))                                       SVA19100
  192.   330 FORMAT (5X,3E14.5,3F14.5)                                         SVA19200
  193.       END                                                               SVA19300
  194.