Mathc initiation/Fichiers h : c24a5

Un livre de Wikilivres.


Sommaire


Installer ce fichier dans votre répertoire de travail.

x_nwtn.h
/* --------------------------------- */
/* save as x_nwtn.h                  */
/* --------------------------------- */
pt2d newton_fxy(
int n,
double (*P_f)(double x, double y),
double (*P_g)(double x, double y),
pt2d  p
)
{
int   k;
double   delta;
pt2d  delta_p;

       for(k=1; k<n; k++)
          {
             delta   = fxy_x((*P_f),H,p) * fxy_y((*P_g),H,p)
                                            -
                       fxy_x((*P_g),H,p) * fxy_y((*P_f),H,p);


            delta_p.x = (  (-(*P_f)(p.x,p.y))  * fxy_y((*P_g),H,p)
                                         -
                          (-(*P_g)(p.x,p.y)) * fxy_y((*P_f),H,p)  )
                                         /
                                       delta;


            delta_p.y = (  fxy_x((*P_f),H,p) * (-(*P_g)(p.x,p.y))
                                               -
                          fxy_x((*P_g),H,p) * (-(*P_f)(p.x,p.y))  )
                                               /
                                             delta;

                  p.x += delta_p.x;
                  p.y += delta_p.y;
            }

 return(p);
}
/* --------------------------------- */
/* --------------------------------- */
pt2d p_newton_fxy(
int n,
double (*P_f)(double x, double y),
double (*P_g)(double x, double y),
pt2d  p
)
{
int   k;
double   delta;
pt2d  delta_p;

       for(k=1; k<n; k++)
          {	  
             delta   = fxy_x((*P_f),H,p) * fxy_y((*P_g),H,p)
                                            -
                       fxy_x((*P_g),H,p) * fxy_y((*P_f),H,p);


            delta_p.x = (  (-(*P_f)(p.x,p.y))  * fxy_y((*P_g),H,p)
                                         -
                          (-(*P_g)(p.x,p.y)) * fxy_y((*P_f),H,p)  )
                                         /
                                       delta;


            delta_p.y = (  fxy_x((*P_f),H,p) * (-(*P_g)(p.x,p.y))
                                               -
                          fxy_x((*P_g),H,p) * (-(*P_f)(p.x,p.y))  )
                                               /
                                             delta;
                                             
                                             
             printf(" x%d\t\t=%+f\t\t  y%d\t\t=%+f\n",k,p.x, k,p.y);                                             
             printf(" delta_p.x%d\t=%+f\t\t  delta_p.y%d\t=%+f\n\n",
                         k,delta_p.x, k,delta_p.y);	  
                                   
                  p.x += delta_p.x;
                  p.y += delta_p.y;                                   
            }
            
  printf(" x%d\t\t=%+f\t\t  y%d\t\t=%+f\n\n",k,p.x, k,p.y); 

return(p);
}
/* --------------------------------- */
/* --------------------------------- */


L'algorithme est simple :

On a ce système d'équation, on utilise la méthode de cramer pour le résoudre :


   |f_x f_y|  x =  -f
   |g_x g_y|  y =  -g
   
x0, y0 sont estimés par rapport à un graphe.
A chaque itération on produit les valeurs xn et yn.
   deter =|f_x(x0,y0) f_y(x0,y0)| 
          |g_x(x0,y0) g_y(x0,y0)|  
   
   
          |-f(x0,y0) f_y(x0,y0)| 
   xn =   |                    | / deter
          |-g(x0,y0) g_y(x0,y0)|  
    
          |f_x(x0,y0) -f(x0,y0)| 
   yn =   |                    | / deter
          |g_x(x0,y0) -g(x0,y0)|  
   
   Puis x1 = x0 + xn    et y1 = y0 + yn. 
   x1 et y1 deviennent les nouveaux x0 et y0 ...