16 template <
class T,
class VECTOR>
17 T
interpolate(
const T&
x,
const VECTOR& ys,
const T& x0,
const T& x1)
22 const size_t N = ys.size();
23 if (
x <= x0)
return ys[0];
24 if (
x >= x1)
return ys[N - 1];
25 const T Ax = (x1 - x0) / T(N);
26 const size_t i = int((
x - x0) / Ax);
27 if (i >= N - 1)
return ys[N - 1];
28 const T Ay = ys[i + 1] - ys[i];
29 return ys[i] + (
x - (x0 + i * Ax)) * Ay / Ax;
33 template <
typename NUMTYPE,
class VECTORLIKE>
35 const NUMTYPE
t,
const VECTORLIKE&
x,
const VECTORLIKE&
y,
bool wrap2pi)
43 for (
unsigned int i = 0; i < 3; i++) h[i] =
x[i + 1] -
x[i];
45 double k = 1 / (4 * h[0] * h[1] + 4 * h[0] * h[2] + 3 * h[1] * h[1] +
47 double a11 = 2 * (h[1] + h[2]) * k;
48 double a12 = -h[1] * k;
49 double a22 = 2 * (h[0] + h[1]) * k;
51 double y0, y1, y2, y3;
89 double b1 = (y2 - y1) / h[1] - (y1 - y0) / h[0];
90 double b2 = (y3 - y2) / h[2] - (y2 - y1) / h[1];
93 double z1 = 6 * (a11 *
b1 + a12 *
b2);
94 double z2 = 6 * (a12 *
b1 + a22 *
b2);
99 res = (z1 * pow((
t -
x[0]), 3) + z0 * pow((
x[1] -
t), 3)) / (6 * h[0]) +
100 (y1 / h[0] - h[0] / 6 * z1) * (
t -
x[0]) +
101 (y0 / h[0] - h[0] / 6 * z0) * (
x[1] -
t);
105 res = (z2 * pow((
t -
x[1]), 3) + z1 * pow((
x[2] -
t), 3)) /
107 (y2 / h[1] - h[1] / 6 * z2) * (
t -
x[1]) +
108 (y1 / h[1] - h[1] / 6 * z1) * (
x[2] -
t);
110 res = (z3 * pow((
t -
x[2]), 3) + z2 * pow((
x[3] -
t), 3)) /
112 (y3 / h[2] - h[2] / 6 * z3) * (
t -
x[2]) +
113 (y2 / h[2] - h[2] / 6 * z2) * (
x[3] -
t);
118 template <
typename NUMTYPE,
class VECTORLIKE,
int NUM_POINTS>
120 const NUMTYPE
t,
const VECTORLIKE&
x,
const VECTORLIKE&
y,
bool wrap2pi)
128 const size_t N =
x.size();
131 const NUMTYPE x_min =
x.minimum();
132 Eigen::Matrix<NUMTYPE, 2, NUM_POINTS> Xt;
134 for (
size_t i = 0; i < N; i++)
136 Xt.set_unsafe(0, i, 1);
137 Xt.set_unsafe(1, i,
x[i] - x_min);
140 const auto B = ((Xt * Xt.transpose()).
inv().eval() * Xt *
y).eval();
143 NUMTYPE ret = B[0] + B[1] * (
t - x_min);
155 class VECTORLIKE1,
class VECTORLIKE2,
class VECTORLIKE3,
int NUM_POINTS>
157 const VECTORLIKE1& ts, VECTORLIKE2& outs,
const VECTORLIKE3&
x,
158 const VECTORLIKE3&
y,
bool wrap2pi)
166 const size_t N =
x.size();
169 using NUM =
typename VECTORLIKE3::value_type;
170 const NUM x_min =
x.minimum();
171 Eigen::Matrix<NUM, 2, NUM_POINTS> Xt;
173 for (
size_t i = 0; i < N; i++)
175 Xt.set_unsafe(0, i, 1);
176 Xt.set_unsafe(1, i,
x[i] - x_min);
179 const auto B = ((Xt * Xt.transpose()).
inv().eval() * Xt *
y).eval();
182 const size_t tsN = size_t(ts.size());
185 for (
size_t k = 0; k < tsN; k++)
186 outs[k] = B[0] + B[1] * (ts[k] - x_min);
188 for (
size_t k = 0; k < tsN; k++)
NUMTYPE leastSquareLinearFit(const NUMTYPE t, const VECTORLIKE &x, const VECTORLIKE &y, bool wrap2pi=false)
Interpolates or extrapolates using a least-square linear fit of the set of values "x" and "y"...
T interpolate(const T &x, const VECTOR &ys, const T &x0, const T &x1)
Interpolate a data sequence "ys" ranging from "x0" to "x1" (equally spaced), to obtain the approximat...
#define ASSERT_(f)
Defines an assertion mechanism.
This base provides a set of functions for maths stuff.
T wrapToPi(T a)
Modifies the given angle to translate it into the ]-pi,pi] range.
NUMTYPE spline(const NUMTYPE t, const VECTORLIKE &x, const VECTORLIKE &y, bool wrap2pi=false)
Interpolates the value of a function in a point "t" given 4 SORTED points where "t" is between the tw...
EIGEN_STRONG_INLINE PlainObject inv() const