RBF_functions.hpp 1.2 KB

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