15#ifndef BSPLINE_INTERPOLATION_INTERPOLATION_H
16#define BSPLINE_INTERPOLATION_INTERPOLATION_H
18#include <bspline/Spline.h>
19#include <bspline/exceptions/BSplineException.h>
20#include <bspline/internal/misc.h>
21#include <bspline/support/Support.h>
23#ifdef BSPLINE_INTERPOLATION_USE_EIGEN
24#include <eigen3/Eigen/Dense>
27#ifdef BSPLINE_INTERPOLATION_USE_ARMADILLO
43enum class Node { FIRST, LAST };
61#ifndef BSPLINE_DOXYGEN_IGNORE
95 virtual T &
M(
size_t i,
size_t j) = 0;
103 virtual T &
b(
size_t i) = 0;
108 virtual void solve() = 0;
116 virtual T &
x(
size_t i) = 0;
127template <
typename T,
size_t order>
129 static_assert(
order >= 1,
"Order may not be zero.");
130 std::array<Boundary<T>,
order - 1>
ret;
131 for (
size_t i = 0;
i <
order - 1;
i++) {
167template <
typename T,
size_t order,
class Solver>
171 internal::defaultBoundaries<T, order>()) {
172 static_assert(
order >= 1,
"Order may not be zero.");
173 static_assert(std::is_base_of<internal::ISolver<T>,
Solver>::value,
174 "Solver must be a subclass of internal::ISolver<T>.");
182 ErrorCode::UNDETERMINED,
183 "At least two grid points needed for interpolation.");
192 const T dx1 = (
x[0] -
x[1]) /
static_cast<T>(2);
195 for (
size_t i = 0;
i <=
order;
i++) {
204 if (
bo.derivative == 0 ||
bo.derivative >
order) {
206 "Unsupported order of the derivative.");
208 if (
bo.node == Node::FIRST) {
210 for (
size_t i =
bo.derivative;
i <=
order;
i++) {
212 bspline::internal::facultyRatio<T>(
i,
i -
bo.derivative) *
222 for (
size_t c = 1;
c + 1 <
x.
size();
c++) {
223 const T dx1 = (
x[
c] -
x[
c - 1]) /
static_cast<T>(2);
224 const T dx2 = (
x[
c] -
x[
c + 1]) /
static_cast<T>(2);
228 for (
size_t i = 0;
i <=
order;
i++) {
238 for (
size_t i = 0;
i <=
order;
i++) {
265 for (
size_t i = 0;
i <=
order;
i++) {
274 if (
bo.node == Node::LAST) {
276 for (
size_t i =
bo.derivative;
i <=
order;
i++) {
278 bspline::internal::facultyRatio<T>(
i,
i -
bo.derivative) *
294 std::vector<std::array<T, NUM_COEFFS>>
coeffs((
x.
size() - 1));
295 for (
size_t i = 0;
i + 1 <
x.
size();
i++) {
303#ifdef BSPLINE_INTERPOLATION_USE_ARMADILLO
322template <
size_t order>
326 internal::defaultBoundaries<double, order>()) {
337 double &
M(
size_t i,
size_t j)
override {
return _M(
i,
j); };
338 double &
b(
size_t i)
override {
return _b(
i); };
339 void solve()
override {
_x = arma::solve(
_M,
_b); };
340 double &
x(
size_t i)
override {
return _x(
i); };
348#ifdef BSPLINE_INTERPOLATION_USE_EIGEN
367template <
typename T,
size_t order>
371 internal::defaultBoundaries<T, order>()) {
372 using DeMat = Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>;
373 using DeVec = Eigen::Matrix<T, Eigen::Dynamic, 1>;
385 T &
M(
size_t i,
size_t j)
override {
return _M(
i,
j); };
386 T &
b(
size_t i)
override {
return _b(
i); };
387 void solve()
override {
_x =
_M.colPivHouseholderQr().solve(
_b); };
388 T &
x(
size_t i)
override {
return _x(
i); };
The main exception class.
Definition BSplineException.h:84
Represents a global Grid.
Definition Grid.h:27
size_t size() const
Returns the number of elements of the Grid.
Definition Grid.h:169
const T & back() const
Returns a reference to the last element of the Grid.
Definition Grid.h:244
const T & front() const
Returns a reference to the first element of the Grid.
Definition Grid.h:231
Represents the Spline's Support.
Definition Support.h:33
Exceptions and error codes.
Definition BSplineException.h:19
Code to interpolate data using the bspline::Spline.
Definition interpolation.h:34
bspline::Spline< T, order > interpolateUsingEigen(Support< T > x, const std::vector< T > &y, const std::array< Boundary< T >, order - 1 > &boundaries=internal::defaultBoundaries< T, order >())
Interpolation using eigen solver.
Definition interpolation.h:368
bspline::Spline< T, order > interpolate(Support< T > x, const std::vector< T > &y, const std::array< Boundary< T >, order - 1 > &boundaries=internal::defaultBoundaries< T, order >())
Interpolation using generic Solver.
Definition interpolation.h:168
Node
Node marker for boundary conditions.
Definition interpolation.h:43
bspline::Spline< double, order > interpolateUsingArmadillo(Support< double > x, const std::vector< double > &y, const std::array< Boundary< double >, order - 1 > &boundaries=internal::defaultBoundaries< double, order >())
Interpolation using armadillo Solver.
Definition interpolation.h:323
A boundary condition.
Definition interpolation.h:52
T value
Definition interpolation.h:58
size_t derivative
Definition interpolation.h:56
Node node
Definition interpolation.h:54