00001
00023
00024
00025 #ifndef __ETL__CALCULUS_H
00026 #define __ETL__CALCULUS_H
00027
00028
00029
00030 #include <functional>
00031
00032 #include "hermite"
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
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
00101
00102 #endif