12 const Container<Number>& X,
13 const Container<Number>& Y,
14 const Container<Number>& xx,
16 const Number& epsilon = std::numeric_limits<Number>::epsilon()
18 if (X.size() != Y.size()) {
19 std::cerr <<
"Error in function " << __FUNCTION__
20 <<
": Vectors X (of size " << X.size()
21 <<
") and Y (of size " << Y.size()
22 <<
") are not the same size. Returning an empty array..." << std::endl;
27 std::cerr <<
"Error in function " << __FUNCTION__
28 <<
": Vectors X and Y are empty. Cannot interpolate. Returning an empty array..." << std::endl;
32 const auto N = X.size();
35 Container<Number> W(N);
38 for (
SizeT j = 1; j <= N / 2; ++j) {
39 W[j] = -W[j-1] * (
static_cast<Number
>(N - j)) /
static_cast<Number
>(j);
41 for (
SizeT j = N / 2 + 1; j < N; ++j) {
43 W[j] = std::abs(W[N-1-j]);
45 W[j] = -std::abs(W[N-1-j]);
57 for (
SizeT j = 0; j < N; ++j) {
58 W[j] = (j % 2 == 0 ? 1 : -1) * std::sin(((2 *
static_cast<Number
>(j) + 1) * M_PI) / (2 *
static_cast<Number
>(N)));
61 W[0] = 1 /
static_cast<Number
>(2);
62 for (
SizeT j = 1; j < N - 1; ++j) {
63 W[j] = (j % 2 == 0 ? 1 : -1) / ((N - 2) * std::sin(((
static_cast<Number
>(2*j - 1) * M_PI) /
static_cast<Number
>(2*N - 4))));
65 W[N-1] = (N % 2 == 0 ? -1 : 1) /
static_cast<Number
>(2);
67 for (
SizeT j = 0; j < N; ++j) {
68 W[j] = (j % 2 == 0 ? 1 : -1);
69 if (j == 0 || j == N - 1) {
74 for (
SizeT j = 0; j < N; ++j) {
75 W[j] = (j % 2 == 0 ? 1 : -1) * std::cos((
static_cast<Number
>(2*j) * M_PI) /
static_cast<Number
>(2*N - 1) / 2);
81 for (
SizeT j = 0; j < N; ++j) {
82 W[j] = (j % 2 == 0 ? 1 : -1) * std::sin((
static_cast<Number
>(2*j + 1) * M_PI) /
static_cast<Number
>(2*N - 1) / 2);
91 for (
SizeT j = 0; j < N; ++j) {
93 for (
SizeT k = 0; k < N; ++k) {
96 W[j] /= (X[j] - X[k]);
102 const auto nn = xx.size();
104 Container<Number> result(nn);
106#if defined(_OPENMP) && !defined(ALFI_DISABLE_OPENMP)
107#pragma omp parallel for
109 for (
SizeT k = 0; k < nn; ++k) {
110 Number numerator = 0, denominator = 0;
113 for (
SizeT i = 0; i < N; ++i) {
118 const auto x_diff = xx[k] - X[i];
119 const auto temp = W[i] / x_diff;
120 numerator += temp * Y[i];
124 if (exact_idx != N) {
125 result[k] = Y[exact_idx];
127 result[k] = numerator / denominator;