RBF_functions.hpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #ifndef RBF_functions_hpp
  2. #define RBF_functions_hpp
  3. // Les RBF
  4. // classe de base
  5. template<typename real> class RBF{
  6. // Radial Basis Functions: base.
  7. protected:
  8. real epsilon;
  9. RBF(real eps):epsilon(eps){};
  10. void set_epsilon(real eps) {epsilon = eps;}
  11. };
  12. template<typename real> class MQI: public RBF<real> {
  13. // Multiquadratique inverse.
  14. public:
  15. using RBF<real>::set_epsilon; //utiliser le set-epsilon de la classe
  16. // de base (C++ 11 !).
  17. // constructeur: on appelle de constructeur de la base.
  18. MQI(real eps): RBF<real>(eps){}
  19. // la veur en x (distance au noeud)
  20. inline real operator()(real x){return 1./sqrt(1.+
  21. RBF<real>::epsilon*x*x);}
  22. };
  23. ///
  24. template<typename real> class TPS: public RBF<real> {
  25. // plaque mince.
  26. public:
  27. TPS(real eps): RBF<real>(eps){}
  28. inline real operator()(real x){return exp(-RBF<real>::epsilon*x)*
  29. (1.+RBF<real>::epsilon*x);}
  30. };
  31. template<typename real> class Gauss: public RBF<real> {
  32. // Gaussienne
  33. public:
  34. Gauss(real eps): RBF<real>(eps){}
  35. inline real operator()(real x){
  36. if(x<1.e-10)
  37. return 1.;
  38. else
  39. return exp(-RBF<real>::epsilon*x*x);}
  40. };
  41. template<typename real> class TPSD: public RBF<real> {
  42. // plaque mince à la Duchon..
  43. public:
  44. TPSD(real eps): RBF<real>(eps){}
  45. inline real operator()(real x){
  46. if(x<1.e-9)
  47. return 1.;
  48. else
  49. return 1/(1.+
  50. pow(RBF<real>::epsilon*x,2)*log(RBF<real>::epsilon*x));}
  51. };
  52. #endif