19#include <range/v3/range/conversion.hpp>
28 std::vector<double> supporting_points,
31 bool supp_pnts_sorted)
32 : supp_pnts_(std::move(supporting_points)),
33 values_at_supp_pnts_(std::move(values_at_supp_pnts))
35 if (!supp_pnts_sorted)
45 const std::size_t i = std::distance(
supp_pnts_.begin(), it);
47 "Variable {:d} and variable {:d} are the same. Piecewise linear "
48 "interpolation is not possible\n",
54 std::vector<int>
const& supporting_points,
55 std::vector<double>
const& values_at_supp_pnts,
56 bool supp_pnts_sorted)
57 : supp_pnts_(supporting_points | ranges::to<std::vector<double>>()),
58 values_at_supp_pnts_(values_at_supp_pnts)
60 if (!supp_pnts_sorted)
70 const std::size_t i = std::distance(
supp_pnts_.begin(), it);
72 "Variable {:d} and variable {:d} are the same. Piecewise linear "
73 "interpolation is not possible\n",
93 std::size_t
const interval_idx = std::distance(
supp_pnts_.begin(), it) - 1;
97 double const x_r =
supp_pnts_[interval_idx + 1];
104 const double t = (pnt_to_interpolate - x) / (x_r - x);
105 return std::lerp(f, f_r,
t);
109 double const pnt_to_interpolate)
const
111 if (pnt_to_interpolate <
supp_pnts_.front() ||
118 pnt_to_interpolate));
119 std::size_t interval_idx = std::distance(
supp_pnts_.begin(), it);
126 if (interval_idx > 1 && interval_idx <
supp_pnts_.size() - 2)
129 double const x_ll =
supp_pnts_[interval_idx - 2];
130 double const x_l =
supp_pnts_[interval_idx - 1];
132 double const x_r =
supp_pnts_[interval_idx + 1];
140 double const tangent_right = (f_l - f_r) / (x_l - x_r);
141 double const tangent_left = (f_ll - f) / (x_ll - x);
142 double const w = (pnt_to_interpolate - x) / (x_l - x);
143 return (1. - w) * tangent_right + w * tangent_left;
Definition of the PiecewiseLinearInterpolation class.
std::vector< double > supp_pnts_
std::vector< double > values_at_supp_pnts_
double getSupportMin() const
PiecewiseLinearInterpolation(std::vector< double > supporting_points, std::vector< double > values_at_supp_pnts, bool supp_pnts_sorted=false)
double getDerivative(double const pnt_to_interpolate) const
Calculates derivative using quadratic interpolation and central difference quotient.
double getSupportMax() const
double getValue(double pnt_to_interpolate) const
Calculates the interpolation value.
void quicksort(It1 first1, It1 last1, It2 first2, Comparator compare)
Definition of the quicksort function.