rendered paste bodyvoid 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];
}
}