Studio di funzioni in C++: zeri, massimi e minimi, punti di flesso.


//Trova zero
double FindZero   (double lowerlimit, double upperlimit, double precision,
                   double (*function)(double)) 
{
 double m, fm; 
 if ( (*function)(lowerlimit)*(*function)(upperlimit)>0) return DBL_MAX;
 if ( (*function)(upperlimit)==0) return upperlimit;
 if ( (*function)(lowerlimit)==0) return lowerlimit;
  
 while ( upperlimit-lowerlimit > precision) {      
  m = (lowerlimit+upperlimit)/2;
fm= (*function) (m) ;
if (fm==0) return fm;
if ((*function)(lowerlimit)*fm<0 i="">
upperlimit=m;
else 
lowerlimit=m;
       } 
return m; // stima dello 0
}


//Trova massimo
double FindMaximum(double lowerlimit, double upperlimit, double precision,
                   double (*function)(double)) {
  double a=lowerlimit, b=(lowerlimit+upperlimit)/2., c=upperlimit, x=(b+c)/2;
  double fa = (*function)(a);
  double fb = (*function)(b);
  double fc = (*function)(c);
  double fx = (*function)(x);
  while ( c-a > precision) { 
  if ( fb > fx )
  c = x;
  else
  a = b;
  b = (a+c)/2;
  x = (b+c)/2;
  fa = (*function)(a);
  fb = (*function)(b);
  fc = (*function)(c);
  fx = (*function)(x);
  }
  if ( fb >fa && fb>fc)
return b;  
  else
  return DBL_MAX;
}


//Trova minimo
double FindMinimum(double lowerlimit, double upperlimit, double precision,
                   double (*function)(double)) {  
  double a=lowerlimit, b=(lowerlimit+upperlimit)/2., c=upperlimit ,x=(b+c)/2;
  double fa = (*function)(a);
  double fb = (*function)(b);
  double fc = (*function)(c);
  double fx = (*function)(x);
  while ( c-a > precision) { 
  if ( fb < fx )
  c = x;
  else
  a = b;
  b = (a+c)/2;
  x = (b+c)/2;
  fa = (*function)(a);
  fb = (*function)(b);
  fc = (*function)(c);
  fx = (*function)(x);
  }
  if ( fb
return b;  
  else
  return DBL_MAX;
}









Categories: