home *** CD-ROM | disk | FTP | other *** search
- SUBROUTINE HFTI (A,MDA,M,N,B,MDB,NB,TAU,KRANK,RNORM,H,G,IP) HFT00100
- C C.L.LAWSON AND R.J.HANSON, JET PROPULSION LABORATORY, 1973 JUN 12 HFT00200
- C TO APPEAR IN 'SOLVING LEAST SQUARES PROBLEMS', PRENTICE-HALL, 1974HFT00300
- C SOLVE LEAST SQUARES PROBLEM USING ALGORITHM, HFTI. HFT00400
- C HFT00500
- DIMENSION A(MDA,N),B(MDB,NB),H(N),G(N),RNORM(NB) HFT00600
- INTEGER IP(N) HFT00700
- DOUBLE PRECISION SM,DZERO HFT00800
- SZERO=0. HFT00900
- DZERO=0.D0 HFT01000
- FACTOR=0.001 HFT01100
- C HFT01200
- K=0 HFT01300
- LDIAG=MIN0(M,N) HFT01400
- IF (LDIAG.LE.0) GO TO 270 HFT01500
- DO 80 J=1,LDIAG HFT01600
- IF (J.EQ.1) GO TO 20 HFT01700
- C HFT01800
- C UPDATE SQUARED COLUMN LENGTHS AND FIND LMAX HFT01900
- C .. HFT02000
- LMAX=J HFT02100
- DO 10 L=J,N HFT02200
- H(L)=H(L)-A(J-1,L)**2 HFT02300
- IF (H(L).GT.H(LMAX)) LMAX=L HFT02400
- 10 CONTINUE HFT02500
- IF(DIFF(HMAX+FACTOR*H(LMAX),HMAX)) 20,20,50 HFT02600
- C HFT02700
- C COMPUTE SQUARED COLUMN LENGTHS AND FIND LMAX HFT02800
- C .. HFT02900
- 20 LMAX=J HFT03000
- DO 40 L=J,N HFT03100
- H(L)=0. HFT03200
- DO 30 I=J,M HFT03300
- 30 H(L)=H(L)+A(I,L)**2 HFT03400
- IF (H(L).GT.H(LMAX)) LMAX=L HFT03500
- 40 CONTINUE HFT03600
- HMAX=H(LMAX) HFT03700
- C .. HFT03800
- C LMAX HAS BEEN DETERMINED HFT03900
- C HFT04000
- C DO COLUMN INTERCHANGES IF NEEDED. HFT04100
- C .. HFT04200
- 50 CONTINUE HFT04300
- IP(J)=LMAX HFT04400
- IF (IP(J).EQ.J) GO TO 70 HFT04500
- DO 60 I=1,M HFT04600
- TMP=A(I,J) HFT04700
- A(I,J)=A(I,LMAX) HFT04800
- 60 A(I,LMAX)=TMP HFT04900
- H(LMAX)=H(J) HFT05000
- C HFT05100
- C COMPUTE THE J-TH TRANSFORMATION AND APPLY IT TO A AND B. HFT05200
- C .. HFT05300
- 70 CALL H12 (1,J,J+1,M,A(1,J),1,H(J),A(1,J+1),1,MDA,N-J) HFT05400
- 80 CALL H12 (2,J,J+1,M,A(1,J),1,H(J),B,1,MDB,NB) HFT05500
- C HFT05600
- C DETERMINE THE PSEUDORANK, K, USING THE TOLERANCE, TAU. HFT05700
- C .. HFT05800
- DO 90 J=1,LDIAG HFT05900
- IF (ABS(A(J,J)).LE.TAU) GO TO 100 HFT06000
- 90 CONTINUE HFT06100
- K=LDIAG HFT06200
- GO TO 110 HFT06300
- 100 K=J-1 HFT06400
- 110 KP1=K+1 HFT06500
- C HFT06600
- C COMPUTE THE NORMS OF THE RESIDUAL VECTORS. HFT06700
- C HFT06800
- IF (NB.LE.0) GO TO 140 HFT06900
- DO 130 JB=1,NB HFT07000
- TMP=SZERO HFT07100
- IF (KP1.GT.M) GO TO 130 HFT07200
- DO 120 I=KP1,M HFT07300
- 120 TMP=TMP+B(I,JB)**2 HFT07400
- 130 RNORM(JB)=SQRT(TMP) HFT07500
- 140 CONTINUE HFT07600
- C SPECIAL FOR PSEUDORANK = 0 HFT07700
- IF (K.GT.0) GO TO 160 HFT07800
- IF (NB.LE.0) GO TO 270 HFT07900
- DO 150 JB=1,NB HFT08000
- DO 150 I=1,N HFT08100
- 150 B(I,JB)=SZERO HFT08200
- GO TO 270 HFT08300
- C HFT08400
- C IF THE PSEUDORANK IS LESS THAN N COMPUTE HOUSEHOLDER HFT08500
- C DECOMPOSITION OF FIRST K ROWS. HFT08600
- C .. HFT08700
- 160 IF (K.EQ.N) GO TO 180 HFT08800
- DO 170 II=1,K HFT08900
- I=KP1-II HFT09000
- 170 CALL H12 (1,I,KP1,N,A(I,1),MDA,G(I),A,MDA,1,I-1) HFT09100
- 180 CONTINUE HFT09200
- C HFT09300
- C HFT09400
- IF (NB.LE.0) GO TO 270 HFT09500
- DO 260 JB=1,NB HFT09600
- C HFT09700
- C SOLVE THE K BY K TRIANGULAR SYSTEM. HFT09800
- C .. HFT09900
- DO 210 L=1,K HFT10000
- SM=DZERO HFT10100
- I=KP1-L HFT10200
- IF (I.EQ.K) GO TO 200 HFT10300
- IP1=I+1 HFT10400
- DO 190 J=IP1,K HFT10500
- 190 SM=SM+A(I,J)*DBLE(B(J,JB)) HFT10600
- 200 SM1=SM HFT10700
- 210 B(I,JB)=(B(I,JB)-SM1)/A(I,I) HFT10800
- C HFT10900
- C COMPLETE COMPUTATION OF SOLUTION VECTOR. HFT11000
- C .. HFT11100
- IF (K.EQ.N) GO TO 240 HFT11200
- DO 220 J=KP1,N HFT11300
- 220 B(J,JB)=SZERO HFT11400
- DO 230 I=1,K HFT11500
- 230 CALL H12 (2,I,KP1,N,A(I,1),MDA,G(I),B(1,JB),1,MDB,1) HFT11600
- C HFT11700
- C RE-ORDER THE SOLUTION VECTOR TO COMPENSATE FOR THE HFT11800
- C COLUMN INTERCHANGES. HFT11900
- C .. HFT12000
- 240 DO 250 JJ=1,LDIAG HFT12100
- J=LDIAG+1-JJ HFT12200
- IF (IP(J).EQ.J) GO TO 250 HFT12300
- L=IP(J) HFT12400
- TMP=B(L,JB) HFT12500
- B(L,JB)=B(J,JB) HFT12600
- B(J,JB)=TMP HFT12700
- 250 CONTINUE HFT12800
- 260 CONTINUE HFT12900
- C .. HFT13000
- C THE SOLUTION VECTORS, X, ARE NOW HFT13100
- C IN THE FIRST N ROWS OF THE ARRAY B(,). HFT13200
- C HFT13300
- 270 KRANK=K HFT13400
- RETURN HFT13500
- END HFT13600