MathTL
algebra/piecewise.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, Andreas Schneider                  |
00008 // +--------------------------------------------------------------------+
00009 
00010 #ifndef _MATHTL_PIECEWISE_H
00011 #define _MATHTL_PIECEWISE_H
00012 
00013 #include <iostream>
00014 #include <utils/function.h>
00015 #include <algebra/polynomial.h>
00016 
00017 namespace MathTL
00018 {
00044   template <class C>
00045   class Piecewise
00046     : public Function<1, C>
00047   {
00048     public:
00049     typedef typename std::map<int, Polynomial<C> > PiecesType;
00050 
00051     /* data fields *********************************************************/
00052     protected:
00053     PiecesType expansion;  // the local polynomials
00054     int granularity;       // granularity j
00055 
00056     /* constructors and destructors ****************************************/
00057     public:
00061     Piecewise();
00062 
00066     Piecewise(const Piecewise<C>& p);
00067 
00071     Piecewise(const int j);
00072 
00076     ~Piecewise();
00077 
00078     /* member functions ****************************************************/
00083     Polynomial<C> get_local_expansion(const int k) const;
00084 
00089     const PiecesType* get_expansion() const;
00090 
00095     void set_local_expansion(const int k, const Polynomial<C> &p);
00096 
00100     inline int get_granularity() const { return granularity; }
00101 
00105     void clip_me(const int k1, const int k2);
00106 
00110     Piecewise<C> clip(const int k1, const int k2) const;
00111 
00115     void split_me(const int jnew);
00116 
00120     Piecewise split(const int jnew) const;
00121 
00126     void dilate_me(const int j);
00127 
00132     Piecewise<C> dilate(const int j) const;
00133 
00137     void shift_me(const int k);
00138 
00143     Piecewise<C> shift(const int k) const;
00144 
00148     Piecewise<C> differentiate() const;
00149 
00153     double integrate(const bool quadrature = false) const;
00154 
00158     double integrate(const int k1, const int k2,
00159                      const bool quadrature = false) const;
00160 
00164     C value (const C x) const;
00165 
00171     inline C value (const Point<1>& x, const unsigned int component = 0) const;
00172 
00178     void vector_value(const Point<1> &p,
00179                       Vector<C>& values) const;
00180 
00184     C derivative (const C x) const;
00185 
00189     C secondDerivative (const C x) const;
00190 
00194     Piecewise<C>& scale (const C c);
00195 
00199     Piecewise<C>& add (const Polynomial<C> &p);
00200 
00204     Piecewise<C>& add (const Piecewise<C> &p);
00205 
00210     C inner_product(const Piecewise<C> &p) const;
00211 
00216     C inner_product(const Polynomial<C> &p) const;
00217 
00218 
00219     /* operators ***********************************************************/
00223     Piecewise<C>& operator = (const Piecewise<C>& p);
00224 
00228     C operator () (const C x) const;
00229 
00233     Piecewise<C>& operator += (const Polynomial<C> &p);
00234 
00238     Piecewise<C>& operator += (const Piecewise<C> &p);
00239 
00243     Piecewise<C>& operator -= (const Polynomial<C> &p);
00244 
00248     Piecewise<C>& operator -= (const Piecewise<C> &p);
00249 
00253     Piecewise<C>& operator *= (const C c);
00254 
00258     Piecewise<C>& operator *= (const Polynomial<C> &p);
00259 
00263     Piecewise<C>& operator *= (const Piecewise<C> &p);
00264 
00268     void MatError (char* str) const;
00269   };
00270 
00271 
00272   /* non class-member operators ********************************************/
00273 
00278   template <class C>
00279   Piecewise<C> operator  + (const Polynomial<C> &p, const Piecewise<C> &q);
00280 
00285   template <class C>
00286   Piecewise<C> operator  + (const Piecewise<C> &p, const Polynomial<C> &q);
00287 
00292   template <class C>
00293   Piecewise<C> operator  + (const Piecewise<C> &p, const Piecewise<C> &q);
00294 
00299   template <class C>
00300   Piecewise<C> operator  - (const Polynomial<C> &p, const Piecewise<C> &q);
00301 
00306   template <class C>
00307   Piecewise<C> operator  - (const Piecewise<C> &p, const Polynomial<C> &q);
00308 
00313   template <class C>
00314   Piecewise<C> operator  - (const Piecewise<C> &p, const Piecewise<C> &q);
00315 
00320   template <class C>
00321   Piecewise<C> operator  * (const C c, const Piecewise<C> &q);
00322 
00327   template <class C>
00328   Piecewise<C> operator  * (const Polynomial<C> &p, const Piecewise<C> &q);
00329 
00334   template <class C>
00335   Piecewise<C> operator  * (const Piecewise<C> &p, const Piecewise<C> &q);
00336 
00340   template <class C>
00341   std::ostream& operator << (std::ostream &s, const Piecewise<C>& p);
00342 }
00343 
00344 // implementation of inline functions
00345 #include <algebra/piecewise.cpp>
00346 
00347 #endif // _MATHTL_PIECEWISE_H
 All Classes Functions Variables Typedefs Enumerations