3 #ifndef DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH
4 #define DUNE_FUNCTIONS_ANALYTICFUNCTIONS_POLYNOMIAL_HH
7 #include <initializer_list>
11 #include <dune/common/hybridutilities.hh>
20 template<
class K,
class Allocator>
21 auto polynomialDerivativeCoefficients(
const std::vector<K, Allocator>& coefficients) {
22 if (coefficients.size()==0)
23 return std::vector<K, Allocator>();
24 std::vector<K, Allocator> dpCoefficients(coefficients.size()-1);
25 for (
size_t i=1; i<coefficients.size(); ++i)
26 dpCoefficients[i-1] = coefficients[i]*K(i);
27 return dpCoefficients;
32 template<
class K,
unsigned long n>
33 auto polynomialDerivativeCoefficients(
const std::array<K, n>& coefficients) {
38 std::array<K, n-1> dpCoefficients;
39 for (
size_t i=1; i<coefficients.size(); ++i)
40 dpCoefficients[i-1] = coefficients[i]*K(i);
41 return dpCoefficients;
50 template<
class I, I i0, I... i,
class J, J j0, J... j>
51 auto polynomialDerivativeCoefficientsHelper(std::integer_sequence<I, i0, i...>, std::integer_sequence<J, j0, j...>) {
52 return std::integer_sequence<I, i*I(j)...>();
57 template<
class I, I... i>
58 auto polynomialDerivativeCoefficients(std::integer_sequence<I, i...> coefficients) {
59 if constexpr (
sizeof...(i)==0)
62 return polynomialDerivativeCoefficientsHelper(coefficients, std::make_index_sequence<
sizeof...(i)>());
68 auto polynomialDerivativeCoefficients(
const std::tuple<T...>& coefficients) {
69 if constexpr (
sizeof...(T)==0)
79 auto mult = Dune::Hybrid::hybridFunctor(std::multiplies());
80 return Dune::unpackIntegerSequence([&](
auto... i) {
81 return std::tuple(mult(std::get<i+1>(coefficients), std::integral_constant<long signed int, i+1>()) ...);
82 }, std::make_index_sequence<
sizeof...(T)-1>());
116 template<
class K,
class C=std::vector<K>>
120 struct IsIntegerSequence :
public std::false_type {};
122 template<
class I, I... i>
123 struct IsIntegerSequence<std::integer_sequence<I, i...>> :
public std::true_type {};
149 auto n = Dune::Hybrid::size(coefficients_);
150 Dune::Hybrid::forEach(Dune::range(n), [&](
auto i) {
151 y += Dune::Hybrid::elementAt(coefficients_, i) * std::pow(x,
int(i));
159 if constexpr (IsIntegerSequence<Coefficients>::value)
176 auto derivativeCoefficients = Impl::polynomialDerivativeCoefficients(p.
coefficients());
177 using DerivativeCoefficients = decltype(derivativeCoefficients);
184 return coefficients_;
194 Polynomial(std::vector<K>) -> Polynomial<K, std::vector<K>>;
196 template<
class K,
unsigned long n>
197 Polynomial(std::array<K,n>) -> Polynomial<K, std::array<K,n>>;
199 template<
class K, K... ci>
200 Polynomial(std::integer_sequence<K, ci...>) -> Polynomial<K, std::integer_sequence<K,ci...>>;
203 Polynomial(std::initializer_list<K>) -> Polynomial<K, std::vector<K>>;
219 template<
class K,
class Coefficients>
220 auto makePolynomial(Coefficients coefficients)
222 return Polynomial<K, Coefficients>(std::move(coefficients));
234 template<
class K,
class C>
235 auto makePolynomial(std::initializer_list<C> coefficients)
237 return Polynomial<K>(std::move(coefficients));
A univariate polynomial implementation.
Definition: polynomial.hh:118
const Coefficients & coefficients() const
Obtain reference to coefficient vector.
Definition: polynomial.hh:182
Polynomial()=default
Default constructor.
K operator()(const K &x) const
Evaluate polynomial.
Definition: polynomial.hh:146
C Coefficients
The type of the stored coefficient container.
Definition: polynomial.hh:128
Polynomial(Coefficients coefficients)
Create from container of coefficients.
Definition: polynomial.hh:141
bool operator==(const Polynomial &other) const
Comparison of coefficients.
Definition: polynomial.hh:157
friend auto derivative(const Polynomial &p)
Obtain derivative of Polynomial function.
Definition: polynomial.hh:174
Definition: polynomial.hh:13