Sommaire

L'intégrale de flux par le théoreme de la divergence (Partie 1).
Intégrale triple (dydzdx)L'intégrale étudiée (dydzdx)
/* ---------------------------------- */
double sympson_dydzdx(
double (*P_f)(double x, double y, double z),




double ax,
double bx,
   int nx,
   
double (*Psz)(double x),
double (*Ptz)(double x),
   int    nz,
   
double (*Puy)(double x, double z),
double (*Pvy)(double x, double z),
   int    ny


)
{
   int i = 0;
double m = 0.;
double M = 0.;

 for(i = 0; i <= nx; i++)
 {
       if(i ==0 || i== nx){m = 1.;}
  else if(fmod(i,2) == 0){m = 2.;}
  else                   {m = 4.;}

  M += m * intz_dydzdx((*P_f),
  
                             (ax+i*(bx-ax)/nx),
                             
                             (*Psz),
                             (*Ptz),
                               nz,
                               
                             (*Puy),
                             (*Pvy),
                               ny);


 }

  return( ((bx -ax)*M) / (3*nx) );
}
/* --------------------------------- */
/* --------------------------------- */
double flux_dydzdx(
double (*P_f)(double x, double y, double z),

double (*P_fxyz_n)( double (*P_f)(double x, double y, double z), 
                    pt3d nz, double h),

double ax,
double bx,
   int nx,
   
double (*P_s)(double x),
double (*P_t)(double x),
   int nz,
   
double (*P_u)(double x, double z),
double (*P_v)(double x, double z),
   int ny,
   
double h
)
{
   int i = 0;
double m = 0.;
double M = 0.;

 for(i = 0; i <= nx; i++)
 {
       if(i ==0 || i== nx){m = 1.;}
  else if(fmod(i,2) == 0){m = 2.;}
  else                   {m = 4.;}

  M += m * flux_z_dydzdx((*P_f),(*P_fxyz_n),

                             (ax+i*(bx-ax)/nx),

                             (*P_s),
                             (*P_t),
                               nz,

                             (*P_u),
                             (*P_v),
                               ny,

                               h);
 }

  return( ((bx -ax)*M) / (3*nx) );
}
/* --------------------------------- */

Comparons les deux fonctions.

Dans les trois premières colonnes, il y a la fonction de référence pour calculer une intégrale triple par la méthode de Sympson. Dans les deuxièmes colonnes il y a les trois fonctions pour calculer l'intégrale de flux par le théoreme de la divergence.


On peut remarquer qu'il y a une fonction supplémentaire en entrée. Cette fonction permettra de calculer les dérivées partielles. On pourra choisir grâce à cette fonction si on veut dériver par rapport à x, y ou z. (voir (*P_fxyz_n)()). Il y a aussi le paramètre h pour calculer les dérivées partielles. (Voir fxyz_x());

Dans la troisième partie de la fonction étudiée, il y a le calcul de la dérivée partielle au lieu d'un simple appel à la fonction f.


En comparant ces fonctions aux fonctions de référence, on voit immédiatement l'analogie qu'il existe entre ces fonctions.


L'intégrale de flux par le théoreme de la divergence (Partie 2).
Intégrale triple (dydzdx)L'intégrale étudiée (dydzdx)
/* ---------------------------------- */
double intz_dydzdx(
double (*P_f)(double x, double y, double z),




double x,

double (*Psz)(double x),
double (*Ptz)(double x),
   int    nz,
   
double (*Puy)(double x, double z),
double (*Pvy)(double x, double z),
   int    ny


)
{
   int i = 0;
double m = 0.;
double M = 0.;

 for(i = 0; i <= nz; i++)
 {
       if(i ==0 || i== nz){m = 1.;}
  else if(fmod(i,2) == 0){m = 2.;}
  else                   {m = 4.;}

  M += m * inty_dydzdx((*P_f),
                                x,
                                
 (((*Psz)(x))+i*(((*Ptz)(x))-((*Psz)(x)))/nz),
                           
                             (*Puy),
                             (*Pvy),
                               ny);


 }

 return( ((((*Ptz)(x)) -((*Psz)(x)))*M) / (3*nz) );
}
/* ---------------------------------- */
/* --------------------------------- */
double flux_z_dydzdx(
double (*P_f)(double x, double y, double z),

double (*P_fxyz_n)( double (*P_f)(double x, double y, double z), 
                    pt3d nz, double h),
                    
double x,

double (*P_s)(double x),
double (*P_t)(double x),
   int nz,
   
double (*P_u)(double x, double z),
double (*P_v)(double x, double z),
   int ny,
   
double h
)
{
   int i = 0;
double m = 0.;
double M = 0.;

 for(i = 0; i <= nz; i++)
 {
       if(i ==0 || i== nz){m = 1.;}
  else if(fmod(i,2) == 0){m = 2.;}
  else                   {m = 4.;}

  M += m * flux_y_dydzdx((*P_f),(*P_fxyz_n),
                                x,

         (((*P_s)(x))+i*(((*P_t)(x))-((*P_s)(x)))/nz),

                             (*P_u),
                             (*P_v),
                               ny,

                               h);
 }

 return( ((((*P_t)(x)) -((*P_s)(x)))*M) / (3*nz) );
}
/* ---------------------------------- */


L'intégrale de flux par le théoreme de la divergence (Partie 3).
Intégrale triple (dydzdx)L'intégrale étudiée (dydzdx)
/* ---------------------------------- */
double inty_dydzdx(
double (*P_f)(double x, double y, double z),



double x,
double z,

double (*Puy)(double x, double z),
double (*Pvy)(double x, double z),
   int    ny


)
{
pt3d n;
   int i = 0;
double m = 0.;
double M = 0.;

 for(i = 0; i <= ny; i++)
 {
       if(i ==0 || i== ny){m = 1.;}
  else if(fmod(i,2) == 0){m = 2.;}
  else                   {m = 4.;}

  n.x = x;
  n.y = ((*Puy)(x,z))+i*(((*Pvy)(x,z))-((*Puy)(x,z)))
                      /ny;
  n.z = z;

  M += m * (*P_f)( n.x,n.y,n.z);

 }

  return( ((((*Pvy)(x,z)) -((*Puy)(x,z)))*M) / (3*ny) );
}
/* ---------------------------------- */
/* --------------------------------- */
double flux_y_dydzdx(
double (*P_f)(double x, double y, double z),

double (*P_fxyz_n)( double (*P_f)(double x,double y,double z), 
                    pt3d n, double h),

double x,
double z,

double (*P_u)(double x, double z),
double (*P_v)(double x, double z),
   int ny,
   
double h
)
{
pt3d n;
   int i = 0;
double m = 0.;
double M = 0.;

 for(i = 0; i <= ny; i++)
 {
       if(i ==0 || i== ny){m = 1.;}
  else if(fmod(i,2) == 0){m = 2.;}
  else                   {m = 4.;}

  n.x = x;
  n.y = ((*P_u)(x,z))+i*(((*P_v)(x,z))-((*P_u)(x,z)))
                     /ny;
  n.z = z;

  M += m *  (*P_fxyz_n)((*P_f),n,h);

  }

  return( ((((*P_v)(x,z)) -((*P_u)(x,z)))*M) / (3*ny) );
}
/* ---------------------------------- */
Cet article est issu de Wikibooks. Le texte est sous licence Creative Commons - Attribution - Partage dans les Mêmes. Des conditions supplémentaires peuvent s'appliquer aux fichiers multimédias.