< Introduction au langage C
fin de la boite de navigation du chapitre


Introduction (deuxième partie)

Nous voulons créer la fonction Derivate capable de calculer la dérivé première et seconde d'une fonction, en utilisant un tableau de pointeurs de fonctions.

Premier exemple

Un tableau de pointeurs de fonctions

  • Voir listing en fin de page.
double (*Derivate[3])(double (*P_f)(double x),double a,double h) = {fx,Dx_1,Dx_2};


  • Toutes les fonctions (fx,Dx_1,Dx_2) ont la même forme.
  • double FUNCTION(double (*P_f)(double x) double double)
  • Le tableau à la même forme que les fonctions.
  • double ARRAY(double (*P_f)(double x) double double)
  • Il y a trois fonctions. (0,1,2)= {fx, Dx_1, Dx_2}.
  • La fonction fx donne f.
  • Supprimer cette fonction et travailler sur deux fonctions.
  • Réfléchissez.

Exemple d'un appel

     f(x)=Derivate[0](f,x,0.)


  • Derivate[0] donne f(x).
  • Voir la fonction fx() la première fonction du tableau.
  • h = 0 dans cet appel parce qu’il n’est pas utilisé (voir code de fx())

Exemple à tester


/* ------------------------------ */
#include <stdio.h>
#include <math.h>
/* ------------------------------ */


/* ------ Fonction f ------------ */
double f(double x){return( pow(x,2.));}
/* ------------------------------ */
char feq[] = "x**2";
/* ------------------------------ */

/* ------ Fonction g ------------ */
double g(double x){return(
 pow(cos(x),2.)+sin(x)+x-3);}
/* ------------------------------ */
char geq[] = "cos(x)**2+sin(x)+x-3";
/* ------------------------------ */


/* ----------------------------- */
double fx(
double (*P_f)(double x),
double a,
double h
)
{
 return( ((*P_f)(a)) );
}


/* ------------------------------
 f'(a) = f(a+h) - f(a-h)
          -------------
              2h
   ------------------------------ */
double Dx_1(
double (*P_f)(double x),
double a,
double h
)
{
 return( ( ((*P_f)(a+h))-((*P_f)(a-h)) ) / (2.*h) );
}


/* -----------------------------
 f''(a) = f(a+h) - 2 f(a) + f(a-h)
           ----------------------
                     h**2
   ------------------------------- */
double Dx_2(
double (*P_f)(double x),
double a,
double h
)
{
 return( (((*P_f)(a+h))-2*((*P_f)(a))+((*P_f)(a-h))) / (h*h) );
}


/* ------------------------------ */
int main(void)
{
double (*Derivate[3])(double (*P_f)(double x),
                      double a,
                      double h) = {fx,Dx_1,Dx_2};
double x = 2;
double h = 0.001;

printf("\n\n");

printf(" f(%.3f) = %.3f = %.3f \n",x,f(x), Derivate[0](f,x,0.));
printf(" f'(%.3f) = %.3f = %.3f \n",x,Dx_1(f,x,h),Derivate[1](f,x,h));
printf("f''(%.3f) = %.3f = %.3f \n",x,Dx_2(f,x,h),Derivate[2](f,x,h));

printf("\n\n");

printf(" g(%.3f) = %.3f = %.3f \n",x,g(x), Derivate[0](g,x,0.));
printf(" g'(%.3f) = %.3f = %.3f \n",x,Dx_1(g,x,h),Derivate[1](g,x,h));
printf("g''(%.3f) = %.3f = %.3f \n",x,Dx_2(g,x,h),Derivate[2](g,x,h));

    printf("\n\n Press return to continue.");

 getchar();

 return 0;
}


Cet article est issu de Wikiversity. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.