| Home | Libraries | People | FAQ | More

## Vector-valued Barycentric Rational Interpolation

#### Synopsis

    #include <boost/math/interpolators/vector_barycentric_rational.hpp>

    namespace boost{ namespace math{

    template<class TimeContainer, class SpaceContainer>
    class vector_barycentric_rational
    {
    public:
        using Real = typename TimeContainer::value_type;
        using Point = typename SpaceContainer::value_type;
        vector_barycentric_rational(TimeContainer&& times, SpaceContainer&& points, size_t approximation_order = 3);

        void operator()(Point& x, Real t) const;

        Point operator()(Real t) const;

        void prime(Point& dxdt, Real t) const;

        Point prime(Real t);

        void eval_with_prime(Point& x, Point& dxdt, Real t) const;

        std::pair<Point, Point> eval_with_prime(Real t) const;
    };

    }}

#### Description

The n dimensional vector-valued barycentric rational interpolator is exactly the same as n scalar-valued barycentric rational interpolators. This is provided primarily for convenience and a slight improvement in efficiency over using n different rational interpolators and combining their results.

Use of the class requires a `Point`-type which has size known at compile-time. These requirements are satisfied by (for example) `Eigen::Vector2d`s and `std::array<Real, N>` classes. The call to the constructor computes the weights:

    using boost::math::vector_barycentric_rational;
    std::vector<double> t(100);
    std::vector<Eigen::Vector2d> y(100);
    // initialize t and y . . .
    vector_barycentric_rational<decltype(t), decltype(y)> interpolant(std::move(t), std::move(y));

To evaluate the interpolant, use

    double t = 2.3;
    Eigen::Vector2d y = interpolant(t);

If you want to populate a vector passed into the interpolant, rather than get it returned, that syntax is supported:

    Eigen::Vector2d y;
    interpolant(y, t);

We tested this with `Eigen::Vector`s and found no performance benefit, but other `Point`-types might not be the same.

To evaluate the derivative of the interpolant use

    auto [y, y_prime] = interpolant.eval_with_prime(x);

Computation of the derivative requires evaluation, so if you can try to use both values at once.