Linear Algebra and the C Language/a044


Install and compile this file in your working directory.

/* ------------------------------------ */
/*  Save as:   c00c.c                   */
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
/* ------------------------------------ */
#define   RA R5
#define   CA C5
/* ------------------------------------ */
#define FACTOR_E        +1.E-0         
/* ------------------------------------ */
int main(void)
{
double  txy[8] ={
   1,       4,
   2,       5,
   3,      -7,
   4,       5  };
   
double tA[RA*CA]={
/* x**2    y**2    x       y       e     */
  +1,     +0,     +0,     +0,     +0,        
  +1,    +16,     +1,     +4,     +1,        
  +4,    +25,     +2,     +5,     +1,        
  +9,    +49,     +3,     -7,     +1,        
 +16,    +25,     +4,     +5,     +1,                
};

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

double **xy      =    ca_A_mR(txy,    i_mR(R4,C2));
double **A       =    ca_A_mR(tA,     i_mR(RA,CA));
double **b       =    ca_A_mR(tb,     i_mR(RA,C1));
double **Pinv    = Pinv_Rn_mR(A,      i_mR(CA,RA),FACTOR_E);            
double **Pinvb   =     mul_mR(Pinv,b, i_mR(CA,C1));         

  clrscrn();
  printf("\n");
  printf(" Find the coefficients a, b, c, d, e, of the curve \n\n");
  printf("     ax**2 + by**2 + cx + dy + e  = 0 \n\n");
  printf(" that passes through these four points.\n\n");
  printf("         x          y");
  p_mR(xy, S10,P0,C6);
  stop();
  
  clrscrn();
  printf(" Using the given points, 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 "); 
  pE_mR(Pinv, S12,P4,C10); 
  stop();
  
  clrscrn();
  printf(" Solving this system yields a unique\n"
         " least squares solution, namely   \n\n");  
  printf(" Pinv b ");   
  p_mR(Pinvb, S10,P4,C10);
  printf(" The coefficients a, b, c, d, e, of the curve are: \n\n"
         "  %+.9f*x^2 %+.9f*y^2 %+.9f*x %+.9f*y %+.9f = 0\n\n"
            ,Pinvb[R1][C1],Pinvb[R2][C1],Pinvb[R3][C1],
             Pinvb[R4][C1],Pinvb[R5][C1]);      
  stop();  

  f_mR(xy);
  f_mR(b);
  f_mR(A);
  f_mR(Pinv);
  f_mR(Pinvb); 

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


Screen output example:
 Find the coefficients a, b, c, d, e, of the curve 

     ax**2 + by**2 + cx + dy + e  = 0 

 that passes through these four points.

         x          y
        +1         +4 
        +2         +5 
        +3         -7 
        +4         +5 

 Press return to continue. 


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

 A :
     +1.00      +0.00      +0.00      +0.00      +0.00 
     +1.00     +16.00      +1.00      +4.00      +1.00 
     +4.00     +25.00      +2.00      +5.00      +1.00 
     +9.00     +49.00      +3.00      -7.00      +1.00 
    +16.00     +25.00      +4.00      +5.00      +1.00 

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

 Pinv = V * invS_T * U_T 
 +1.0000e+00  +9.8734e-11  -8.1187e-11  +4.7280e-12  +8.7404e-12 
 +2.8030e-01  -9.0909e-02  +1.3258e-01  +7.5758e-03  -4.9242e-02 
 -6.0000e+00  -6.1187e-10  -5.0000e-01  -2.9365e-11  +5.0000e-01 
 +4.7727e-01  -1.8182e-01  +3.0682e-01  -6.8182e-02  -5.6818e-02 
 -1.3939e+00  +3.1818e+00  -2.8485e+00  +1.5152e-01  +5.1515e-01 

 Press return to continue. 


 Solving this system yields a unique
 least squares solution, namely   

 Pinv * b 
   +1.0000 
   +0.2803 
   -6.0000 
   +0.4773 
   -1.3939 

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

  +1.000000000*x^2 +0.280303030*y^2 -6.000000000*x +0.477272727*y -1.393939394 = 0

 Press return to continue.


Copy and paste in Octave:
function xy = f (x,y)
  xy = +1.000000000*x^2 +0.280303030*y^2 -6.000000000*x +0.477272727*y -1.393939394;
endfunction

f (+1,+4) 
f (+2,+5) 
f (+3,-7)
f (+4,+5)