11 Container<Number>
simple_spline(
const Container<Number>& X,
const Container<Number>& Y,
SizeT degree) {
12 if (X.size() != Y.size()) {
13 std::cerr <<
"Error in function " << __FUNCTION__
14 <<
": Vectors X (of size " << X.size()
15 <<
") and Y (of size " << Y.size()
16 <<
") are not the same size. Returning an empty array..." << std::endl;
20 const auto n = X.size();
21 const auto m = degree + 1;
24 std::cerr <<
"Error in function " << __FUNCTION__
25 <<
": Number of points (" << n
26 <<
") is bigger than degree + 1 (" << m
27 <<
"). The spline is not simple. Returning an empty array..." << std::endl;
36 Container<Number> coeffs(m, 0);
42 Container<Number> coeffs(m, 0);
43 coeffs[m-2] = (Y[1] - Y[0]) / (X[1] - X[0]);
49 const auto h1 = X[1] - X[0], h2 = X[2] - X[1];
50 const auto d1 = (Y[1] - Y[0]) / h1, d2 = (Y[2] - Y[1]) / h2;
52 Container<Number> coeffs(2*m, 0);
54 coeffs[m-3] = (d2 - d1) / (h1 + h2);
55 coeffs[m-2] = d1 - h1 * coeffs[m-3];
57 coeffs[2*m-3] = coeffs[m-3];
58 coeffs[2*m-2] = d1 + h1 * coeffs[m-3];
65 const auto h1 = X[1]-X[0], h2 = X[2]-X[1];
66 const auto h12 = X[2]-X[0], h13 = X[3]-X[0];
67 const auto d1 = Y[1]-Y[0], d12 = Y[2]-Y[0], d13 = Y[3]-Y[0];
70 {{std::pow(h1, 3), std::pow(h1, 2), h1},
71 {std::pow(h12, 3), std::pow(h12, 2), h12},
72 {std::pow(h13, 3), std::pow(h13, 2), h13}},
75 std::cerr <<
"Error in function " << __FUNCTION__ <<
": Could not compute. Returning an empty array..." << std::endl;
79 const auto a = abc[0], b = abc[1], c = abc[2];
81 Container<Number> coeffs(3*m, 0);
88 coeffs[2*m-3] = 3 * a * h1 + b;
89 coeffs[2*m-2] = 3 * a * std::pow(h1, 2) + 2 * b * h1 + c;
92 coeffs[3*m-3] = 3 * a * h2 + coeffs[2*m-3];
93 coeffs[3*m-2] = 3 * a * std::pow(h2, 2) + 2 * coeffs[2*m-3] * h2 + coeffs[2*m-2];
99 std::cerr <<
"Error in function " << __FUNCTION__
100 <<
": Number of points (" << n
101 <<
") is too big (bigger than 4). Returning an empty array..." << std::endl;