Aller au contenu

Mathc initiation/0056

Un livre de Wikilivres.


Sommaire

Présentation de la fonction de Stokes.
*********** Intégrale double (dxdy) *********** Intégrale double de Stokes (dxdy)
.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.


/* --------------------------- */
double int_dx(
.

.

double (*P_f)(double x, double y),

double (*Px0)(double y),
double (*Px1)(double y),
   int   nx,
   
double    y
)
{
.

.
   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 * (*P_f)(((*Px0)(y)) + 
       i*(((*Px1)(y))-((*Px0)(y)))
                    /nx, 
                      y );
 } 
  
return( ((((*Px1)(y))-((*Px0)(y)))*M)
                       /(3*nx));
}
/* --------------------------- */
/* -------------------------------- */
/* save as x_stokxy.h               */
/* -------------------------------- */
/*
 *           (curl F).dS
 * 
 * 
    / y1  / x(y) 
   |     |      
   |     | (curl F).(-f_x,-f_y,1)dxdy = 
   |     |      
  /  y0  /  x(y) 
 *
 * 
 *  */
 /* ------------------------------- */
double  curlF_u(

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 (*P_f)(double x, double y),

pt2d p
)
{
v3d     u;
v3d  curl;
pt3d  p3d;

     p3d.x = p.x;
     p3d.y = p.y;
     p3d.z = (*P_f)(p.x,p.y);

    u = prod_scal_g_x_g_y((*P_f), p);
 curl = curl_ijk((*P_M),(*P_N),(*P_P),p3d);

 return( (  curl.i*u.i +
            curl.j*u.j +
            curl.k*u.k )  );
}
/* -------------------------------- */
/* --------------------------------- */
double  stokes_dx(
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 (*P_f)(double x, double y),

double (*Px0)(double y),
double (*Px1)(double y),
   int   nx,
   
double    y
)
{
pt2d p;

   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.;}

 p.x =   ((*Px0)(y))+ 
      i*(((*Px1)(y))-((*Px0)(y)))
                    /nx;
 p.y = y;

 M += m * curlF_u(
              (*P_M),(*P_N),(*P_P),
              (*P_f),
                p);
 }

return(((((*Px1)(y))-((*Px0)(y)))*M)
                    / (3*nx) );
}
/* ---------------------------------- */

Comparons les deux fonctions.

Dans les deux premières colonnes, il y a la fonction de référence pour calculer une intégrale double par la méthode de Simpson. Dans les deuxièmes colonnes il y a les deux fonctions pour calculer la fonction de Stoke.


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


Présentation de la fonction de Stokes.
Intégrale double (dxdy) Fonction de Stokes (dxdy)
/* ----------------------------- */
double simpson_dxdy(
.
 
.
 
.
double (*P_f)(double x, double y),

double (*Px0)(double y),
double (*Px1)(double y),
   int   nx,
   
double   y0,
double   y1,
   int   ny
)
{
   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.;}

  M += m * int_dx((*P_f), 
                  (*Px0),(*Px1),nx, 
                  (y0+i*(y1-y0)/ny));
 }

  return( ((y1-y0)*M) / (3*ny) );
}
/* ------------------------------- */
/* ------------------------------- */
/* ---------------------------------- */
double stokes_dxdy(

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 (*P_f)(double x, double y),

double (*Px0)(double y),
double (*Px1)(double y),
   int   nx,
   
double   y0,
double   y1,
   int   ny
)
{
   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.;}

 M += m * stokes_dx((*P_M),(*P_N),(*P_P),
                    (*P_f),
                    (*Px0),(*Px1),nx,
                    (y0 + i*(y1-y0)/ny));
 }

  return( ((y1 -y0)*M) / (3*ny) );
}
/* ---------------------------------- */