2
SUBROUTINE DDOGLG (N, R, LR, DIAG, QTB, DELTA, X, WA1, WA2)
3
C***BEGIN PROLOGUE DDOGLG
5
C***PURPOSE Subsidiary to DNSQ and DNSQE
7
C***TYPE DOUBLE PRECISION (DOGLEG-S, DDOGLG-D)
11
C Given an M by N matrix A, an N by N nonsingular diagonal
12
C matrix D, an M-vector B, and a positive number DELTA, the
13
C problem is to determine the convex combination X of the
14
C Gauss-Newton and scaled gradient directions that minimizes
15
C (A*X - B) in the least squares sense, subject to the
16
C restriction that the Euclidean norm of D*X be at most DELTA.
18
C This subroutine completes the solution of the problem
19
C if it is provided with the necessary information from the
20
C QR factorization of A. That is, if A = Q*R, where Q has
21
C orthogonal columns and R is an upper triangular matrix,
22
C then DDOGLG expects the full upper triangle of R and
23
C the first N components of (Q transpose)*B.
25
C The subroutine statement is
27
C SUBROUTINE DDOGLG(N,R,LR,DIAG,QTB,DELTA,X,WA1,WA2)
31
C N is a positive integer input variable set to the order of R.
33
C R is an input array of length LR which must contain the upper
34
C triangular matrix R stored by rows.
36
C LR is a positive integer input variable not less than
39
C DIAG is an input array of length N which must contain the
40
C diagonal elements of the matrix D.
42
C QTB is an input array of length N which must contain the first
43
C N elements of the vector (Q transpose)*B.
45
C DELTA is a positive input variable which specifies an upper
46
C bound on the Euclidean norm of D*X.
48
C X is an output array of length N which contains the desired
49
C convex combination of the Gauss-Newton direction and the
50
C scaled gradient direction.
52
C WA1 and WA2 are work arrays of length N.
54
C***SEE ALSO DNSQ, DNSQE
55
C***ROUTINES CALLED D1MACH, DENORM
56
C***REVISION HISTORY (YYMMDD)
58
C 890531 Changed all specific intrinsics to generic. (WRB)
59
C 890831 Modified array declarations. (WRB)
60
C 891214 Prologue converted to Version 4.0 format. (BAB)
61
C 900326 Removed duplicate information from DESCRIPTION section.
63
C 900328 Added TYPE section. (WRB)
64
C***END PROLOGUE DDOGLG
65
DOUBLE PRECISION D1MACH,DENORM
66
INTEGER I, J, JJ, JP1, K, L, LR, N
67
DOUBLE PRECISION ALPHA, BNORM, DELTA, DIAG(*), EPSMCH, GNORM,
68
1 ONE, QNORM, QTB(*), R(*), SGNORM, SUM, TEMP, WA1(*),
71
DATA ONE,ZERO /1.0D0,0.0D0/
73
C EPSMCH IS THE MACHINE PRECISION.
75
C***FIRST EXECUTABLE STATEMENT DDOGLG
78
C FIRST, CALCULATE THE GAUSS-NEWTON DIRECTION.
80
JJ = (N*(N + 1))/2 + 1
87
IF (N .LT. JP1) GO TO 20
94
IF (TEMP .NE. ZERO) GO TO 40
97
TEMP = MAX(TEMP,ABS(R(L)))
101
IF (TEMP .EQ. ZERO) TEMP = EPSMCH
103
X(J) = (QTB(J) - SUM)/TEMP
106
C TEST WHETHER THE GAUSS-NEWTON DIRECTION IS ACCEPTABLE.
110
WA2(J) = DIAG(J)*X(J)
112
QNORM = DENORM(N,WA2)
113
IF (QNORM .LE. DELTA) GO TO 140
115
C THE GAUSS-NEWTON DIRECTION IS NOT ACCEPTABLE.
116
C NEXT, CALCULATE THE SCALED GRADIENT DIRECTION.
122
WA1(I) = WA1(I) + R(L)*TEMP
125
WA1(J) = WA1(J)/DIAG(J)
128
C CALCULATE THE NORM OF THE SCALED GRADIENT AND TEST FOR
129
C THE SPECIAL CASE IN WHICH THE SCALED GRADIENT IS ZERO.
131
GNORM = DENORM(N,WA1)
134
IF (GNORM .EQ. ZERO) GO TO 120
136
C CALCULATE THE POINT ALONG THE SCALED GRADIENT
137
C AT WHICH THE QUADRATIC IS MINIMIZED.
140
WA1(J) = (WA1(J)/GNORM)/DIAG(J)
146
SUM = SUM + R(L)*WA1(I)
152
SGNORM = (GNORM/TEMP)/TEMP
154
C TEST WHETHER THE SCALED GRADIENT DIRECTION IS ACCEPTABLE.
157
IF (SGNORM .GE. DELTA) GO TO 120
159
C THE SCALED GRADIENT DIRECTION IS NOT ACCEPTABLE.
160
C FINALLY, CALCULATE THE POINT ALONG THE DOGLEG
161
C AT WHICH THE QUADRATIC IS MINIMIZED.
163
BNORM = DENORM(N,QTB)
164
TEMP = (BNORM/GNORM)*(BNORM/QNORM)*(SGNORM/DELTA)
165
TEMP = TEMP - (DELTA/QNORM)*(SGNORM/DELTA)**2
166
1 + SQRT((TEMP-(DELTA/QNORM))**2
167
2 +(ONE-(DELTA/QNORM)**2)*(ONE-(SGNORM/DELTA)**2))
168
ALPHA = ((DELTA/QNORM)*(ONE - (SGNORM/DELTA)**2))/TEMP
171
C FORM APPROPRIATE CONVEX COMBINATION OF THE GAUSS-NEWTON
172
C DIRECTION AND THE SCALED GRADIENT DIRECTION.
174
TEMP = (ONE - ALPHA)*MIN(SGNORM,DELTA)
176
X(J) = TEMP*WA1(J) + ALPHA*X(J)
181
C LAST CARD OF SUBROUTINE DDOGLG.