📄 lbfgs.f90
字号:
IF (N .LE. 0 .OR. STP .LE. ZERO .OR. FTOL .LT. ZERO .OR. &
GTOL .LT. ZERO .OR. XTOL .LT. ZERO .OR. STPMIN .LT. ZERO &
.OR. STPMAX .LT. STPMIN .OR. MAXFEV .LE. 0) RETURN
!
! COMPUTE THE INITIAL GRADIENT IN THE SEARCH DIRECTION
! AND CHECK THAT S IS A DESCENT DIRECTION.
!
DGINIT = ZERO
DO 10 J = 1, N
DGINIT = DGINIT + G(J)*S(J)
10 CONTINUE
IF (DGINIT .GE. ZERO) then
write(LP,15)
15 FORMAT(/' THE SEARCH DIRECTION IS NOT A DESCENT DIRECTION')
RETURN
ENDIF
!
! INITIALIZE LOCAL VARIABLES.
!
BRACKT = .FALSE.
STAGE1 = .TRUE.
NFEV = 0
FINIT = F
DGTEST = FTOL*DGINIT
WIDTH = STPMAX - STPMIN
WIDTH1 = WIDTH/P5
DO 20 J = 1, N
WA(J) = X(J)
20 CONTINUE
!
! THE VARIABLES STX, FX, DGX CONTAIN THE VALUES OF THE STEP,
! FUNCTION, AND DIRECTIONAL DERIVATIVE AT THE BEST STEP.
! THE VARIABLES STY, FY, DGY CONTAIN THE VALUE OF THE STEP,
! FUNCTION, AND DERIVATIVE AT THE OTHER ENDPOINT OF
! THE INTERVAL OF UNCERTAINTY.
! THE VARIABLES STP, F, DG CONTAIN THE VALUES OF THE STEP,
! FUNCTION, AND DERIVATIVE AT THE CURRENT STEP.
!
STX = ZERO
FX = FINIT
DGX = DGINIT
STY = ZERO
FY = FINIT
DGY = DGINIT
!
! START OF ITERATION.
!
30 CONTINUE
!
! SET THE MINIMUM AND MAXIMUM STEPS TO CORRESPOND
! TO THE PRESENT INTERVAL OF UNCERTAINTY.
!
IF (BRACKT) THEN
STMIN = MIN(STX,STY)
STMAX = MAX(STX,STY)
ELSE
STMIN = STX
STMAX = STP + XTRAPF*(STP - STX)
END IF
!
! FORCE THE STEP TO BE WITHIN THE BOUNDS STPMAX AND STPMIN.
!
STP = MAX(STP,STPMIN)
STP = MIN(STP,STPMAX)
!
! IF AN UNUSUAL TERMINATION IS TO OCCUR THEN LET
! STP BE THE LOWEST POINT OBTAINED SO FAR.
!
IF ((BRACKT .AND. (STP .LE. STMIN .OR. STP .GE. STMAX)) &
.OR. NFEV .GE. MAXFEV-1 .OR. INFOC .EQ. 0 &
.OR. (BRACKT .AND. STMAX-STMIN .LE. XTOL*STMAX)) STP = STX
!
! EVALUATE THE FUNCTION AND GRADIENT AT STP
! AND COMPUTE THE DIRECTIONAL DERIVATIVE.
! We return to main program to obtain F and G.
!
DO 40 J = 1, N
X(J) = WA(J) + STP*S(J)
40 CONTINUE
INFO=-1
RETURN
!
45 INFO=0
NFEV = NFEV + 1
DG = ZERO
DO 50 J = 1, N
DG = DG + G(J)*S(J)
50 CONTINUE
FTEST1 = FINIT + STP*DGTEST
!
! TEST FOR CONVERGENCE.
!
IF ((BRACKT .AND. (STP .LE. STMIN .OR. STP .GE. STMAX)) &
.OR. INFOC .EQ. 0) INFO = 6
IF (STP .EQ. STPMAX .AND. &
F .LE. FTEST1 .AND. DG .LE. DGTEST) INFO = 5
IF (STP .EQ. STPMIN .AND. &
(F .GT. FTEST1 .OR. DG .GE. DGTEST)) INFO = 4
IF (NFEV .GE. MAXFEV) INFO = 3
IF (BRACKT .AND. STMAX-STMIN .LE. XTOL*STMAX) INFO = 2
IF (F .LE. FTEST1 .AND. DABS(DG) .LE. GTOL*(-DGINIT)) INFO = 1
!
! CHECK FOR TERMINATION.
!
IF (INFO .NE. 0) RETURN
!
! IN THE FIRST STAGE WE SEEK A STEP FOR WHICH THE MODIFIED
! FUNCTION HAS A NONPOSITIVE VALUE AND NONNEGATIVE DERIVATIVE.
!
IF (STAGE1 .AND. F .LE. FTEST1 .AND. &
DG .GE. MIN(FTOL,GTOL)*DGINIT) STAGE1 = .FALSE.
!
! A MODIFIED FUNCTION IS USED TO PREDICT THE STEP ONLY IF
! WE HAVE NOT OBTAINED A STEP FOR WHICH THE MODIFIED
! FUNCTION HAS A NONPOSITIVE FUNCTION VALUE AND NONNEGATIVE
! DERIVATIVE, AND IF A LOWER FUNCTION VALUE HAS BEEN
! OBTAINED BUT THE DECREASE IS NOT SUFFICIENT.
!
IF (STAGE1 .AND. F .LE. FX .AND. F .GT. FTEST1) THEN
!
! DEFINE THE MODIFIED FUNCTION AND DERIVATIVE VALUES.
!
FM = F - STP*DGTEST
FXM = FX - STX*DGTEST
FYM = FY - STY*DGTEST
DGM = DG - DGTEST
DGXM = DGX - DGTEST
DGYM = DGY - DGTEST
!
! CALL CSTEP TO UPDATE THE INTERVAL OF UNCERTAINTY
! AND TO COMPUTE THE NEW STEP.
!
CALL MCSTEP(STX,FXM,DGXM,STY,FYM,DGYM,STP,FM,DGM, &
BRACKT,STMIN,STMAX,INFOC)
!
! RESET THE FUNCTION AND GRADIENT VALUES FOR F.
!
FX = FXM + STX*DGTEST
FY = FYM + STY*DGTEST
DGX = DGXM + DGTEST
DGY = DGYM + DGTEST
ELSE
!
! CALL MCSTEP TO UPDATE THE INTERVAL OF UNCERTAINTY
! AND TO COMPUTE THE NEW STEP.
!
CALL MCSTEP(STX,FX,DGX,STY,FY,DGY,STP,F,DG, &
BRACKT,STMIN,STMAX,INFOC)
END IF
!
! FORCE A SUFFICIENT DECREASE IN THE SIZE OF THE
! INTERVAL OF UNCERTAINTY.
!
IF (BRACKT) THEN
IF (DABS(STY-STX) .GE. P66*WIDTH1) &
STP = STX + P5*(STY - STX)
WIDTH1 = WIDTH
WIDTH = DABS(STY-STX)
END IF
!
! END OF ITERATION.
!
GO TO 30
!
! LAST LINE OF SUBROUTINE MCSRCH.
!
END
SUBROUTINE MCSTEP(STX,FX,DX,STY,FY,DY,STP,FP,DP,BRACKT, &
STPMIN,STPMAX,INFO)
INTEGER INFO
DOUBLE PRECISION STX,FX,DX,STY,FY,DY,STP,FP,DP,STPMIN,STPMAX
LOGICAL BRACKT,BOUND
!
! SUBROUTINE MCSTEP
!
! THE PURPOSE OF MCSTEP IS TO COMPUTE A SAFEGUARDED STEP FOR
! A LINESEARCH AND TO UPDATE AN INTERVAL OF UNCERTAINTY FOR
! A MINIMIZER OF THE FUNCTION.
!
! THE PARAMETER STX CONTAINS THE STEP WITH THE LEAST FUNCTION
! VALUE. THE PARAMETER STP CONTAINS THE CURRENT STEP. IT IS
! ASSUMED THAT THE DERIVATIVE AT STX IS NEGATIVE IN THE
! DIRECTION OF THE STEP. IF BRACKT IS SET TRUE THEN A
! MINIMIZER HAS BEEN BRACKETED IN AN INTERVAL OF UNCERTAINTY
! WITH ENDPOINTS STX AND STY.
!
! THE SUBROUTINE STATEMENT IS
!
! SUBROUTINE MCSTEP(STX,FX,DX,STY,FY,DY,STP,FP,DP,BRACKT,
! STPMIN,STPMAX,INFO)
!
! WHERE
!
! STX, FX, AND DX ARE VARIABLES WHICH SPECIFY THE STEP,
! THE FUNCTION, AND THE DERIVATIVE AT THE BEST STEP OBTAINED
! SO FAR. THE DERIVATIVE MUST BE NEGATIVE IN THE DIRECTION
! OF THE STEP, THAT IS, DX AND STP-STX MUST HAVE OPPOSITE
! SIGNS. ON OUTPUT THESE PARAMETERS ARE UPDATED APPROPRIATELY.
!
! STY, FY, AND DY ARE VARIABLES WHICH SPECIFY THE STEP,
! THE FUNCTION, AND THE DERIVATIVE AT THE OTHER ENDPOINT OF
! THE INTERVAL OF UNCERTAINTY. ON OUTPUT THESE PARAMETERS ARE
! UPDATED APPROPRIATELY.
!
! STP, FP, AND DP ARE VARIABLES WHICH SPECIFY THE STEP,
! THE FUNCTION, AND THE DERIVATIVE AT THE CURRENT STEP.
! IF BRACKT IS SET TRUE THEN ON INPUT STP MUST BE
! BETWEEN STX AND STY. ON OUTPUT STP IS SET TO THE NEW STEP.
!
! BRACKT IS A LOGICAL VARIABLE WHICH SPECIFIES IF A MINIMIZER
! HAS BEEN BRACKETED. IF THE MINIMIZER HAS NOT BEEN BRACKETED
! THEN ON INPUT BRACKT MUST BE SET FALSE. IF THE MINIMIZER
! IS BRACKETED THEN ON OUTPUT BRACKT IS SET TRUE.
!
! STPMIN AND STPMAX ARE INPUT VARIABLES WHICH SPECIFY LOWER
! AND UPPER BOUNDS FOR THE STEP.
!
! INFO IS AN INTEGER OUTPUT VARIABLE SET AS FOLLOWS:
! IF INFO = 1,2,3,4,5, THEN THE STEP HAS BEEN COMPUTED
! ACCORDING TO ONE OF THE FIVE CASES BELOW. OTHERWISE
! INFO = 0, AND THIS INDICATES IMPROPER INPUT PARAMETERS.
!
! SUBPROGRAMS CALLED
!
! FORTRAN-SUPPLIED ... ABS,MAX,MIN,SQRT
!
! ARGONNE NATIONAL LABORATORY. MINPACK PROJECT. JUNE 1983
! JORGE J. MORE', DAVID J. THUENTE
!
DOUBLE PRECISION GAMMA,P,Q,R,S,SGND,STPC,STPF,STPQ,THETA
INFO = 0
!
! CHECK THE INPUT PARAMETERS FOR ERRORS.
!
IF ((BRACKT .AND. (STP .LE. MIN(STX,STY) .OR. &
STP .GE. MAX(STX,STY))) .OR. &
DX*(STP-STX) .GE. 0.0D0 .OR. STPMAX .LT. STPMIN) RETURN
!
! DETERMINE IF THE DERIVATIVES HAVE OPPOSITE SIGN.
!
SGND = DP*(DX/DABS(DX))
!
! FIRST CASE. A HIGHER FUNCTION VALUE.
! THE MINIMUM IS BRACKETED. IF THE CUBIC STEP IS CLOSER
! TO STX THAN THE QUADRATIC STEP, THE CUBIC STEP IS TAKEN,
! ELSE THE AVERAGE OF THE CUBIC AND QUADRATIC STEPS IS TAKEN.
!
IF (FP .GT. FX) THEN
INFO = 1
BOUND = .TRUE.
THETA = 3*(FX - FP)/(STP - STX) + DX + DP
S = MAX(DABS(THETA),DABS(DX),DABS(DP))
GAMMA = S*DSQRT((THETA/S)**2 - (DX/S)*(DP/S))
IF (STP .LT. STX) GAMMA = -GAMMA
P = (GAMMA - DX) + THETA
Q = ((GAMMA - DX) + GAMMA) + DP
R = P/Q
STPC = STX + R*(STP - STX)
STPQ = STX + ((DX/((FX-FP)/(STP-STX)+DX))/2)*(STP - STX)
IF (DABS(STPC-STX) .LT. DABS(STPQ-STX)) THEN
STPF = STPC
ELSE
STPF = STPC + (STPQ - STPC)/2
END IF
BRACKT = .TRUE.
!
! SECOND CASE. A LOWER FUNCTION VALUE AND DERIVATIVES OF
! OPPOSITE SIGN. THE MINIMUM IS BRACKETED. IF THE CUBIC
! STEP IS CLOSER TO STX THAN THE QUADRATIC (SECANT) STEP,
! THE CUBIC STEP IS TAKEN, ELSE THE QUADRATIC STEP IS TAKEN.
!
ELSE IF (SGND .LT. 0.0D0) THEN
INFO = 2
BOUND = .FALSE.
THETA = 3*(FX - FP)/(STP - STX) + DX + DP
S = MAX(DABS(THETA),DABS(DX),DABS(DP))
GAMMA = S*DSQRT((THETA/S)**2 - (DX/S)*(DP/S))
IF (STP .GT. STX) GAMMA = -GAMMA
P = (GAMMA - DP) + THETA
Q = ((GAMMA - DP) + GAMMA) + DX
R = P/Q
STPC = STP + R*(STX - STP)
STPQ = STP + (DP/(DP-DX))*(STX - STP)
IF (DABS(STPC-STP) .GT. DABS(STPQ-STP)) THEN
STPF = STPC
ELSE
STPF = STPQ
END IF
BRACKT = .TRUE.
!
! THIRD CASE. A LOWER FUNCTION VALUE, DERIVATIVES OF THE
! SAME SIGN, AND THE MAGNITUDE OF THE DERIVATIVE DECREASES.
! THE CUBIC STEP IS ONLY USED IF THE CUBIC TENDS TO INFINITY
! IN THE DIRECTION OF THE STEP OR IF THE MINIMUM OF THE CUBIC
! IS BEYOND STP. OTHERWISE THE CUBIC STEP IS DEFINED TO BE
! EITHER STPMIN OR STPMAX. THE QUADRATIC (SECANT) STEP IS ALSO
! COMPUTED AND IF THE MINIMUM IS BRACKETED THEN THE THE STEP
! CLOSEST TO STX IS TAKEN, ELSE THE STEP FARTHEST AWAY IS TAKEN.
!
ELSE IF (DABS(DP) .LT. DABS(DX)) THEN
INFO = 3
BOUND = .TRUE.
THETA = 3*(FX - FP)/(STP - STX) + DX + DP
S = MAX(DABS(THETA),DABS(DX),DABS(DP))
!
! THE CASE GAMMA = 0 ONLY ARISES IF THE CUBIC DOES NOT TEND
! TO INFINITY IN THE DIRECTION OF THE STEP.
!
GAMMA = S*DSQRT(MAX(0.0D0,(THETA/S)**2 - (DX/S)*(DP/S)))
IF (STP .GT. STX) GAMMA = -GAMMA
P = (GAMMA - DP) + THETA
Q = (GAMMA + (DX - DP)) + GAMMA
R = P/Q
IF (R .LT. 0.0D0 .AND. GAMMA .NE. 0.0D0) THEN
STPC = STP + R*(STX - STP)
ELSE IF (STP .GT. STX) THEN
STPC = STPMAX
ELSE
STPC = STPMIN
END IF
STPQ = STP + (DP/(DP-DX))*(STX - STP)
IF (BRACKT) THEN
IF (DABS(STP-STPC) .LT. DABS(STP-STPQ)) THEN
STPF = STPC
ELSE
STPF = STPQ
END IF
ELSE
IF (DABS(STP-STPC) .GT. DABS(STP-STPQ)) THEN
STPF = STPC
ELSE
STPF = STPQ
END IF
END IF
!
! FOURTH CASE. A LOWER FUNCTION VALUE, DERIVATIVES OF THE
! SAME SIGN, AND THE MAGNITUDE OF THE DERIVATIVE DOES
! NOT DECREASE. IF THE MINIMUM IS NOT BRACKETED, THE STEP
! IS EITHER STPMIN OR STPMAX, ELSE THE CUBIC STEP IS TAKEN.
!
ELSE
INFO = 4
BOUND = .FALSE.
IF (BRACKT) THEN
THETA = 3*(FP - FY)/(STY - STP) + DY + DP
S = MAX(DABS(THETA),DABS(DY),DABS(DP))
GAMMA = S*DSQRT((THETA/S)**2 - (DY/S)*(DP/S))
IF (STP .GT. STY) GAMMA = -GAMMA
P = (GAMMA - DP) + THETA
Q = ((GAMMA - DP) + GAMMA) + DY
R = P/Q
STPC = STP + R*(STY - STP)
STPF = STPC
ELSE IF (STP .GT. STX) THEN
STPF = STPMAX
ELSE
STPF = STPMIN
END IF
END IF
!
! UPDATE THE INTERVAL OF UNCERTAINTY. THIS UPDATE DOES NOT
! DEPEND ON THE NEW STEP OR THE CASE ANALYSIS ABOVE.
!
IF (FP .GT. FX) THEN
STY = STP
FY = FP
DY = DP
ELSE
IF (SGND .LT. 0.0D0) THEN
STY = STX
FY = FX
DY = DX
END IF
STX = STP
FX = FP
DX = DP
END IF
!
! COMPUTE THE NEW STEP AND SAFEGUARD IT.
!
STPF = MIN(STPMAX,STPF)
STPF = MAX(STPMIN,STPF)
STP = STPF
IF (BRACKT .AND. BOUND) THEN
IF (STY .GT. STX) THEN
STP = MIN(STX+0.66D0*(STY-STX),STP)
ELSE
STP = MAX(STX+0.66D0*(STY-STX),STP)
END IF
END IF
RETURN
!
! LAST LINE OF SUBROUTINE MCSTEP.
!
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -