|
PROGRAM TEST
|
IMPLICIT NONE
|
C
|
INTEGER LDA, LDB, LDSING, LDWORK, M, N, NRHS
|
PARAMETER (M = 4)
|
PARAMETER (N = 4)
|
PARAMETER (LDA = M)
|
PARAMETER (LDB = M)
|
PARAMETER (LDSING = M)
|
PARAMETER (LDWORK = 4 * N)
|
PARAMETER (NRHS = 1)
|
C
|
DOUBLE PRECISION A(LDA,N), B(LDB,NRHS), RCOND, SMALL
|
DOUBLE PRECISION WORK(LDWORK)
|
INTEGER ICOL, INFO, IPIVOT(N), IROW, IRANK
|
C
|
EXTERNAL DGELSX
|
INTRINSIC ABS, SQRT
|
C
|
C Initialize the array A to store the coefficient matrix A
|
C shown below. Initialize the array B to store the right
|
C hand side vector b shown below. The element labeled z in
|
C the last column of A differs from 2 only in the last few
|
C bits. This makes columns three and four nearly equal.
|
C
|
C 1 6 2 z 96
|
C A = 1 -2 -8 -8 b = 192
|
C 1 -2 4 4 192
|
C 1 6 14 14 -96
|
C
|
DATA A / 1.0D0, 1.0D0, 1.0D0, 1.0D0,
|
$ 6.0D0, -2.0D0, -2.0D0, 6.0D0,
|
$ 2.0D0, -8.0D0, 4.0D0, 1.4D1,
|
$ 2.0D0, -8.0D0, 4.0D0, 1.4D1 /
|
DATA B / 9.6D1, 1.92D2, 1.92D2, -9.6D1 /
|
DATA IPIVOT / N*1 /
|
C
|
C Print the initial value of the arrays.
|
C
|
SMALL = ((((2.0D0 / 3.0D0) + 4.0D0) - 4.0D0) -
|
$ (2.0D0 / 3.0D0))
|
A(1,N) = A(1,N-1) + SMALL
|
PRINT 1000
|
PRINT 1010, ((A(IROW,ICOL), ICOL = 1, N), IROW = 1, M)
|
PRINT 1020
|
PRINT 1030, B
|
C
|
C Solve the minimization problem. Print the solution and the
|
C numerical rank of A.
|
C
|
RCOND = SQRT(2.2D-16)
|
CALL DGELSX (M, N, NRHS, A, LDA, B, LDB, IPIVOT, RCOND,
|
$ IRANK, WORK, INFO)
|
IF (INFO .NE. 0) THEN
|
PRINT 1040, ABS(INFO)
|
STOP 1
|
END IF
|
PRINT 1050, IRANK
|
PRINT 1060
|
PRINT 1030, B
|
C
|
1000 FORMAT (1X, 'A:')
|
1010 FORMAT (4(3X, F8.4))
|
1020 FORMAT (/1X, 'b:')
|
1030 FORMAT (1X, F8.4)
|
1040 FORMAT (1X, 'Illegal value for argument #', I2,
|
$ ' in DGELSX.')
|
1050 FORMAT (/1X, 'Numerical rank of A: ', I1)
|
1060 FORMAT (/1X, 'min(b - Ax):')
|
C
|
END
|
|