Mathc initiation/Fichiers c : c64ea

Un livre de Wikilivres.
Aller à la navigation Aller à la recherche


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_M)(double x, double y, double z),
double (*P_N)(double x, double y, double z),
double (*P_P)(double x, double y, double z),

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_M),(*P_N),(*P_P),

                             (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 des fonctions supplémentaires en entrée. (Voir (*P_M),(*P_N),(*P_P),). 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 des dérivées partielles (divergence) 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_M)(double x, double y, double z),
double (*P_N)(double x, double y, double z),
double (*P_P)(double x, double y, double z),

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_M),(*P_N),(*P_P),
                                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_M)(double x, double y, double z),
double (*P_N)(double x, double y, double z),
double (*P_P)(double x, double y, double z),

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 * (fxyz_x((*P_M),n,h)+
            fxyz_y((*P_N),n,h)+
            fxyz_z((*P_P),n,h)) ;
  }

  return( ((((*P_v)(x,z)) -((*P_u)(x,z)))*M) / (3*ny) );
}
/* ---------------------------------- */