- Main Page
- Related Pages
- Classes
- Files

# _calculus.h

Go to the documentation of this file.

    00001
    00023 /* === S T A R T =========================================================== */
    00024
    00025 #ifndef __ETL__CALCULUS_H
    00026 #define __ETL__CALCULUS_H
    00027
    00028 /* === H E A D E R S ======================================================= */
    00029
    00030 #include <functional>
    00031
    00032 #include "hermite"
    00033
    00034 /* === M A C R O S ========================================================= */
    00035
    00036 //#ifndef _EPSILON
    00037 //#define _EPSILON      0.0000001
    00038 //#endif
    00039
    00040 /* === T Y P E D E F S ===================================================== */
    00041
    00042 /* === C L A S S E S & S T R U C T S ======================================= */
    00043
    00044 _ETL_BEGIN_NAMESPACE
    00045
    00046 template <typename T>
    00047 class derivative : public std::unary_function<typename T::argument_type,typename T::result_type>
    00048 {
    00049     T func;
    00050     typename T::argument_type epsilon;
    00051 public:
    00052     explicit derivative(const T &x, const typename T::argument_type &epsilon=0.000001):func(x),epsilon(epsilon) { }
    00053
    00054     typename T::result_type
    00055     operator()(const typename T::argument_type &x)const
    00056     {
    00057         return (func(x+epsilon)-func(x))/epsilon;
    00058     }
    00059 };
    00060
    00061 template <typename T>
    00062 class derivative<hermite<T> > : public std::unary_function<typename hermite<T>::argument_type,typename hermite<T>::result_type>
    00063 {
    00064     hermite<T> func;
    00065 public:
    00066     explicit derivative(const hermite<T> &x):func(x) { }
    00067
    00068     typename hermite<T>::result_type
    00069     operator()(const typename hermite<T>::argument_type &x)const
    00070     {
    00071         T a = func[0], b = func[1], c = func[2], d = func[3];
    00072         typename hermite<T>::argument_type y(1-x);
    00073         return ((b-a)*y*y + (c-b)*x*y*2 + (d-c)*x*x) * 3;
    00074     }
    00075 };
    00076
    00077 template <typename T>
    00078 class integral : public std::binary_function<typename T::argument_type,typename T::argument_type,typename T::result_type>
    00079 {
    00080     T func;
    00081     int samples;
    00082 public:
    00083     explicit integral(const T &x, const int &samples=500):func(x),samples(samples) { }
    00084
    00085     typename T::result_type
    00086     operator()(typename T::argument_type x,typename T::argument_type y)const
    00087     {
    00088         typename T::result_type ret=0;
    00089         int i=samples;
    00090         const typename T::argument_type increment=(y-x)/i;
    00091
    00092         for(;i;i--,x+=increment)
    00093             ret+=(func(x)+func(x+increment))*increment/2;
    00094         return ret;
    00095     }
    00096 };
    00097
    00098 _ETL_END_NAMESPACE
    00099
    00100 /* === E N D =============================================================== */
    00101
    00102 #endif