code: protected boolean section()
  	{
  //		System.out.println("------------- section");
  		// compute the value at the new sample point
  		double temp = stp;
  		stp = interpolate(pLow +t2*(pHi - pLow), pHi -t3*(pHi - pLow));
  		updated = true;
  		// save the previous step
  		if( !Double.isNaN(gp)) {
  			// needs to keep a step with a derivative
  			stprev = temp;
  			fprev = fp;
  			gprev = gp;
  		}
  
  		// see if there is a significant change in alpha
  		if( checkSmallStep() ) {
  			if( verbose != null )
  				verbose.println("WARNING: Small steps");
  			return true;
  		}
  
  		function.setInput(stp);
  		fp = function.computeFunction();
  		gp = Double.NaN;
  
  		// check for convergence
  		if( fp > valueZero + ftol * stp *derivZero  || fp >= fLow) {
  			pHi = stp;
  		} else {
  			gp = function.computeDerivative();
  
  			// check for termination
  			if( Math.abs(gp) <= -gtol *derivZero )
  				return true;
  
  			if( gp *(pHi - pLow) >= 0 )
  				pHi = pLow;
  			// check on numerical prevision
  			if( Math.abs((pLow - stp)* gp) <= tolStep ) {
  				return true;
  			}
  			pLow = stp;
  			fLow = fp;
  		}
  
  		return false;
  	}
docs: Using the found bracket for alpha it searches for a better estimate.