C pointeurs/Tableau de pointeurs de fonctions 2
Introduction
modifier- Deuxième partie.
Les fonctions f‘ et f‘‘
modifier- Nous voulons créer la fonction Derivate
- Calculer la dérivé première et seconde d'une fonction
- Utiliser un tableau de pointeurs de fonctions.
Voir listing en fin de page.
Déclaration du tableau
modifierdouble (*Derivate[3])(double (*P_f)(double x),double a,double h) = {fx,Df_x,Df_xx};
- Toutes les fonctions (fx,Df_x,Df_xx) ont la même forme :
double fonction(double (*P_f)(double x) double double)
.
- Le tableau à la même forme que les fonctions :
double tableau(double (*P_f)(double x) double double)
.
- Il y a trois fonctions. (0,1,2)= {fx, Df_x, Df_xx}.
- La fonction fx() donne f().
Exemple d'un appel
modifier Derivate[0](f,x,0.) ==> f(x)
- 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())
Application
modifier/* ------------------------------ */
/* Save as c04.c */
/* ------------------------------ */
#include <stdio.h>
#include <math.h>
/* ------------------------------ */
double f(double x){return( pow(x,2.));}
char feq[] = "x**2";
/* ------------------------------ */
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 Df_x(
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 Df_xx(
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,Df_x,Df_xx};
double a = 2;
double h = 0.001;
printf("\n\n");
printf(" f(%.3f) = %.3f = %.3f \n",a, f(a), Derivate[0](f,a,0));
printf(" f'(%.3f) = %.3f = %.3f \n",a,Df_x (f,a,h),Derivate[1](f,a,h));
printf("f''(%.3f) = %.3f = %.3f \n",a,Df_xx(f,a,h),Derivate[2](f,a,h));
printf("\n\n");
printf(" g(%.3f) = %.3f = %.3f \n",a, g(a), Derivate[0](g,a,0));
printf(" g'(%.3f) = %.3f = %.3f \n",a,Df_x (g,a,h),Derivate[1](g,a,h));
printf("g''(%.3f) = %.3f = %.3f \n",a,Df_xx(g,a,h),Derivate[2](g,a,h));
printf("\n\n Press return to continue.");
getchar();
return 0;
}
Avec le résultat dans un fichier
modifier- Déclarer le pointeur de fichiers.
- FILE *fp;
- Ouvrir le fichier.
- fp = fopen("list.txt","w");
- Fermer le fichiers
- fclose(fp);
- Remplacer tous les printf( par fprintf(fp,
- fprintf(fp,
/* ------------------------------ */
int main(void)
{
FILE *fp = fopen("list.txt","w");
double (*Derivate[3])(double (*P_f)(double x),
double a,
double h) = {fx,Df_x,Df_xx};
double a = 2;
double h = 0.001;
fprintf(fp,"\n\n");
fprintf(fp," f(%.3f) = %.3f = %.3f \n",a, f(a), Derivate[0](f,a,0));
fprintf(fp," f'(%.3f) = %.3f = %.3f \n",a,Df_x (f,a,h),Derivate[1](f,a,h));
fprintf(fp,"f''(%.3f) = %.3f = %.3f \n",a,Df_xx(f,a,h),Derivate[2](f,a,h));
fprintf(fp,"\n\n");
fprintf(fp," g(%.3f) = %.3f = %.3f \n",a, g(a), Derivate[0](g,a,0));
fprintf(fp," g'(%.3f) = %.3f = %.3f \n",a,Df_x (g,a,h),Derivate[1](g,a,h));
fprintf(fp,"g''(%.3f) = %.3f = %.3f \n",a,Df_xx(g,a,h),Derivate[2](g,a,h));
fclose(fp);
printf("\n\n Press return to continue.");
getchar();
return 0;
}
Conclusion
modifier- Vous pouvez approfondir ce travail grâce à ce wikibook : Mathc gnuplot
- Ou bien continuer directement sur wikiversité : Mathc Home Edition