MathTL
|
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