[Index for tmp_for_tar/deriv_min.doc]
[Return to Master Index]
bracket_minimum0
(tmp_for_tar/deriv_min.doc/bracket_minimum0.m)
Function Synopsis
[a,b,c] = bracket_minimum0(func,step,x,dx)
Help text
[a,b,c] = bracket_minimum0(f,step,x,dx) - Interval containing minimum
f : string : name of function
step : 1 : Original radius of interval
x : RxC : Starting point
dx : RxC : Direction of search
a, b, c : 1 : Such that
f(x+a*dx) > f(x+x*dx) < f(x+b*dx)
Last modified: October 2000
Listing of function file tmp_for_tar/deriv_min.doc/bracket_minimum0.m
## [a,b,c] = bracket_minimum0(f,step,x,dx) - Interval containing minimum
##
## f : string : name of function
## step : 1 : Original radius of interval
## x : RxC : Starting point
## dx : RxC : Direction of search
##
## a, b, c : 1 : Such that
##
## f(x+a*dx) > f(x+x*dx) < f(x+b*dx)
##
## Author: Etienne Grossmann <etienne@isr.ist.utl.pt>
## Last modified: October 2000
function [a,b,c] = bracket_minimum0(func,step,x,dx)
step = abs (step);
a = -step ; b = step ; c = 0 ;
if all(dx==0), return end
fa = feval(func,x+a*dx) ;
fb = feval(func,x+b*dx) ;
fc = feval(func,x+c*dx) ;
niter = 0 ;
maxiter = 1000 ;
verbose = 0 ;
if fa==fb,
if fa<=fc, printf("bracket_minimum0: I'm clueless\n"); end
return
end
## From now on, fa>=fb
if fa<fb , tmp=a;a=b;b=tmp; tmp=fa;fa=fb;fb=tmp; end
if verbose,
printf(["bracket start %8.3g %8.3g %8.3g\n",...
" %8.3g %8.3g %8.3g\n"],...
b,c,a,fb,fc,fa) ;
end
## Enforce fb <= fc < fa
while fc >= fa && niter++<maxiter && abs(b-a)>sqrt(eps),
a=c ; fa=fc ;
c=(a+b)/2 ;
fc = feval(func,x+c*dx) ;
if verbose,
printf(["bracket straight %8.3g %8.3g %8.3g\n",...
" %8.3g %8.3g %8.3g\n"],...
b,c,a,fb,fc,fa) ;
end
end
if fb > fc,
if verbose, printf("bracket_minimum: found! (easy)\n"); end
if a>b, tmp=a;a=b;b=tmp; end
return
end
found = 0 ;
while niter++<maxiter ,
# Suppose that minimum is "after" b
b2 = 2*b - a ;
fb2 = feval(func,x+b2*dx) ;
if fb2 > fc , found = 1 ; end
# Draw a closer if possible
if fc>fb, a = c ; fa = fc ; end
c = b ; fc = fb ;
b = b2 ; fb =fb2 ;
if verbose,
printf("bracket niter=%d\n",niter);
printf(" %8.3g %8.3g %8.3g\n", b, c, a, fb, fc, fa) ;
end
if found,
if verbose, printf("bracket_minimum: found!\n"); end
if a>b, tmp=a;a=b;b=tmp; end
return ;
end
end
Produced by oct2html on Tue Oct 17 10:08:37 2000
Cross-Directory links are: ON