Hi all,
I am trying to interpolate some data with a catmull_rom spline available in boost math (interpolation). However, the resulting spline has a strange behavior; especially, at its ends (see the attached image).
Just out of curiosity, I also tried to normalise my data to [0-1] range. However, the line has had even worse behavior (see the attached image).
Below, the c++ code segment of the interpolation is depicted:
std::vector<std::array<double, 2>> points_intr(16);
points_intr[0] = { 1.263270, 0.774614 };
points_intr[1] = { 1.876, 2.480 };
points_intr[2] = { 1.651110, 4.550 };
points_intr[3] = { 1.426340, 5.688 };
points_intr[4] = { 1.429, 7.054 };
points_intr[5] = { 2.073220, 8.377020 };
points_intr[6] = { 3.910, 9.140 };
points_intr[7] = { 6.430, 9.537 };
points_intr[8] = { 8.950, 9.859 };
points_intr[9] = { 11.470, 10.317 };
points_intr[10] = { 12.730, 10.6456 };
points_intr[11] = { 13.990, 11.0741 };
points_intr[12] = { 15.335, 11.6928 };
points_intr[13] = { 16.680, 12.5661 };
points_intr[14] = { 18.3538, 14.830 };
points_intr[15] = { 18.700, 16.056 };
bm::catmull_rom<std::array<double, 2>>
interpolator_cr(std::move(points_intr));
std::vector<double> x_linspace_cr(100);
std::vector<std::array<double, 2>> inter_points(100);
linspace(1.263270, 18.700, 100, x_linspace_cr); // evaluation points along the line
for (std::size_t i{0}; i < x_linspace_cr.size(); ++i)
{
inter_points[i] = interpolator_cr(x_linspace_cr[i]);
}
Should I have to add additional (ghost) points at both ends? If yes, is there any optimum way to calculate where exactly to poisition these points? I understand if I get the derivatives at both end I can calculate a straight line that the additional points should lie within. However, how should I calculate the distance from the end points?
I hope I am not doing anything fundamentally wrong. Any help would be much appreciated.
Many thanks!