123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273 |
- *DECK LSSUDS
- SUBROUTINE LSSUDS (A, X, B, N, M, NRDA, U, NRDU, IFLAG, MLSO,
- + IRANK, ISCALE, Q, DIAG, KPIVOT, S, DIV, TD, ISFLG, SCALES)
- C***BEGIN PROLOGUE LSSUDS
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to BVSUP
- C***LIBRARY SLATEC
- C***TYPE SINGLE PRECISION (LSSUDS-S, DLSSUD-D)
- C***AUTHOR Watts, H. A., (SNLA)
- C***DESCRIPTION
- C
- C LSSUDS solves the underdetermined system of equations A Z = B,
- C where A is N by M and N .LE. M. In particular, if rank A equals
- C IRA, a vector X and a matrix U are determined such that X is the
- C UNIQUE solution of smallest length, satisfying A X = B, and the
- C columns of U form an orthonormal basis for the null space of A,
- C satisfying A U = 0 . Then all solutions Z are given by
- C Z = X + C(1)*U(1) + ..... + C(M-IRA)*U(M-IRA)
- C where U(J) represents the J-th column of U and the C(J) are
- C arbitrary constants.
- C If the system of equations are not compatible, only the least
- C squares solution of minimal length is computed.
- C
- C *********************************************************************
- C INPUT
- C *********************************************************************
- C
- C A -- Contains the matrix of N equations in M unknowns, A remains
- C unchanged, must be dimensioned NRDA by M.
- C X -- Solution array of length at least M.
- C B -- Given constant vector of length N, B remains unchanged.
- C N -- Number of equations, N greater or equal to 1.
- C M -- Number of unknowns, M greater or equal to N.
- C NRDA -- Row dimension of A, NRDA greater or equal to N.
- C U -- Matrix used for solution, must be dimensioned NRDU by
- C (M - rank of A).
- C (storage for U may be ignored when only the minimal length
- C solution X is desired)
- C NRDU -- Row dimension of U, NRDU greater or equal to M.
- C (if only the minimal length solution is wanted,
- C NRDU=0 is acceptable)
- C IFLAG -- Status indicator
- C =0 for the first call (and for each new problem defined by
- C a new matrix A) when the matrix data is treated as exact
- C =-K for the first call (and for each new problem defined by
- C a new matrix A) when the matrix data is assumed to be
- C accurate to about K digits.
- C =1 for subsequent calls whenever the matrix A has already
- C been decomposed (problems with new vectors B but
- C same matrix A can be handled efficiently).
- C MLSO -- =0 if only the minimal length solution is wanted.
- C =1 if the complete solution is wanted, includes the
- C linear space defined by the matrix U.
- C IRANK -- Variable used for the rank of A, set by the code.
- C ISCALE -- Scaling indicator
- C =-1 if the matrix A is to be pre-scaled by
- C columns when appropriate.
- C If the scaling indicator is not equal to -1
- C no scaling will be attempted.
- C For most problems scaling will probably not be necessary.
- C Q -- Matrix used for the transformation, must be dimensioned
- C NRDA by M.
- C DIAG,KPIVOT,S, -- Arrays of length at least N used for internal
- C DIV,TD,SCALES storage (except for SCALES which is M).
- C ISFLG -- Storage for an internal variable.
- C
- C *********************************************************************
- C OUTPUT
- C *********************************************************************
- C
- C IFLAG -- Status indicator
- C =1 if solution was obtained.
- C =2 if improper input is detected.
- C =3 if rank of matrix is less than N.
- C To continue, simply reset IFLAG=1 and call LSSUDS again.
- C =4 if the system of equations appears to be inconsistent.
- C However, the least squares solution of minimal length
- C was obtained.
- C X -- Minimal length least squares solution of A Z = B
- C IRANK -- Numerically determined rank of A, must not be altered
- C on succeeding calls with input values of IFLAG=1.
- C U -- Matrix whose M-IRANK columns are mutually orthogonal unit
- C vectors which span the null space of A. This is to be ignored
- C when MLSO was set to zero or IFLAG=4 on output.
- C Q -- Contains the strictly upper triangular part of the reduced
- C matrix and transformation information.
- C DIAG -- Contains the diagonal elements of the triangular reduced
- C matrix.
- C KPIVOT -- Contains the pivotal information. The row interchanges
- C performed on the original matrix are recorded here.
- C S -- Contains the solution of the lower triangular system.
- C DIV,TD -- Contains transformation information for rank
- C deficient problems.
- C SCALES -- Contains the column scaling parameters.
- C
- C *********************************************************************
- C
- C***SEE ALSO BVSUP
- C***REFERENCES H. A. Watts, Solving linear least squares problems
- C using SODS/SUDS/CODS, Sandia Report SAND77-0683,
- C Sandia Laboratories, 1977.
- C***ROUTINES CALLED J4SAVE, OHTROL, ORTHOR, R1MACH, SDOT, XERMAX,
- C XERMSG, XGETF, XSETF
- C***REVISION HISTORY (YYMMDD)
- C 750601 DATE WRITTEN
- C 890531 Changed all specific intrinsics to generic. (WRB)
- C 890831 Modified array declarations. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
- C 900328 Added TYPE section. (WRB)
- C 900510 Fixed an error message. (RWC)
- C 910408 Updated the AUTHOR and REFERENCES sections. (WRB)
- C 920501 Reformatted the REFERENCES section. (WRB)
- C***END PROLOGUE LSSUDS
- DIMENSION A(NRDA,*),X(*),B(*),U(NRDU,*),Q(NRDA,*),
- 1 DIAG(*),KPIVOT(*),S(*),DIV(*),TD(*),SCALES(*)
- C
- C **********************************************************************
- C
- C MACHINE PRECISION (COMPUTER UNIT ROUNDOFF VALUE) IS DEFINED
- C BY THE FUNCTION R1MACH.
- C
- C***FIRST EXECUTABLE STATEMENT LSSUDS
- URO = R1MACH(4)
- C
- C **********************************************************************
- C
- IF (N .LT. 1 .OR. M .LT. N .OR. NRDA .LT. N) GO TO 1
- IF (NRDU .NE. 0 .AND. NRDU .LT. M) GO TO 1
- IF (IFLAG .LE. 0) GO TO 5
- IF (IFLAG .EQ. 1) GO TO 25
- C
- C INVALID INPUT FOR LSSUDS
- 1 IFLAG=2
- CALL XERMSG ('SLATEC', 'LSSUDS', 'INVALID INPUT PARAMETERS.', 2,
- + 1)
- RETURN
- C
- 5 CALL XGETF(NFATAL)
- MAXMES = J4SAVE (4,0,.FALSE.)
- ISFLG=-15
- IF (IFLAG .EQ. 0) GO TO 7
- ISFLG=IFLAG
- NFAT = -1
- IF (NFATAL .EQ. 0) NFAT=0
- CALL XSETF(NFAT)
- CALL XERMAX(1)
- C
- C COPY MATRIX A INTO MATRIX Q
- C
- 7 DO 10 K=1,M
- DO 10 J=1,N
- 10 Q(J,K)=A(J,K)
- C
- C USE ORTHOGONAL TRANSFORMATIONS TO REDUCE Q TO LOWER
- C TRIANGULAR FORM
- C
- CALL ORTHOR(Q,N,M,NRDA,IFLAG,IRANK,ISCALE,DIAG,KPIVOT,SCALES,
- 1 DIV,TD)
- C
- CALL XSETF(NFATAL)
- CALL XERMAX(MAXMES)
- IF (IRANK .EQ. N) GO TO 15
- C
- C FOR RANK DEFICIENT PROBLEMS USE ADDITIONAL ORTHOGONAL
- C TRANSFORMATIONS TO FURTHER REDUCE Q
- C
- IF (IRANK .NE. 0) CALL OHTROL(Q,N,NRDA,DIAG,IRANK,DIV,TD)
- RETURN
- C
- C STORE DIVISORS FOR THE TRIANGULAR SOLUTION
- C
- 15 DO 20 K=1,N
- 20 DIV(K)=DIAG(K)
- C
- C
- 25 IF (IRANK .GT. 0) GO TO 40
- C
- C SPECIAL CASE FOR THE NULL MATRIX
- DO 35 K=1,M
- X(K)=0.
- IF (MLSO .EQ. 0) GO TO 35
- U(K,K)=1.
- DO 30 J=1,M
- IF (J .EQ. K) GO TO 30
- U(J,K)=0.
- 30 CONTINUE
- 35 CONTINUE
- DO 37 K=1,N
- IF (B(K) .GT. 0.) IFLAG=4
- 37 CONTINUE
- RETURN
- C
- C COPY CONSTANT VECTOR INTO S AFTER FIRST INTERCHANGING
- C THE ELEMENTS ACCORDING TO THE PIVOTAL SEQUENCE
- C
- 40 DO 45 K=1,N
- KP=KPIVOT(K)
- 45 X(K)=B(KP)
- DO 50 K=1,N
- 50 S(K)=X(K)
- C
- IRP=IRANK+1
- NU=1
- IF (MLSO .EQ. 0) NU=0
- IF (IRANK .EQ. N) GO TO 60
- C
- C FOR RANK DEFICIENT PROBLEMS WE MUST APPLY THE
- C ORTHOGONAL TRANSFORMATION TO S
- C WE ALSO CHECK TO SEE IF THE SYSTEM APPEARS TO BE INCONSISTENT
- C
- NMIR=N-IRANK
- SS=SDOT(N,S(1),1,S(1),1)
- DO 55 L=1,IRANK
- K=IRP-L
- GAM=((TD(K)*S(K))+SDOT(NMIR,Q(IRP,K),1,S(IRP),1))/
- 1 (TD(K)*DIV(K))
- S(K)=S(K)+GAM*TD(K)
- DO 55 J=IRP,N
- 55 S(J)=S(J)+GAM*Q(J,K)
- RES=SDOT(NMIR,S(IRP),1,S(IRP),1)
- IF (RES .LE. SS*(10.*MAX(10.**ISFLG,10.*URO))**2) GO TO 60
- C
- C INCONSISTENT SYSTEM
- IFLAG=4
- NU=0
- C
- C APPLY FORWARD SUBSTITUTION TO SOLVE LOWER TRIANGULAR SYSTEM
- C
- 60 S(1)=S(1)/DIV(1)
- IF (IRANK .EQ. 1) GO TO 70
- DO 65 K=2,IRANK
- 65 S(K)=(S(K)-SDOT(K-1,Q(K,1),NRDA,S(1),1))/DIV(K)
- C
- C INITIALIZE X VECTOR AND THEN APPLY ORTHOGONAL TRANSFORMATION
- C
- 70 DO 75 K=1,M
- X(K)=0.
- IF (K .LE. IRANK) X(K)=S(K)
- 75 CONTINUE
- C
- DO 80 JR=1,IRANK
- J=IRP-JR
- MJ=M-J+1
- GAMMA=SDOT(MJ,Q(J,J),NRDA,X(J),1)/(DIAG(J)*Q(J,J))
- DO 80 K=J,M
- 80 X(K)=X(K)+GAMMA*Q(J,K)
- C
- C RESCALE ANSWERS AS DICTATED
- C
- DO 85 K=1,M
- 85 X(K)=X(K)*SCALES(K)
- C
- IF ((NU .EQ. 0) .OR. (M .EQ. IRANK)) RETURN
- C
- C INITIALIZE U MATRIX AND THEN APPLY ORTHOGONAL TRANSFORMATION
- C
- L=M-IRANK
- DO 100 K=1,L
- DO 90 I=1,M
- U(I,K)=0.
- IF (I .EQ. IRANK+K) U(I,K)=1.
- 90 CONTINUE
- C
- DO 100 JR=1,IRANK
- J=IRP-JR
- MJ=M-J+1
- GAMMA=SDOT(MJ,Q(J,J),NRDA,U(J,K),1)/(DIAG(J)*Q(J,J))
- DO 100 I=J,M
- 100 U(I,K)=U(I,K)+GAMMA*Q(J,I)
- C
- RETURN
- END
|