18 #ifndef BUBBLEPROFILER_UNIVARIATE_INTERPOLATION_HPP_INCLUDED 19 #define BUBBLEPROFILER_UNIVARIATE_INTERPOLATION_HPP_INCLUDED 28 template <
typename Scalar,
typename Data>
32 using index_type =
typename Data::size_type;
34 const auto num_x_points = xdata.size();
36 const Scalar xmin = xdata[0];
37 const Scalar xmax = xdata[num_x_points - 1];
39 index_type upper_index;
42 }
else if (x >= xmax) {
43 upper_index = num_x_points - 1;
45 const auto upper_it = std::upper_bound(std::begin(xdata),
47 upper_index = std::distance(std::begin(xdata), upper_it);
50 index_type lower_index = upper_index - 1;
52 const Scalar x_lower = (x - xdata[upper_index])
53 / (xdata[lower_index] - xdata[upper_index]);
54 const Scalar x_upper = (x - xdata[lower_index])
55 / (xdata[upper_index] - xdata[lower_index]);
57 return ydata[lower_index] * x_lower + ydata[upper_index] * x_upper;
60 template <
typename Scalar,
typename Data>
64 using index_type =
typename Data::size_type;
66 const auto num_x_points = xdata.size();
68 index_type upper_index;
71 }
else if (x >= xdata[num_x_points - 1]) {
72 upper_index = num_x_points - 1;
74 const auto upper_it = std::upper_bound(std::begin(xdata),
76 upper_index = std::distance(std::begin(xdata), upper_it);
79 index_type center_index = upper_index - 1;
80 index_type lower_index = upper_index - 2;
82 const Scalar xdata_lower = xdata[lower_index];
83 const Scalar xdata_center = xdata[center_index];
84 const Scalar xdata_upper = xdata[upper_index];
86 const Scalar x_lower = (x - xdata_center) * (x - xdata_upper)
87 / ((xdata_lower - xdata_center) * (xdata_lower - xdata_upper));
88 const Scalar x_center = (x - xdata_lower) * (x - xdata_upper)
89 / ((xdata_center - xdata_lower) * (xdata_center - xdata_upper));
90 const Scalar x_upper = (x - xdata_lower) * (x - xdata_center)
91 / ((xdata_upper - xdata_lower) * (xdata_upper - xdata_center));
93 return ydata[lower_index] * x_lower + ydata[center_index] * x_center
94 + ydata[upper_index] * x_upper;
Scalar linear_lagrange_interpolation_at_point(Scalar x, const Data &xdata, const Data &ydata)
Scalar quadratic_lagrange_interpolation_at_point(Scalar x, const Data &xdata, const Data &ydata)