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

  1. C     PROG3                                                             PR300100
  2. C     C.L.LAWSON AND R.J.HANSON, JET PROPULSION LABORATORY, 1973 JUN 12 PR300200
  3. C     TO APPEAR IN 'SOLVING LEAST SQUARES PROBLEMS', PRENTICE-HALL, 1974PR300300
  4. C          DEMONSTRATE THE USE OF SUBROUTINE   SVDRS  TO COMPUTE THE    PR300400
  5. C     SINGULAR VALUE DECOMPOSITION OF A MATRIX, A, AND SOLVE A LEAST    PR300500
  6. C     SQUARES PROBLEM,  A*X=B.                                          PR300600
  7. C                                                                       PR300700
  8. C     THE S.V.D.  A= U*(S,0)**T*V**T IS                                 PR300800
  9. C     COMPUTED SO THAT..                                                PR300900
  10. C     (1)  U**T*B REPLACES THE M+1 ST. COL. OF  B.                      PR301000
  11. C                                                                       PR301100
  12. C     (2)  U**T   REPLACES THE M BY M IDENTITY IN                       PR301200
  13. C     THE FIRST M COLS. OF  B.                                          PR301300
  14. C                                                                       PR301400
  15. C     (3) V REPLACES THE FIRST N ROWS AND COLS.                         PR301500
  16. C     OF A.                                                             PR301600
  17. C                                                                       PR301700
  18. C     (4) THE DIAGONAL ENTRIES OF THE S MATRIX                          PR301800
  19. C     REPLACE THE FIRST N ENTRIES OF THE ARRAY S.                       PR301900
  20. C                                                                       PR302000
  21. C     THE ARRAY S( ) MUST BE DIMENSIONED AT LEAST 3*N .                 PR302100
  22. C                                                                       PR302200
  23.       DIMENSION A(8,8),B(8,9),S(24),X(8),AA(8,8)                        PR302300
  24.       REAL GEN,ANOISE                                                   PR302400
  25.       DOUBLE PRECISION SM                                               PR302500
  26.       DATA MDA,MDB/8,8/                                                 PR302600
  27. C                                                                       PR302700
  28.       DO 150 NOISE=1,2                                                  PR302800
  29.       ANOISE = 0.                                                       PR302900
  30.       RHO = 1.E-3                                                       PR303000
  31.       IF(NOISE .EQ. 1) GO TO 5                                          PR303100
  32.       ANOISE = 1.E-4                                                    PR303200
  33.       RHO = 10. * ANOISE                                                PR303300
  34.     5 CONTINUE                                                          PR303400
  35.       WRITE(6,230)                                                      PR303500
  36.       WRITE(6,240) ANOISE,RHO                                           PR303600
  37. C     INITIALIZE DATA GENERATION FUNCTION                               PR303700
  38. C    ..                                                                 PR303800
  39.       DUMMY= GEN(-1.)                                                   PR303900
  40. C                                                                       PR304000
  41.            DO 150 MN1=1,6,5                                             PR304100
  42.            MN2=MN1+2                                                    PR304200
  43.                 DO 150 M=MN1,MN2                                        PR304300
  44.                 DO 150 N=MN1,MN2                                        PR304400
  45.                 WRITE (6,160) M,N                                       PR304500
  46.                      DO 20 I=1,M                                        PR304600
  47.                           DO 10 J=1,M                                   PR304700
  48.    10                     B(I,J)=0.                                     PR304800
  49.                      B(I,I)=1.                                          PR304900
  50.                           DO 20 J=1,N                                   PR305000
  51.                           A(I,J)= GEN(ANOISE)                           PR305100
  52.    20                     AA(I,J)=A(I,J)                                PR305200
  53.                      DO 30 I=1,M                                        PR305300
  54.    30                B(I,M+1)= GEN(ANOISE)                              PR305400
  55. C                                                                       PR305500
  56. C     THE ARRAYS ARE NOW FILLED IN..                                    PR305600
  57. C     COMPUTE THE S.V.D.                                                PR305700
  58. C     ******************************************************            PR305800
  59.                 CALL SVDRS (A,MDA,M,N,B,MDB,M+1,S)                      PR305900
  60. C     ******************************************************            PR306000
  61. C                                                                       PR306100
  62.                 WRITE (6,170)                                           PR306200
  63.                 WRITE (6,220) (I,S(I),I=1,N)                            PR306300
  64.                 WRITE (6,180)                                           PR306400
  65.                 WRITE (6,220) (I,B(I,M+1),I=1,M)                        PR306500
  66. C                                                                       PR306600
  67. C     TEST FOR DISPARITY OF RATIO OF SINGULAR VALUES.                   PR306700
  68. C    ..                                                                 PR306800
  69.                 KRANK=N                                                 PR306900
  70.                 TAU=RHO*S(1)                                            PR307000
  71.                      DO 40 I=1,N                                        PR307100
  72.                      IF (S(I).LE.TAU) GO TO 50                          PR307200
  73.    40                CONTINUE                                           PR307300
  74.                 GO TO 55                                                PR307400
  75.    50           KRANK=I-1                                               PR307500
  76.    55 WRITE(6,250) TAU, KRANK                                           PR307600
  77. C     COMPUTE SOLUTION VECTOR ASSUMING PSEUDORANK IS KRANK              PR307700
  78. C     ..                                                                PR307800
  79.    60                DO 70 I=1,KRANK                                    PR307900
  80.    70                B(I,M+1)=B(I,M+1)/S(I)                             PR308000
  81.                      DO 90 I=1,N                                        PR308100
  82.                      SM=0.D0                                            PR308200
  83.                           DO 80 J=1,KRANK                               PR308300
  84.    80                     SM=SM+A(I,J)*DBLE(B(J,M+1))                   PR308400
  85.    90                X(I)=SM                                            PR308500
  86. C     COMPUTE PREDICTED NORM OF RESIDUAL VECTOR.                        PR308600
  87. C     ..                                                                PR308700
  88.                 SRSMSQ=0.                                               PR308800
  89.                 IF (KRANK.EQ.M) GO TO 110                               PR308900
  90.                 KP1=KRANK+1                                             PR309000
  91.                      DO 100 I=KP1,M                                     PR309100
  92.   100                SRSMSQ=SRSMSQ+B(I,M+1)**2                          PR309200
  93.                 SRSMSQ=SQRT(SRSMSQ)                                     PR309300
  94. C                                                                       PR309400
  95.   110           CONTINUE                                                PR309500
  96.                 WRITE (6,190)                                           PR309600
  97.                 WRITE (6,220) (I,X(I),I=1,N)                            PR309700
  98.                 WRITE (6,200) SRSMSQ                                    PR309800
  99. C     COMPUTE THE FROBENIUS NORM OF  A**T- V*(S,0)*U**T.                PR309900
  100. C                                                                       PR310000
  101. C     COMPUTE  V*S  FIRST.                                              PR310100
  102. C                                                                       PR310200
  103.                 MINMN=MIN0(M,N)                                         PR310250
  104.                      DO 120 J=1,MINMN                                   PR310300
  105.                           DO 120 I=1,N                                  PR310400
  106.   120                     A(I,J)=A(I,J)*S(J)                            PR310500
  107.                 DN=0.                                                   PR310600
  108.                      DO 140 J=1,M                                       PR310700
  109.                           DO 140 I=1,N                                  PR310800
  110.                           SM=0.D0                                       PR310900
  111.                                DO 130 L=1,MINMN                         PR311000
  112.   130                          SM=SM+A(I,L)*DBLE(B(L,J))                PR311100
  113. C     COMPUTED DIFFERENCE OF (I,J) TH ENTRY                             PR311200
  114. C     OF  A**T-V*(S,0)*U**T.                                            PR311300
  115. C     ..                                                                PR311400
  116.                           T=AA(J,I)-SM                                  PR311500
  117.   140                     DN=DN+T**2                                    PR311600
  118.                 DN=SQRT(DN)/(SQRT(FLOAT(N))*S(1))                       PR311700
  119.                 WRITE (6,210) DN                                        PR311800
  120.   150           CONTINUE                                                PR311900
  121.       STOP                                                              PR312000
  122.   160 FORMAT (1H0////9H0   M   N/1X,2I4)                                PR312100
  123.   170 FORMAT (1H0,8X,25HSINGULAR VALUES OF MATRIX)                      PR312200
  124.   180 FORMAT (1H0,8X,30HTRANSFORMED RIGHT SIDE, U**T*B)                 PR312300
  125.   190 FORMAT (1H0,8X,33HESTIMATED PARAMETERS,  X=A**(+)*B,21H COMPUTED BPR312400
  126.      1Y 'SVDRS' )                                                       PR312500
  127.   200 FORMAT (1H0,8X,24HRESIDUAL VECTOR LENGTH =,E12.4)                 PR312600
  128.   210 FORMAT (1H0,8X,43HFROBENIUS NORM (A-U*(S,0)**T*V**T)/(SQRT(N),    PR312700
  129.      *22H*SPECTRAL NORM OF A) =,E12.4)                                  PR312800
  130.   220 FORMAT (9X,I5,E16.8,I5,E16.8,I5,E16.8,I5,E16.8,I5,E16.8)          PR312900
  131.   230 FORMAT(51H1PROG3.     THIS PROGRAM DEMONSTRATES THE ALGORITHM,    PR313000
  132.      * 9H, SVDRS. )                                                     PR313100
  133.   240 FORMAT(55H0THE RELATIVE NOISE LEVEL OF THE GENERATED DATA WILL BE,PR313200
  134.      *E16.4/44H0THE RELATIVE TOLERANCE, RHO, FOR PSEUDORANK,            PR313300
  135.      *17H DETERMINATION IS,E16.4)                                       PR313400
  136.   250 FORMAT(1H0,8X,36HABSOLUTE PSEUDORANK TOLERANCE, TAU =,            PR313500
  137.      *E12.4,10X,12HPSEUDORANK =,I5)                                     PR313600
  138.       END                                                               PR313700
  139.