MathTL
algebra/polynomial.h
00001 // -*- c++ -*-
00002 
00003 // +--------------------------------------------------------------------+
00004 // | This file is part of MathTL - the Mathematical Template Library    |
00005 // |                                                                    |
00006 // | Copyright (c) 2002-2009                                            |
00007 // | Thorsten Raasch, Manuel Werner                                     |
00008 // +--------------------------------------------------------------------+
00009 
00010 #ifndef _MATHTL_POLYNOMIAL_H
00011 #define _MATHTL_POLYNOMIAL_H
00012 
00013 #include <iostream>
00014 #include <algebra/vector.h>
00015 #include <utils/function.h>
00016 
00017 namespace MathTL
00018 {
00040   template <class C>
00041   class Polynomial
00042     : protected Vector<C>, public Function<1, C>
00043   {
00044   public:
00048     Polynomial();
00049 
00053     Polynomial(const Polynomial<C>& p);
00054 
00058     Polynomial(const Vector<C>& coeffs);
00059 
00063     explicit Polynomial(const C c);
00064 
00068     virtual ~Polynomial();
00069 
00073     unsigned int degree() const;
00074 
00078     C get_coefficient(const unsigned int k) const;
00079 
00083     void get_coefficients(Vector<C>& coeffs) const;
00084 
00088     void set_coefficient(const unsigned int k, const C coeff);
00089 
00093     void set_coefficients(const Vector<C>& coeffs);
00094 
00098     C value(const C x) const;
00099 
00103     C value(const C x, const unsigned int derivative) const;
00104 
00109     C value(const Point<1>& p,
00110             const unsigned int component = 0) const;
00111 
00116     void vector_value(const Point<1> &p,
00117                       Vector<C>& values) const;
00118 
00122     void scale(const C s);
00123 
00127     void shift(const C s);
00128 
00132     void chain(const Polynomial<C>& p);
00133 
00138     Polynomial<C> substitute_into(const Polynomial<C>& p) const;
00139 
00143     Polynomial<C>& operator = (const Polynomial<C>& p);
00144 
00148     Polynomial<C>& operator = (const C c);
00149 
00153     void add(const Polynomial<C>& p);
00154 
00158     void add(const C s, const Polynomial<C>& p);
00159 
00163     void sadd(const C s, const Polynomial<C>& p);
00164 
00168     Polynomial<C>& operator += (const Polynomial<C>& p);
00169 
00174     Polynomial<C> operator + (const Polynomial<C>& p) const;
00175 
00179     void subtract(const Polynomial<C> &p);
00180 
00184     Polynomial<C>& operator -= (const Polynomial<C> &p);
00185 
00190     Polynomial<C> operator - () const;
00191     
00196     Polynomial<C> operator - (const Polynomial<C> &p) const;
00197 
00201     Polynomial<C>& operator *= (const C c);
00202 
00207     Polynomial<C> operator * (const C c) const;
00208 
00212     void multiply(const Polynomial<C>& p);
00213 
00217     Polynomial<C>& operator *= (const Polynomial<C>& p);
00218 
00223     Polynomial<C> operator * (const Polynomial<C>& p);
00224 
00228     Polynomial<C> power(const unsigned int k) const;
00229 
00233     void divide(const Polynomial<C>& q, Polynomial<C>& p) const;
00234 
00238     void divide(const Polynomial<C>& q, Polynomial<C>& p, Polynomial<C>& r) const;
00239 
00243     Polynomial differentiate() const;
00244 
00248     Polynomial integrate() const;
00249 
00253     double integrate(const double a,
00254                      const double b,
00255                      const bool quadrature = false) const;
00256 
00260     double inner_product(Polynomial<C> p2, double a, double b);
00261 
00262   protected:
00266     void trim();
00267   };
00268   
00273   template <class C>
00274   Polynomial<C> operator * (const C c, const Polynomial<C>& p);
00275   
00280   template <class C>
00281   std::ostream& operator << (std::ostream &s, const Polynomial<C> &p);
00282 }
00283 
00284 // implementation of inline functions
00285 #include <algebra/polynomial.cpp>
00286 
00287 #endif
 All Classes Functions Variables Typedefs Enumerations