Mathc initiation/Fichiers h : c44t1
Présentons le problème :
Nous avons la fonction simpson(), nous voulons écrire la fonction surfacearea_ds(), qui est une variante de la première.
La fonction simpson() | La fonction surfacearea_ds() |
---|---|
/* ---------------------------------- */
/* save as x_dx.h */
/* ---------------------------------- */
double simpson(
double (*P_f)(double x),
double a,
double b,
int n
)
{
int i = 0;
double m = 0.;
double M = 0.;
double t = 0;
for(i = 0; i <= n; i++)
{
if(i ==0 || i== n){m = 1.;}
else if(fmod(i,2) == 0){m = 2.;}
else {m = 4.;}
t = (a + i*(b-a)/n);
M += m * (*P_f)(t);
}
return( ((b -a)*M) / (3*n) );
}
/* ---------------------------------- */
/* ---------------------------------- */
|
/* ---------------------------------- */
/* save as x_ds.h */
/* ---------------------------------- */
double surfacearea_ds(
double (*P_f)(double x),
double a,
double b,
int n,
double h
)
{
int i = 0;
double m = 0.;
double M = 0.;
double t = 0;
for(i = 0; i <= n; i++)
{
if(i ==0 || i== n){m = 1.;}
else if(fmod(i,2) == 0){m = 2.;}
else {m = 4.;}
t = (a + i*(b-a)/n);
M += m * 2. * PI * (*P_f)(t) *
sqrt(1. + pow(fx_x((*P_f),t,h),2));
}
return( ((b-a)*M) / (3*n) );
}
/* ---------------------------------- */
/* ---------------------------------- */
|
Dans la première fonction nous avons :
M += m * (*P_f)(a + i*(b-a)/n);
Ou bien :
t = (a + i*(b-a)/n);
M += m * (*P_f)(t);
Qui a été remplacé par :
t = (a + i*(b-a)/n);
M += m * 2. * PI * (*P_f)(t) * sqrt(1. + pow(fx_x((*P_f),t,h),2));
La variable "t" a été introduite pour une meilleure visualisation du code.
En fait on a remplacé l'appel à la fonction "(*P_f)(t);" de la méthode de simpson par l'appel à l'équation qui nous permet de calculer la surface de révolution d'un objet 3d.
La fonction "surfacearea_ds();" a un paramètre supplémentaire. Il permet de contrôler la variation de la variable x dans la fonction qui calcule la dérivée première. Dans la fonction "simpson();" cette valeur est déclaré de manière globale par un define.