[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