Reference documentation for deal.II version 8.4.2
polynomial.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2000 - 2016 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE at
12 // the top level of the deal.II distribution.
13 //
14 // ---------------------------------------------------------------------
15 
16 #ifndef dealii__polynomial_h
17 #define dealii__polynomial_h
18 
19 
20 
21 #include <deal.II/base/config.h>
22 #include <deal.II/base/exceptions.h>
23 #include <deal.II/base/subscriptor.h>
24 #include <deal.II/base/point.h>
25 #include <deal.II/base/std_cxx11/shared_ptr.h>
26 
27 #include <vector>
28 
29 DEAL_II_NAMESPACE_OPEN
30 
40 namespace Polynomials
41 {
42 
52  template <typename number>
53  class Polynomial : public Subscriptor
54  {
55  public:
64  Polynomial (const std::vector<number> &coefficients);
65 
69  Polynomial (const unsigned int n);
70 
78  Polynomial (const std::vector<Point<1> > &lagrange_support_points,
79  const unsigned int evaluation_point);
80 
84  Polynomial ();
85 
92  number value (const number x) const;
93 
103  void value (const number x,
104  std::vector<number> &values) const;
105 
111  unsigned int degree () const;
112 
120  void scale (const number factor);
121 
137  template <typename number2>
138  void shift (const number2 offset);
139 
144 
149  Polynomial<number> primitive () const;
150 
154  Polynomial<number> &operator *= (const double s);
155 
160 
165 
170 
174  bool operator == (const Polynomial<number> &p) const;
175 
179  void print(std::ostream &out) const;
180 
185  template <class Archive>
186  void serialize (Archive &ar, const unsigned int version);
187 
188  protected:
189 
193  static void scale (std::vector<number> &coefficients,
194  const number factor);
195 
199  template <typename number2>
200  static void shift (std::vector<number> &coefficients,
201  const number2 shift);
202 
206  static void multiply (std::vector<number> &coefficients,
207  const number factor);
208 
215 
224  std::vector<number> coefficients;
225 
231 
236  std::vector<number> lagrange_support_points;
237 
243  };
244 
245 
252  template <typename number>
253  class Monomial : public Polynomial<number>
254  {
255  public:
260  Monomial(const unsigned int n,
261  const double coefficient = 1.);
262 
269  static
270  std::vector<Polynomial<number> >
271  generate_complete_basis (const unsigned int degree);
272 
273  private:
277  static std::vector<number> make_vector(unsigned int n,
278  const double coefficient);
279  };
280 
281 
299  class LagrangeEquidistant: public Polynomial<double>
300  {
301  public:
307  LagrangeEquidistant (const unsigned int n,
308  const unsigned int support_point);
309 
318  static
319  std::vector<Polynomial<double> >
320  generate_complete_basis (const unsigned int degree);
321 
322  private:
323 
328  static
329  void
330  compute_coefficients (const unsigned int n,
331  const unsigned int support_point,
332  std::vector<double> &a);
333  };
334 
335 
336 
343  std::vector<Polynomial<double> >
344  generate_complete_Lagrange_basis (const std::vector<Point<1> > &points);
345 
346 
347 
362  class Legendre : public Polynomial<double>
363  {
364  public:
368  Legendre (const unsigned int p);
369 
376  static
377  std::vector<Polynomial<double> >
378  generate_complete_basis (const unsigned int degree);
379 
380  private:
384  static std::vector<std_cxx11::shared_ptr<const std::vector<double> > > shifted_coefficients;
385 
394  static std::vector<std_cxx11::shared_ptr<const std::vector<double> > > recursive_coefficients;
395 
403  static void compute_coefficients (const unsigned int p);
404 
409  static const std::vector<double> &
410  get_coefficients (const unsigned int k);
411  };
412 
434  class Lobatto : public Polynomial<double>
435  {
436  public:
441  Lobatto (const unsigned int p = 0);
442 
447  static std::vector<Polynomial<double> >
448  generate_complete_basis (const unsigned int p);
449 
450  private:
454  std::vector<double> compute_coefficients (const unsigned int p);
455  };
456 
457 
458 
498  class Hierarchical : public Polynomial<double>
499  {
500  public:
505  Hierarchical (const unsigned int p);
506 
517  static
518  std::vector<Polynomial<double> >
519  generate_complete_basis (const unsigned int degree);
520 
521  private:
525  static void compute_coefficients (const unsigned int p);
526 
531  static const std::vector<double> &
532  get_coefficients (const unsigned int p);
533 
542  static std::vector<std_cxx11::shared_ptr<const std::vector<double> > > recursive_coefficients;
543  };
544 
545 
576  class HermiteInterpolation : public Polynomial<double>
577  {
578  public:
583  HermiteInterpolation (const unsigned int p);
584 
590  static std::vector<Polynomial<double> >
591  generate_complete_basis (const unsigned int p);
592  };
593 }
594 
595 
598 /* -------------------------- inline functions --------------------- */
599 
600 namespace Polynomials
601 {
602  template <typename number>
603  inline
605  :
606  in_lagrange_product_form (false),
607  lagrange_weight (1.)
608  {}
609 
610 
611 
612  template <typename number>
613  inline
614  unsigned int
616  {
617  if (in_lagrange_product_form == true)
618  {
619  return lagrange_support_points.size();
620  }
621  else
622  {
623  Assert (coefficients.size()>0, ExcEmptyObject());
624  return coefficients.size() - 1;
625  }
626  }
627 
628 
629 
630  template <typename number>
631  inline
632  number
633  Polynomial<number>::value (const number x) const
634  {
635  if (in_lagrange_product_form == false)
636  {
637  Assert (coefficients.size() > 0, ExcEmptyObject());
638 
639  // Horner scheme
640  const unsigned int m=coefficients.size();
641  number value = coefficients.back();
642  for (int k=m-2; k>=0; --k)
643  value = value*x + coefficients[k];
644  return value;
645  }
646  else
647  {
648  // direct evaluation of Lagrange polynomial
649  const unsigned int m = lagrange_support_points.size();
650  number value = 1.;
651  for (unsigned int j=0; j<m; ++j)
652  value *= x-lagrange_support_points[j];
653  value *= lagrange_weight;
654  return value;
655  }
656  }
657 
658 
659 
660  template <typename number>
661  template <class Archive>
662  inline
663  void
664  Polynomial<number>::serialize (Archive &ar, const unsigned int)
665  {
666  // forward to serialization function in the base class.
667  ar &static_cast<Subscriptor &>(*this);
668  ar &coefficients;
669  ar &in_lagrange_product_form;
670  ar &lagrange_support_points;
671  ar &lagrange_weight;
672  }
673 
674 }
675 DEAL_II_NAMESPACE_CLOSE
676 
677 #endif
void serialize(Archive &ar, const unsigned int version)
Definition: polynomial.h:664
Polynomial< number > & operator*=(const double s)
Definition: polynomial.cc:326
void scale(const number factor)
Definition: polynomial.cc:289
void transform_into_standard_form()
Definition: polynomial.cc:236
bool operator==(const Polynomial< number > &p) const
Definition: polynomial.cc:468
Polynomial< number > derivative() const
Definition: polynomial.cc:582
void shift(const number2 offset)
Definition: polynomial.cc:563
unsigned int degree() const
Definition: polynomial.h:615
Polynomial< number > & operator-=(const Polynomial< number > &p)
Definition: polynomial.cc:432
std::vector< Polynomial< double > > generate_complete_Lagrange_basis(const std::vector< Point< 1 > > &points)
Definition: polynomial.cc:818
number value(const number x) const
Definition: polynomial.h:633
Definition: point.h:89
static std::vector< std_cxx11::shared_ptr< const std::vector< double > > > shifted_coefficients
Definition: polynomial.h:384
void print(std::ostream &out) const
Definition: polynomial.cc:638
static void multiply(std::vector< number > &coefficients, const number factor)
Definition: polynomial.cc:314
#define Assert(cond, exc)
Definition: exceptions.h:294
Polynomial< number > & operator+=(const Polynomial< number > &p)
Definition: polynomial.cc:390
static std::vector< std_cxx11::shared_ptr< const std::vector< double > > > recursive_coefficients
Definition: polynomial.h:394
std::vector< number > coefficients
Definition: polynomial.h:224
Polynomial< number > primitive() const
Definition: polynomial.cc:611
std::vector< number > lagrange_support_points
Definition: polynomial.h:236
static std::vector< std_cxx11::shared_ptr< const std::vector< double > > > recursive_coefficients
Definition: polynomial.h:542