// ................................................................. golden.cc
//                                                        versione 08.APR.2003

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "corso.h"

// ============================================================== golden
double golden(double ax,double bx,double cx,double (*ptfunz)(double x),double tol,
	      double *xmin)
{
  double f1,f2,x0,x1,x2,x3;
  const double golden = 0.3819660;	// golden = (3-sqrt(5))/2.0
  const double rest=0.61803399;         // rest=1-golden

  x0=ax;
  x3=cx;
  if (fabs(cx-bx)>fabs(bx-ax)) {x1=bx;x2=bx+golden*(cx-bx);}
  else {x2=bx;x1=bx-golden*(bx-ax);}

  f1=(*ptfunz)(x1);
  f2=(*ptfunz)(x2);
  while (fabs(x3-x0)>tol) 
    { if (f2<f1) 
        { x0=x1;x1=x2;x2=rest*x1+golden*x3;
	  f1=f2;f2=(*ptfunz)(x2);
	} 
      else 
	{ x3=x2;x2=x1;x1=rest*x2+golden*x0;
          f2=f1;f1=(*ptfunz)(x1);
	}
    }
  if (f1<f2) {*xmin=x1;return f1;}
  else {*xmin=x2;return f2;}
}






