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());
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>());
116template<
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_);
159 if constexpr (IsIntegerSequence<Coefficients>::value)
176 auto derivativeCoefficients = Impl::polynomialDerivativeCoefficients(p.coefficients());
177 using DerivativeCoefficients =
decltype(derivativeCoefficients);
184 return coefficients_;
194Polynomial(std::vector<K>) -> Polynomial<K, std::vector<K>>;
196template<
class K,
unsigned long n>
197Polynomial(std::array<K,n>) -> Polynomial<K, std::array<K,n>>;
199template<
class K, K... ci>
200Polynomial(std::integer_sequence<K, ci...>) -> Polynomial<K, std::integer_sequence<K,ci...>>;
203Polynomial(std::initializer_list<K>) -> Polynomial<K, std::vector<K>>;
219template<
class K,
class Coefficients>
220auto makePolynomial(Coefficients coefficients)
222 return Polynomial<K, Coefficients>(std::move(coefficients));
234template<
class K,
class C>
235auto makePolynomial(std::initializer_list<C> coefficients)
237 return Polynomial<K>(std::move(coefficients));
A univariate polynomial implementation.
Definition: polynomial.hh:118
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
const Coefficients & coefficients() const
Obtain reference to coefficient vector.
Definition: polynomial.hh:182
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
decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I, i... > sequence)
Unpack an std::integer_sequence<I,i...> to std::integral_constant<I,i>...
Definition: indices.hh:124
friend auto derivative(const Polynomial &p)
Obtain derivative of Polynomial function.
Definition: polynomial.hh:174
constexpr void forEach(Range &&range, F &&f)
Range based for loop.
Definition: hybridutilities.hh:256
constexpr decltype(auto) elementAt(Container &&c, Index &&i)
Get element at given position from container.
Definition: hybridutilities.hh:126
Dune namespace.
Definition: alignedallocator.hh:13