Mathc matrices/c25n

Un livre de Wikilivres.


Application ou Pseudo Inverse


Installer et compiler ces fichiers dans votre répertoire de travail.


c01h.c
/* ------------------------------------ */
/*  Save as :   c01h.c                    */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
/* ------------------------------------ */
#define   RA R5
#define   CA C5
/* ------------------------------------ */
#define FACTOR_E        +1.E-2         
/* ------------------------------------ */
void fun(void)
{
	double xy[6] ={
   1,     -2,
   2,     -3,
   3,      6    };
   
double tA[RA*CA]={
/* x**2     y**2     x        y        e     */
  +1.00,   +0.00,   +0.00,   +0.00,   +0.00, 
  +0.00,   +1.00,   +0.00,   +0.00,   +0.00,    
  +1.00,   +4.00,   +1.00,   -2.00,   +1.00,     
  +4.00,   +9.00,   +2.00,   -3.00,   +1.00,   
  +9.00,  +36.00,   +3.00,   +6.00,   +1.00 
};

double tb[RA*C1]={
/*  = 0   */
 +1.00, 
 +1.00, 
 +0.00, 
 +0.00, 
 +0.00
};

double **XY      = ca_A_mR(xy,i_mR(R3,C2));
double **A       = ca_A_mR(tA,i_mR(RA,CA));
double **b       = ca_A_mR(tb,i_mR(RA,C1));
double **Pinv    = i_mR(CA,RA);           
double **Pinvb   = i_mR(CA,C1);          

  clrscrn();
  printf("\n");
  printf(" Find the coefficients a, b, c, d,  of a circle  \n\n");
  printf("     ax**2 + ay**2 + bx + cy + d  = 0            \n\n");
  printf(" that passes through these three XY.         \n\n");
  printf("    x     y");
  p_mR(XY,S5,P0,C6);
  stop();
  
  clrscrn(); 
  printf(" Using the given XY, we obtain this matrix.\n");
  printf("  (a = 1. This is my choice)\n\n");
  printf(" A :");
  p_mR(A,S10,P2,C7);
  printf(" b :");
  p_mR(b,S10,P2,C7);
   
  printf(" Pinv = V * invS_T * U_T ");
  pseudo_Rn_mR(A,Pinv,FACTOR_E); 
  pE_mR(Pinv,S12,P4,C10); 
  stop();
  
  clrscrn(); 
  printf(" Pinv = V * invS_T * U_T "); 
  p_mR(Pinv,S10,P4,C10);  
  
  printf(" x = Pinv * b ");   
  mul_mR(Pinv,b,Pinvb); 
  p_mR(Pinvb,S10,P4,C10);
  printf(" The coefficients a, b, c, d, e, of the curve are : \n\n"
         "  %+.2fx**2 %+.2fy**2 %+.2fx %+.2fy %+.2f = 0\n\n"
            ,Pinvb[R1][C1],Pinvb[R2][C1],Pinvb[R3][C1],
             Pinvb[R4][C1],Pinvb[R5][C1]);       
  stop(); 
   
  f_mR(XY);    
  f_mR(A);
  f_mR(b); 
  f_mR(Pinv);
  f_mR(Pinvb); 
}
/* ------------------------------------ */
int main(void)
{
  
  fun();

  return 0;
}
/* ------------------------------------ */
/* ------------------------------------ */



Exemple de sortie écran :
 -----------------------------------
 Find the coefficients a, b, c, d,  of a circle  

     ax**2 + ay**2 + bx + cy + d  = 0            

 that passes through these three XY.         

    x     y
   +1    -2 
   +2    -3 
   +3    +6 

 Press return to continue. 


 -----------------------------------
 Using the given XY, we obtain this matrix.
  (a = 1. This is my choice)

 A :
     +1.00      +0.00      +0.00      +0.00      +0.00 
     +0.00      +1.00      +0.00      +0.00      +0.00 
     +1.00      +4.00      +1.00      -2.00      +1.00 
     +4.00      +9.00      +2.00      -3.00      +1.00 
     +9.00     +36.00      +3.00      +6.00      +1.00 

 b :
     +1.00 
     +1.00 
     +0.00 
     +0.00 
     +0.00 



 Press return to continue. 


 -----------------------------------
 Pinv = V * invS_T * U_T 
   +1.0000    +0.0000    +0.0000    -0.0000    -0.0000 
   -0.0000    +1.0000    -0.0000    +0.0000    +0.0000 
   -3.2000    -7.2000    -0.9000    +0.8000    +0.1000 
   -0.2000    -2.2000    +0.1000    -0.2000    +0.1000 
   +1.8000    -1.2000    +2.1000    -1.2000    +0.1000 

 x = Pinv * b 
   +1.0000 
   +1.0000 
  -10.4000 
   -2.4000 
   +0.6000 

 The coefficients a, b, c, d, e, of the curve are : 

  +1.00x**2 +1.00y**2 -10.40x -2.40y +0.60 = 0

 Press return to continue.