![]() |
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.