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]; } }