![]() |
Reference documentation for deal.II version 9.1.1
|
#include <deal.II/base/polynomial.h>
Public Member Functions | |
HermiteLikeInterpolation (const unsigned int degree, const unsigned int index) | |
![]() | |
Polynomial (const std::vector< double > &coefficients) | |
Polynomial (const unsigned int n) | |
Polynomial (const std::vector< Point< 1 >> &lagrange_support_points, const unsigned int evaluation_point) | |
Polynomial () | |
double | value (const double x) const |
void | value (const double x, std::vector< double > &values) const |
void | value (const double x, const unsigned int n_derivatives, double *values) const |
unsigned int | degree () const |
void | scale (const double factor) |
void | shift (const number2 offset) |
Polynomial< double > | derivative () const |
Polynomial< double > | primitive () const |
Polynomial< double > & | operator*= (const double s) |
Polynomial< double > & | operator*= (const Polynomial< double > &p) |
Polynomial< double > & | operator+= (const Polynomial< double > &p) |
Polynomial< double > & | operator-= (const Polynomial< double > &p) |
bool | operator== (const Polynomial< double > &p) const |
void | print (std::ostream &out) const |
void | serialize (Archive &ar, const unsigned int version) |
![]() | |
Subscriptor () | |
Subscriptor (const Subscriptor &) | |
Subscriptor (Subscriptor &&) noexcept | |
virtual | ~Subscriptor () |
Subscriptor & | operator= (const Subscriptor &) |
Subscriptor & | operator= (Subscriptor &&) noexcept |
void | subscribe (std::atomic< bool > *const validity, const std::string &identifier="") const |
void | unsubscribe (std::atomic< bool > *const validity, const std::string &identifier="") const |
unsigned int | n_subscriptions () const |
template<typename StreamType > | |
void | list_subscribers (StreamType &stream) const |
void | list_subscribers () const |
template<class Archive > | |
void | serialize (Archive &ar, const unsigned int version) |
Static Public Member Functions | |
static std::vector< Polynomial< double > > | generate_complete_basis (const unsigned int degree) |
![]() | |
static ::ExceptionBase & | ExcInUse (int arg1, std::string arg2, std::string arg3) |
static ::ExceptionBase & | ExcNoSubscriber (std::string arg1, std::string arg2) |
Additional Inherited Members | |
![]() | |
void | transform_into_standard_form () |
![]() | |
static void | scale (std::vector< double > &coefficients, const double factor) |
static void | shift (std::vector< double > &coefficients, const number2 shift) |
static void | multiply (std::vector< double > &coefficients, const double factor) |
![]() | |
std::vector< double > | coefficients |
bool | in_lagrange_product_form |
std::vector< double > | lagrange_support_points |
double | lagrange_weight |
Polynomials for a variant of Hermite polynomials with better condition number in the interpolation than the basis from HermiteInterpolation.
In analogy to the actual Hermite polynomials this basis evaluates the first polynomial p_0 to 1 at x=0 and has both a zero value and zero derivative at x=1. Likewise, the last polynomial p_n evaluates to 1 at x=1 but has zero value and zero derivative at x=0. The second polynomial p_1 and the second to last polynomial p_{n-1} represent the derivative degree of freedom at x=0 and x=1, respectively. As such, they are zero at both the end points x=0, x=1 and have zero derivative at the opposite end, p_1'(1)=0 and p_{n-1}'(0)=0. As opposed to the original Hermite polynomials, p_0 does not have zero derivative at x=0. The additional degree of freedom is used to make p_0 and p_1 orthogonal, which for n=3 results in a root at x=\frac{2}{7} for p_0 and at x=\frac{5}{7} for p_n, respectively. Furthermore, the extension of these polynomials to higher degrees n>3 is constructed by adding additional nodes inside the unit interval, again ensuring better conditioning. The nodes are computed as the roots of the Jacobi polynomials for \alpha=\beta=2 which are orthogonal against the generating function x^2(1-x)^2 with the Hermite property. Then, these polynomials are constructed in the usual way as Lagrange polynomials with double roots at x=0 and x=1. For example at n=4, all of p_0, p_1, p_3, p_4 get an additional root at x=0.5 through the factor (x-0.5). In summary, this basis is dominated by nodal contributions, but it is not a nodal one because the second and second to last polynomials that are non-nodal, and due to the presence of double nodes in x=0 and x=1.
The basis only contains Hermite information at degree>=3
, but it is also implemented for degrees between 0 and two. For the linear case, the usual hat functions are implemented, whereas the polynomials for degree=2
are p_0(x)=(1-x)^2, p_1(x)=4x(x-1), and p_2(x)=x^2, in accordance with the construction principle for degree 3 that allows a non-zero of p_0 and p_2.
These two relaxations improve the condition number of the mass matrix (i.e., interpolation) significantly, as can be seen from the following table:
Condition number mass matrix | ||
---|---|---|
degree | HermiteInterpolation | HermiteLikeInterpolation |
n=3 | 1057 | 17.18 |
n=4 | 6580 | 16.83 |
n=5 | 1.875e+04 | 19.37 |
n=6 | 6.033e+04 | 18.99 |
n=10 | 9.756e+05 | 25.65 |
n=15 | 9.431e+06 | 36.47 |
n=25 | 2.220e+08 | 62.28 |
n=35 | 2.109e+09 | 91.50 |
This polynomial inherits the advantageous property of Hermite polynomials where only two functions have value and/or derivative nonzero on a face but gives better condition numbers of interpolation, which improves the performance of some iterative schemes like conjugate gradients with point-Jacobi.
Definition at line 702 of file polynomial.h.
Polynomials::HermiteLikeInterpolation::HermiteLikeInterpolation | ( | const unsigned int | degree, |
const unsigned int | index | ||
) |
Constructor for the polynomial with index index
within the set up polynomials of degree degree
.
Definition at line 1296 of file polynomial.cc.
|
static |
Return the polynomials with index 0
up to degree+1
in a space of degree up to degree
.
Definition at line 1524 of file polynomial.cc.