dichotomie 2

Ex3 Dichotomie

/*

 * algorithme recursif
 * ===================
 * 
 * fonction dichotomie(a: reel, b: reel, epsilon: reel): reel
 * debut
 *  | // hypothese (d'apres l'enonce de l'exercice)
 *  | // a < b, f(a) < 0 < f(b)
 *  | m: reel
 *  | m := (a+b)/2
 *  | si (b-a) < 2*epsilon
 *  |  | alors retourner m
 *  |  | sinon 
 *  |  |   si f(m) < 0
 *  |  |    | alors retourner dichotomie(m, b, epsilon)
 *  |  |    | sinon retourner dichotomie(a, m, epsilon)
 *  |  |   finsi
 *  | finsi
 * fin
 *
 * algorithme iteratif
 * ===================
 *
 * fonction dichotomie(a: reel, b: reel, epsilon: reel): reel
 * debut
 *  | m: reel
 *  | tant que (b-a) > 2*epsilon faire
 *  |  | m := (a+b)/2   
 *  |  | si f(m) < 0
 *  |  |  | alors // passage au suivant: on recommence avec [m;b]
 *  |  |  |       // f(m) < 0 < f(b)
 *  |  |  |    a:= m
 *  |  |  |    b:= b
 *  |  |  | sinon // passage au suivant: on recommence avec [a;m]
 *  |  |  |       // f(a) < 0 < f(m)
 *  |  |  |    a:= a
 *  |  |  |    b:= m
 *  |  | finsi
 *  | fintantque
 *  | retourner (a+b)/2
 * fin
 */

#include `<stdio.h>`

/* fonction f de test */
double f(double x)
{
   return (x-1.11112)*(x+3.1415); /* racine = 1.11112 et -3.1415 !*/
}

double dichotomieR(double a, double b, double epsilon)
{
  printf("Appel de dichotomieR entre %f et %f: f(%f) = %f, f(%f) = %f \n", a, b, a, f(a), b, f(b));
  double m;
  m = (a+b)/2;
  if ((b-a) < 2*epsilon)
  {
    return m;
  }
  else
  {
    if (f(m) < 0)
    {
      return dichotomieR(m, b, epsilon);
    }
    else
    {  
      return dichotomieR(a, m, epsilon);
    }
  }
}

double dichotomieI(double a, double b, double epsilon)
{
  printf("Appel de dichotomieI entre %f et %f: f(%f) = %f, f(%f) = %f \n", a, b, a, f(a), b, f(b));
  double m;
  while ((b-a) > 2*epsilon)
  {
    printf("a = %f, b = %f\n", a, b );
    m = (a+b)/2;
    if (f(m) < 0)
    {
      a = m;
      b = b;
    }
    else
    {
      a = a;
      b = m;
    }
  }
  return (a+b)/2;
}

void testR()
{
   double a, b, racine;
   double epsilon = 1e-9;
   printf("dichotomie recursive\n");
   printf("epsilon = %g\n",  epsilon);
   a = 0;
   b = 2;
   printf("a = %f, f(a) = %f\n", a, f(a));
   printf("b = %f, f(b) = %f\n", b, f(b));
   printf("f(%f) < 0 < f(%f), appel de dichotomie entre %f et %f\n", a, b, a, b);
   racine = dichotomieR(a, b, epsilon);
   printf("racine: %f\n", racine);
   printf("f(racine): %f\n", f(racine));
}

void testI()
{
   double a, b, racine;
   double epsilon = 1e-9;
   printf("dichotomie iterative\n");
   printf("epsilon = %g\n",  epsilon);
   a = 0;
   b = 2;
   printf("a = %f, f(a) = %f\n", a, f(a));
   printf("b = %f, f(b) = %f\n", b, f(b));
   printf("f(%f) < 0 < f(%f), appel de dichotomie entre %f et %f\n", a, b, a, b);
   racine = dichotomieI(a, b, epsilon);
   printf("racine: %f\n", racine);
   printf("f(racine): %f\n", f(racine));
}

void main()
{
   testR();
   testI();
}