77 lines
2.4 KiB
Plaintext
77 lines
2.4 KiB
Plaintext
[/
|
|
Copyright 2019 Nick Thompson
|
|
|
|
Distributed under the Boost Software License, Version 1.0.
|
|
(See accompanying file LICENSE_1_0.txt or copy at
|
|
http://www.boost.org/LICENSE_1_0.txt).
|
|
]
|
|
|
|
[section:vector_barycentric Vector-valued Barycentric Rational Interpolation]
|
|
|
|
[heading 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;
|
|
};
|
|
|
|
}}
|
|
``
|
|
|
|
[heading 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.
|
|
|
|
|
|
[endsect] [/section:vector_barycentric Vector Barycentric Rational Interpolation]
|