/** * * @file FunctorIntegrTrapezes.cpp * * @authors D. Mathieu * * @date 07/12/2011 * * @version V1.0 * * @brief Integration par la methodes des trapezes au moyen de * functor * **/ #include <iostream> #include <cmath> // cos(), sin(), M_PI_2 using namespace std; #define classdef typedef namespace { template <typename T, typename TRes> class IUnaryFunction { public : virtual ~IUnaryFunction (void) {} virtual TRes operator () (const T &) const noexcept = 0; }; // IUnaryFunction typedef IUnaryFunction <double, double> UnFctor_dd; struct FctorCos : public UnFctor_dd { virtual ~FctorCos (void) {} virtual double operator() (const double & x) const noexcept { return cos (x); } // operator() }; // FctorCos struct FctorSin : public UnFctor_dd { virtual ~FctorSin (void) {} virtual double operator() (const double & x) const noexcept { return sin (x); } // operator() }; // FctorSin double integrTrapezes (const UnFctor_dd & f, double a, double b, unsigned n) { double s = (f (a) + f (b)) / 2.0; double delta = (b - a) / double (n); for ( ; --n; ) s += f (a += delta); return s * delta; } // integrTrapezes void testIntegrTrapezes (void) { cout << "IntegrTrapezes : \n\n"; cout << "Methode des trapezes : \n"; cout << "S (cos (x)) entre 0 et +Pi/2 avec 5 intervalles = " << integrTrapezes (FctorCos (), 0, M_PI_2, 5) << '\n'; cout << "S (cos (x)) entre 0 et +Pi/2 avec 10 intervalles = " << integrTrapezes (FctorCos (), 0, M_PI_2, 10) << '\n'; cout << "S (cos (x)) entre 0 et +Pi/2 avec 50 intervalles = " << integrTrapezes (FctorCos (), 0, M_PI_2, 50) << '\n'; cout << "S (cos (x)) entre 0 et +Pi/2 avec 100 intervalles = " << integrTrapezes (FctorCos (), 0, M_PI_2, 100) << '\n'; cout << '\n'; cout << "S (sin (x)) entre -Pi/2 et 0 avec 5 intervalles = " << integrTrapezes (FctorSin (), -M_PI_2, 0, 5) << '\n'; cout << "S (sin (x)) entre -Pi/2 et 0 avec 10 intervalles = " << integrTrapezes (FctorSin (), -M_PI_2, 0, 10) << '\n'; cout << "S (sin (x)) entre -Pi/2 et 0 avec 50 intervalles = " << integrTrapezes (FctorSin (), -M_PI_2, 0, 50) << '\n'; cout << "S (sin (x)) entre -Pi/2 et 0 avec 100 intervalles = " << integrTrapezes (FctorSin (), -M_PI_2, 0, 100) << '\n'; } // testIntegrTrapezes() } // namespace int main (void) { testIntegrTrapezes (); return 0; } // main()