]> https://gitweb.dealii.org/ - dealii.git/commitdiff
arithmetic with polynomials; monomials
authorGuido Kanschat <dr.guido.kanschat@gmail.com>
Tue, 16 Dec 2003 11:26:59 +0000 (11:26 +0000)
committerGuido Kanschat <dr.guido.kanschat@gmail.com>
Tue, 16 Dec 2003 11:26:59 +0000 (11:26 +0000)
git-svn-id: https://svn.dealii.org/trunk@8266 0785d39b-7218-0410-832d-ea1e28bc413d

deal.II/base/include/base/polynomial.h
deal.II/base/source/polynomial.cc

index 4fa29bab0f236cc52f7aeedb1c2b95a2b984b006..12b0983f6c1dc3d2518ceab348153a1ddeab04cf 100644 (file)
@@ -58,7 +58,12 @@ namespace Polynomials
                                         * minus one.
                                         */
       Polynomial (const std::vector<number> &coefficients);
-    
+
+                                      /**
+                                       * Default constructor creating an illegal object.
+                                       */
+      Polynomial ();
+      
                                        /**
                                         * Return the value of this
                                         * polynomial at the given point.
@@ -144,6 +149,27 @@ namespace Polynomials
       template <typename number2>
       void shift (const number2 offset);
 
+                                      /**
+                                       * Compute the derivative of
+                                       * the polynomial.
+                                       */
+      Polynomial<number> derivative () const;
+
+                                      /**
+                                       * Multiply with a scalar.
+                                       */
+      Polynomial<number>& operator *= (const double s);
+
+                                      /**
+                                       * Add a second polynomial.
+                                       */
+      Polynomial<number>& operator += (const Polynomial<number>& p);
+      
+                                      /**
+                                       * Subtract a second polynomial.
+                                       */
+      Polynomial<number>& operator -= (const Polynomial<number>& p);
+      
                                        /**
                                         * Print coefficients.
                                         */
@@ -198,6 +224,36 @@ namespace Polynomials
   };
 
 
+/**
+ * @brief Monomial of degree n.
+ *
+ * Class generates Polynomial objects representing a monomial of
+ * degree n, that is, the function $x^n$.
+ *
+ * @author Guido Kanschat, 2004
+ */
+  template <typename number>
+  class Monomial :
+       public Polynomial<number>
+  {
+    public:
+                                      /**
+                                       * Constructor, taking the
+                                       * degree of the monomial and
+                                       * an optional coefficient as
+                                       * arguments.
+                                       */
+      Monomial(const unsigned int n,
+              const double coefficient = 1.);
+
+    private:
+                                      /**
+                                       * Needed by constructor.
+                                       */
+      static std::vector<number> make_vector(unsigned int n,
+                                            const double coefficient);
+  };
+  
 
 /**
  * Lagrange polynomials with equidistant interpolation points in
@@ -441,6 +497,11 @@ namespace Polynomials
 
 namespace Polynomials 
 {
+  template <typename number>
+  inline
+  Polynomial<number>::Polynomial () 
+  {}
+  
   template <typename number>
   inline
   unsigned int
index 9266f9f3bf4c7dd3d57333f9f71a067156143e5f..c6b4854c8d6eb1ce697d9283448d5e7c2b9092cf 100644 (file)
@@ -156,6 +156,46 @@ namespace Polynomials
 
 
 
+  template <typename number>
+  Polynomial<number>&
+  Polynomial<number>::operator *= (const double s)
+  {
+    for (typename std::vector<number>::iterator c = coefficients.begin();
+         c != coefficients.end(); ++c)
+      *c *= s;
+    return *this;
+  }
+
+  
+  template <typename number>
+  Polynomial<number>&
+  Polynomial<number>::operator += (const Polynomial<number>& p)
+  {
+//TODO:[GK] Is resize correct?    
+    if (p.degree() > degree())
+      coefficients.resize(p.coefficients.size());
+    typename std::vector<number>::const_iterator d = p.coefficients.begin();
+    for (typename std::vector<number>::iterator c = coefficients.begin();
+         c != coefficients.end(); ++c, ++d)
+      *c += *d;
+    return *this;
+  }
+
+  
+  template <typename number>
+  Polynomial<number>&
+  Polynomial<number>::operator -= (const Polynomial<number>& p)
+  {
+    if (p.degree() > degree())
+      coefficients.resize(p.coefficients.size());
+    typename std::vector<number>::const_iterator d = p.coefficients.begin();
+    for (typename std::vector<number>::iterator c = coefficients.begin();
+         c != coefficients.end(); ++c, ++d)
+      *c -= *d;
+    return *this;
+  }
+
+  
   template <typename number>
   template <typename number2>
   void
@@ -236,6 +276,22 @@ namespace Polynomials
   }
 
 
+  
+  template <typename number>
+  Polynomial<number>
+  Polynomial<number>::derivative () const
+  {
+    if (degree() == 0)
+      return Monomial<number>(0, 0.);
+
+    std::vector<number> newcoefficients (coefficients.size()-1);
+    for (unsigned int i=1 ; i<coefficients.size() ; ++i)
+      newcoefficients[i-1] = i * coefficients[i];
+
+    return Polynomial<number> (newcoefficients);
+  }
+  
+
   template <typename number>
   void
   Polynomial<number>::print (std::ostream& out) const
@@ -248,7 +304,26 @@ namespace Polynomials
   }
 
 
+// ------------------ class Monomial -------------------------- //
 
+  template <typename number>
+  std::vector<number>
+  Monomial<number>::make_vector(unsigned int n,
+                               double coefficient)
+  {
+    std::vector<number> result(n+1, 0.);
+    result[n] = coefficient;
+    return result;
+  }
+  
+  
+  template <typename number>
+  Monomial<number>::Monomial (unsigned int n,
+                             double coefficient)
+                 : Polynomial<number>(make_vector(n, coefficient))
+  {}
+  
+  
 // ------------------ class LagrangeEquidistant --------------- //
 
   LagrangeEquidistant::LagrangeEquidistant (const unsigned int n,
@@ -871,4 +946,8 @@ namespace Polynomials
   template void Polynomial<long double>::shift(const long double offset);
   template void Polynomial<float>::shift(const long double offset);
   template void Polynomial<double>::shift(const long double offset);
+
+  template class Monomial<float>;
+  template class Monomial<double>;
+  template class Monomial<long double>;
 }

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.