* F08KCF Example Program Text * Mark 21 Release. NAG Copyright 2004. * .. Parameters .. INTEGER NIN, NOUT PARAMETER (NIN=5,NOUT=6) INTEGER MMAX, NB, NLVL, NMAX PARAMETER (MMAX=8,NB=64,NLVL=10,NMAX=16) INTEGER LDA, LIWORK, LWORK PARAMETER (LDA=MMAX,LIWORK=3*MMAX*NLVL+11*MMAX, + LWORK=NB*(2*MMAX+NMAX)) * .. Local Scalars .. DOUBLE PRECISION RCOND INTEGER I, INFO, J, M, N, RANK * .. Local Arrays .. DOUBLE PRECISION A(LDA,NMAX), B(NMAX), S(MMAX), WORK(LWORK) INTEGER IWORK(LIWORK) * .. External Subroutines .. EXTERNAL DGELSD * .. Executable Statements .. WRITE (NOUT,*) 'F08KCF 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.LE.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 DGELSD(M,N,1,A,LDA,B,N,S,RCOND,RANK,WORK,LWORK,IWORK,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,99999) (S(I),I=1,M) ELSE WRITE (NOUT,*) 'The SVD algorithm failed to converge' END IF ELSE WRITE (NOUT,*) 'MMAX and/or NMAX too small, and/or M.GT.N' END IF * 99999 FORMAT (1X,7F11.4) 99998 FORMAT (3X,1P,E11.2) 99997 FORMAT (1X,I6) END