home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Geek Gadgets 1
/
ADE-1.bin
/
ade-dist
/
octave-1.1.1p1-src.tgz
/
tar.out
/
fsf
/
octave
/
libcruft
/
minpack
/
dogleg.f
next >
Wrap
Text File
|
1996-09-28
|
5KB
|
178 lines
SUBROUTINE DOGLEG(N,R,LR,DIAG,QTB,DELTA,X,WA1,WA2)
INTEGER N,LR
DOUBLE PRECISION DELTA
DOUBLE PRECISION R(LR),DIAG(N),QTB(N),X(N),WA1(N),WA2(N)
C **********
C
C SUBROUTINE DOGLEG
C
C GIVEN AN M BY N MATRIX A, AN N BY N NONSINGULAR DIAGONAL
C MATRIX D, AN M-VECTOR B, AND A POSITIVE NUMBER DELTA, THE
C PROBLEM IS TO DETERMINE THE CONVEX COMBINATION X OF THE
C GAUSS-NEWTON AND SCALED GRADIENT DIRECTIONS THAT MINIMIZES
C (A*X - B) IN THE LEAST SQUARES SENSE, SUBJECT TO THE
C RESTRICTION THAT THE EUCLIDEAN NORM OF D*X BE AT MOST DELTA.
C
C THIS SUBROUTINE COMPLETES THE SOLUTION OF THE PROBLEM
C IF IT IS PROVIDED WITH THE NECESSARY INFORMATION FROM THE
C QR FACTORIZATION OF A. THAT IS, IF A = Q*R, WHERE Q HAS
C ORTHOGONAL COLUMNS AND R IS AN UPPER TRIANGULAR MATRIX,
C THEN DOGLEG EXPECTS THE FULL UPPER TRIANGLE OF R AND
C THE FIRST N COMPONENTS OF (Q TRANSPOSE)*B.
C
C THE SUBROUTINE STATEMENT IS
C
C SUBROUTINE DOGLEG(N,R,LR,DIAG,QTB,DELTA,X,WA1,WA2)
C
C WHERE
C
C N IS A POSITIVE INTEGER INPUT VARIABLE SET TO THE ORDER OF R.
C
C R IS AN INPUT ARRAY OF LENGTH LR WHICH MUST CONTAIN THE UPPER
C TRIANGULAR MATRIX R STORED BY ROWS.
C
C LR IS A POSITIVE INTEGER INPUT VARIABLE NOT LESS THAN
C (N*(N+1))/2.
C
C DIAG IS AN INPUT ARRAY OF LENGTH N WHICH MUST CONTAIN THE
C DIAGONAL ELEMENTS OF THE MATRIX D.
C
C QTB IS AN INPUT ARRAY OF LENGTH N WHICH MUST CONTAIN THE FIRST
C N ELEMENTS OF THE VECTOR (Q TRANSPOSE)*B.
C
C DELTA IS A POSITIVE INPUT VARIABLE WHICH SPECIFIES AN UPPER
C BOUND ON THE EUCLIDEAN NORM OF D*X.
C
C X IS AN OUTPUT ARRAY OF LENGTH N WHICH CONTAINS THE DESIRED
C CONVEX COMBINATION OF THE GAUSS-NEWTON DIRECTION AND THE
C SCALED GRADIENT DIRECTION.
C
C WA1 AND WA2 ARE WORK ARRAYS OF LENGTH N.
C
C SUBPROGRAMS CALLED
C
C MINPACK-SUPPLIED ... DPMPAR,ENORM
C
C FORTRAN-SUPPLIED ... DABS,DMAX1,DMIN1,DSQRT
C
C MINPACK. VERSION OF JULY 1978.
C BURTON S. GARBOW, KENNETH E. HILLSTROM, JORGE J. MORE
C
C **********
INTEGER I,J,JJ,JP1,K,L
DOUBLE PRECISION ALPHA,BNORM,EPSMCH,GNORM,ONE,QNORM,SGNORM,SUM,
* TEMP,ZERO
DOUBLE PRECISION DPMPAR,ENORM
DATA ONE,ZERO /1.0D0,0.0D0/
C
C EPSMCH IS THE MACHINE PRECISION.
C
EPSMCH = DPMPAR(1)
C
C FIRST, CALCULATE THE GAUSS-NEWTON DIRECTION.
C
JJ = (N*(N + 1))/2 + 1
DO 50 K = 1, N
J = N - K + 1
JP1 = J + 1
JJ = JJ - K
L = JJ + 1
SUM = ZERO
IF (N .LT. JP1) GO TO 20
DO 10 I = JP1, N
SUM = SUM + R(L)*X(I)
L = L + 1
10 CONTINUE
20 CONTINUE
TEMP = R(JJ)
IF (TEMP .NE. ZERO) GO TO 40
L = J
DO 30 I = 1, J
TEMP = DMAX1(TEMP,DABS(R(L)))
L = L + N - I
30 CONTINUE
TEMP = EPSMCH*TEMP
IF (TEMP .EQ. ZERO) TEMP = EPSMCH
40 CONTINUE
X(J) = (QTB(J) - SUM)/TEMP
50 CONTINUE
C
C TEST WHETHER THE GAUSS-NEWTON DIRECTION IS ACCEPTABLE.
C
DO 60 J = 1, N
WA1(J) = ZERO
WA2(J) = DIAG(J)*X(J)
60 CONTINUE
QNORM = ENORM(N,WA2)
IF (QNORM .LE. DELTA) GO TO 140
C
C THE GAUSS-NEWTON DIRECTION IS NOT ACCEPTABLE.
C NEXT, CALCULATE THE SCALED GRADIENT DIRECTION.
C
L = 1
DO 80 J = 1, N
TEMP = QTB(J)
DO 70 I = J, N
WA1(I) = WA1(I) + R(L)*TEMP
L = L + 1
70 CONTINUE
WA1(J) = WA1(J)/DIAG(J)
80 CONTINUE
C
C CALCULATE THE NORM OF THE SCALED GRADIENT DIRECTION,
C NORMALIZE, AND RESCALE THE GRADIENT.
C
GNORM = ENORM(N,WA1)
SGNORM = ZERO
ALPHA = DELTA/QNORM
IF (GNORM .EQ. ZERO) GO TO 120
DO 90 J = 1, N
WA1(J) = (WA1(J)/GNORM)/DIAG(J)
90 CONTINUE
C
C CALCULATE THE POINT ALONG THE SCALED GRADIENT
C AT WHICH THE QUADRATIC IS MINIMIZED.
C
L = 1
DO 110 J = 1, N
SUM = ZERO
DO 100 I = J, N
SUM = SUM + R(L)*WA1(I)
L = L + 1
100 CONTINUE
WA2(J) = SUM
110 CONTINUE
TEMP = ENORM(N,WA2)
SGNORM = (GNORM/TEMP)/TEMP
C
C TEST WHETHER THE SCALED GRADIENT DIRECTION IS ACCEPTABLE.
C
ALPHA = ZERO
IF (SGNORM .GE. DELTA) GO TO 120
C
C THE SCALED GRADIENT DIRECTION IS NOT ACCEPTABLE.
C FINALLY, CALCULATE THE POINT ALONG THE DOGLEG
C AT WHICH THE QUADRATIC IS MINIMIZED.
C
BNORM = ENORM(N,QTB)
TEMP = (BNORM/GNORM)*(BNORM/QNORM)*(SGNORM/DELTA)
TEMP = TEMP - (DELTA/QNORM)*(SGNORM/DELTA)**2
* + DSQRT((TEMP-(DELTA/QNORM))**2
* +(ONE-(DELTA/QNORM)**2)*(ONE-(SGNORM/DELTA)**2))
ALPHA = ((DELTA/QNORM)*(ONE - (SGNORM/DELTA)**2))/TEMP
120 CONTINUE
C
C FORM APPROPRIATE CONVEX COMBINATION OF THE GAUSS-NEWTON
C DIRECTION AND THE SCALED GRADIENT DIRECTION.
C
TEMP = (ONE - ALPHA)*DMIN1(SGNORM,DELTA)
DO 130 J = 1, N
X(J) = TEMP*WA1(J) + ALPHA*X(J)
130 CONTINUE
140 CONTINUE
RETURN
C
C LAST CARD OF SUBROUTINE DOGLEG.
C
END