10 Container<Number>
simple_spline(
const Container<Number>& X,
const Container<Number>& Y,
SizeT degree) {
11 if (X.size() != Y.size()) {
12 std::cerr <<
"Error in function " << __FUNCTION__
13 <<
": Vectors X (of size " << X.size()
14 <<
") and Y (of size " << Y.size()
15 <<
") are not the same size. Returning an empty array..." << std::endl;
19 const auto n = X.size();
20 const auto m = degree + 1;
23 std::cerr <<
"Error in function " << __FUNCTION__
24 <<
": Number of points (" << n
25 <<
") is bigger than degree + 1 (" << m
26 <<
"). The spline is not simple. Returning an empty array..." << std::endl;
35 Container<Number> coeffs(m, 0);
41 Container<Number> coeffs(m, 0);
42 coeffs[m-2] = (Y[1] - Y[0]) / (X[1] - X[0]);
48 const auto h1 = X[1] - X[0], h2 = X[2] - X[1];
49 const auto d1 = (Y[1] - Y[0]) / h1, d2 = (Y[2] - Y[1]) / h2;
51 Container<Number> coeffs(2*m, 0);
53 coeffs[m-3] = (d2 - d1) / (h1 + h2);
54 coeffs[m-2] = d1 - h1 * coeffs[m-3];
56 coeffs[2*m-3] = coeffs[m-3];
57 coeffs[2*m-2] = d1 + h1 * coeffs[m-3];
64 const auto h1 = X[1]-X[0], h2 = X[2]-X[1];
65 const auto h12 = X[2]-X[0], h13 = X[3]-X[0];
66 const auto d1 = Y[1]-Y[0], d12 = Y[2]-Y[0], d13 = Y[3]-Y[0];
69 {{std::pow(h1, 3), std::pow(h1, 2), h1},
70 {std::pow(h12, 3), std::pow(h12, 2), h12},
71 {std::pow(h13, 3), std::pow(h13, 2), h13}},
74 std::cerr <<
"Error in function " << __FUNCTION__ <<
": Could not compute. Returning an empty array..." << std::endl;
78 const auto a = abc[0], b = abc[1], c = abc[2];
80 Container<Number> coeffs(3*m, 0);
87 coeffs[2*m-3] = 3 * a * h1 + b;
88 coeffs[2*m-2] = 3 * a * std::pow(h1, 2) + 2 * b * h1 + c;
91 coeffs[3*m-3] = 3 * a * h2 + coeffs[2*m-3];
92 coeffs[3*m-2] = 3 * a * std::pow(h2, 2) + 2 * coeffs[2*m-3] * h2 + coeffs[2*m-2];
98 std::cerr <<
"Error in function " << __FUNCTION__
99 <<
": Number of points (" << n
100 <<
") is too big (bigger than 4). Returning an empty array..." << std::endl;