Introduction au langage C/Tableau de pointeurs de fonctions 2
Apparence
Introduction (deuxième partie)
[modifier | modifier le wikicode]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
[modifier | modifier le wikicode]Un tableau de pointeurs de fonctions
[modifier | modifier le wikicode]- 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
[modifier | modifier le wikicode] 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
[modifier | modifier le wikicode]/* ------------------------------ */
#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;
}