// ................................................................ brackmin.c
//                                                        versione 08.APR.2003
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "corso.h"

// ==================================================================== brackmin
void brackmin(double *xa,double *xb,double *xc,double *fa,double *fb,double *fc,
	      double (*ptfunz)(double x))
{
  int count,CountMax;
  double f1,f2,f3,x1,x2,x3,xx;
  const double golden = 0.3819660;	// golden = (3-sqrt(5))/2.0

  // ........................................................ contatore
  CountMax=1000;
  // .................................................... valori inizali
  x1=*xa;
  x3=*xc;
  f1=(*ptfunz)(x1);
  f3=(*ptfunz)(x3);  
  // .................................................................  
  if (f3>=f1) 
    { x2=x1+(x3-x1)*golden;
      f2=(*ptfunz)(x2);
    }
  else
    { x2=x3 ;
      f2=f3 ;
      x3=x1+(x2-x1)/golden;
      f3=(*ptfunz)(x3);
    }
  // .................................................................  
  for (count=0;count<CountMax;count++)
    { // ------------------------------------------------------- f2<f1
      if (f2<f1 )
	{ // ......................................... f2 e' il minimo
	  if (f2 < f3)
	    { *xa=x1;*xb=x2;*xc=x3;
	      *fa=f1;*fb=f2;*fc=f3;
	      return;
	    }
	  // ................................................... f2>f3
	  else if (f2 > f3)
	    { x1=x2;f1=f2;
	      x2=x3;f2=f3;
	      x3=x1+(x2-x1)/golden;
	      f3=(*ptfunz)(x3);
	    }
	  // .................................................. f2==f3
	  else
	    { x1=x2;f1=f2;
	      x2=x1+(x3-x1)*golden;
	      f2=(*ptfunz)(x2);
	    }
	}
      // ------------------------------------------------------ f2>=f1
      else
	{ x3=x2;f3=f2;
	  x2=x1;f2=f1;
	  x1=x1-(x3-x2)/golden;
	  f1=(*ptfunz)(x1);
	}
    }
  *xa=x1;*xc=x3;*xb=x2;
  *fa=f1;*fc=f3;*fb=f2;
  printf("fallimento!!!\n");
}
