All pastes #986115 Raw Edit

Untitled

public text v1 · immutable
·published 2008-04-15 15:22 UTC
rendered paste body
void do_lagrange(int num_pairs, double data_point[][2], int k, double x, double *y)
{

   int i           = 0;  // counter variable.
   int j           = 0;  // counter variable.
   int up          = 0;  // upper bounds container.
   int low         = 0;  // lower bounds container.
   int start_point = 0;  // index of closest point.
   int nodes_above = 0;  // nodes above end_point.
   int nodes_below = 0;  // nodes below end_point.
   int FOUND_END   = -1; // end_point flag.

   double p    = 1.0;    // cardinal function result.
   
   // case: user is trying to interpolate outside the table (right end).
   if ( x > data_point[num_pairs - 1][0] )
   {
      printf( " Cannot interpolate outside the table!\n" );
      exit(1);
   }

   else if ( x < data_point[0][0] )
   {
      printf( " Cannot interpolate outside the table!\n" );
      exit(1);
   }

   // scan nodes.
   while ( data_point[start_point][0] < x )
      start_point++;

   low = start_point - ( k / 2 );
   up  = start_point + ( k / 2 );

   if ( low < 0 )
      start_point = 0;
   else if ( up > num_pairs - 1 )
      start_point = start_point - ( k - 1 );
   else
      start_point = start_point - ( k / 2 );


   // lagrange interpolation.
   for ( i = start_point; i < ( start_point + k ); i++ )
   {
      p = 1;

      for ( j = start_point; j < ( start_point + k ); j++ )
      {
         if ( i == j )
            continue;

         p *= ( ( x - data_point[j][0] ) / ( data_point[i][0] - data_point[j][0] ) );
      }

      *y += p * data_point[i][1];
   }

}