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