* F08KNF Example Program Text * Mark 21 Release. NAG Copyright 2004. * .. Parameters .. INTEGER NIN, NOUT PARAMETER (NIN=5,NOUT=6) INTEGER MMAX, NB, NMAX PARAMETER (MMAX=16,NB=64,NMAX=8) INTEGER LDA, LWORK PARAMETER (LDA=MMAX,LWORK=2*NMAX+NB*(MMAX+NMAX)) * .. Local Scalars .. DOUBLE PRECISION RCOND, RNORM INTEGER I, INFO, J, M, N, RANK * .. Local Arrays .. COMPLEX *16 A(LDA,NMAX), B(MMAX), WORK(LWORK) DOUBLE PRECISION RWORK(5*NMAX), S(NMAX) * .. External Functions .. DOUBLE PRECISION DZNRM2 EXTERNAL DZNRM2 * .. External Subroutines .. EXTERNAL ZGELSS * .. Executable Statements .. WRITE (NOUT,*) 'F08KNF Example Program Results' WRITE (NOUT,*) * Skip heading in data file READ (NIN,*) READ (NIN,*) M, N IF (M.LE.MMAX .AND. N.LE.NMAX .AND. M.GE.N) THEN * * Read A and B from data file * READ (NIN,*) ((A(I,J),J=1,N),I=1,M) READ (NIN,*) (B(I),I=1,M) * * Choose RCOND to reflect the relative accuracy of the input data * RCOND = 0.01D0 * * Solve the least squares problem min( norm2(b - Ax) ) for the x * of minimum norm. * CALL ZGELSS(M,N,1,A,LDA,B,M,S,RCOND,RANK,WORK,LWORK,RWORK,INFO) * IF (INFO.EQ.0) THEN * * Print solution * WRITE (NOUT,*) 'Least squares solution' WRITE (NOUT,99999) (B(I),I=1,N) * * Print the effective rank of A * WRITE (NOUT,*) WRITE (NOUT,*) 'Tolerance used to estimate the rank of A' WRITE (NOUT,99998) RCOND WRITE (NOUT,*) 'Estimated rank of A' WRITE (NOUT,99997) RANK * * Print singular values of A * WRITE (NOUT,*) WRITE (NOUT,*) 'Singular values of A' WRITE (NOUT,99996) (S(I),I=1,N) * * Compute and print estimate of the square root of the * residual sum of squares * IF (RANK.EQ.N) THEN RNORM = DZNRM2(M-N,B(N+1),1) WRITE (NOUT,*) WRITE (NOUT,*) + 'Square root of the residual sum of squares' WRITE (NOUT,99998) RNORM END IF ELSE WRITE (NOUT,*) 'The SVD algorithm failed to converge' END IF ELSE WRITE (NOUT,*) 'MMAX and/or NMAX too small, and/or M.LT.N' END IF STOP * 99999 FORMAT (4(' (',F7.4,',',F7.4,')',:)) 99998 FORMAT (3X,1P,E11.2) 99997 FORMAT (1X,I6) 99996 FORMAT (1X,7F11.4) END