66 subroutine dcstep(stx,fx,dx,sty,fy,dy,stp,fp,dp,brackt,
69 double precision stx,fx,dx,sty,fy,dy,stp,fp,dp,stpmin,stpmax
80 double precision zero,p66,two,three
81 parameter(zero=0.0d0,p66=0.66d0,two=2.0d0,three=3.0d0)
83 double precision gamma,p,q,r,s,sgnd,stpc,stpf,stpq,theta
85 sgnd = dp*(dx/abs(dx))
93 theta = three*(fx - fp)/(stp - stx) + dx + dp
94 s = max(abs(theta),abs(dx),abs(dp))
95 gamma = s*sqrt((theta/s)**2 - (dx/s)*(dp/s))
96 if (stp .lt. stx) gamma = -gamma
97 p = (gamma - dx) + theta
98 q = ((gamma - dx) + gamma) + dp
100 stpc = stx + r*(stp - stx)
101 stpq = stx + ((dx/((fx - fp)/(stp - stx) + dx))/two)*
103 if (abs(stpc-stx) .lt. abs(stpq-stx))
then
106 stpf = stpc + (stpq - stpc)/two
115 else if (sgnd .lt. zero)
then
116 theta = three*(fx - fp)/(stp - stx) + dx + dp
117 s = max(abs(theta),abs(dx),abs(dp))
118 gamma = s*sqrt((theta/s)**2 - (dx/s)*(dp/s))
119 if (stp .gt. stx) gamma = -gamma
120 p = (gamma - dp) + theta
121 q = ((gamma - dp) + gamma) + dx
123 stpc = stp + r*(stx - stp)
124 stpq = stp + (dp/(dp - dx))*(stx - stp)
125 if (abs(stpc-stp) .gt. abs(stpq-stp))
then
135 else if (abs(dp) .lt. abs(dx))
then
142 theta = three*(fx - fp)/(stp - stx) + dx + dp
143 s = max(abs(theta),abs(dx),abs(dp))
148 gamma = s*sqrt(max(zero,(theta/s)**2-(dx/s)*(dp/s)))
149 if (stp .gt. stx) gamma = -gamma
150 p = (gamma - dp) + theta
151 q = (gamma + (dx - dp)) + gamma
153 if (r .lt. zero .and. gamma .ne. zero)
then
154 stpc = stp + r*(stx - stp)
155 else if (stp .gt. stx)
then
160 stpq = stp + (dp/(dp - dx))*(stx - stp)
168 if (abs(stpc-stp) .lt. abs(stpq-stp))
then
173 if (stp .gt. stx)
then
174 stpf = min(stp+p66*(sty-stp),stpf)
176 stpf = max(stp+p66*(sty-stp),stpf)
184 if (abs(stpc-stp) .gt. abs(stpq-stp))
then
189 stpf = min(stpmax,stpf)
190 stpf = max(stpmin,stpf)
200 theta = three*(fp - fy)/(sty - stp) + dy + dp
201 s = max(abs(theta),abs(dy),abs(dp))
202 gamma = s*sqrt((theta/s)**2 - (dy/s)*(dp/s))
203 if (stp .gt. sty) gamma = -gamma
204 p = (gamma - dp) + theta
205 q = ((gamma - dp) + gamma) + dy
207 stpc = stp + r*(sty - stp)
209 else if (stp .gt. stx)
then
223 if (sgnd .lt. zero)
then
subroutine dcstep(stx, fx, dx, sty, fy, dy, stp, fp, dp, brackt, stpmin, stpmax)
This subroutine computes a safeguarded step for a search procedure and updates an interval that conta...