maximkustreev

Untitled

Jul 25th, 2012
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.01 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <math.h>
  3. #include <limits.h>
  4. #include <iostream.h>
  5. #include <time.h>
  6.  
  7. class cubic_spline
  8. {
  9. private:
  10.  
  11.         struct spline_tuple {   double a, b, c, d, x;   }; 
  12.         spline_tuple *splines;
  13.         int n;  
  14.         void free_mem();  
  15.  
  16. public:
  17.         cubic_spline();  
  18.         ~cubic_spline();    
  19.         void build_spline(const double *x, const double *y, int n);        
  20.         double f(double x) const;
  21. };
  22.  
  23. cubic_spline::cubic_spline() : splines(NULL){}
  24. cubic_spline::~cubic_spline(){  free_mem(); }
  25.  
  26. void cubic_spline::build_spline(const double *x, const double *y, int n)
  27. {
  28.         free_mem();
  29.         this->n = n;
  30.         int i;
  31.        
  32.         splines = new spline_tuple[n];
  33.         for (i = 0; i < n; ++i)
  34.         {
  35.                 splines[i].x = x[i];
  36.                 splines[i].a = y[i];
  37.         }
  38.         splines[0].c = 0.;
  39.        
  40.         double *alpha = new double[n - 1];
  41.         double *beta = new double[n - 1];
  42.         double A, B, C, F, h_i, h_i1, z;
  43.         alpha[0] = beta[0] = 0.;
  44.         for (i = 1; i < n - 1; ++i)
  45.         {
  46.                 h_i = x[i] - x[i - 1], h_i1 = x[i + 1] - x[i];
  47.                 A = h_i;
  48.                 C = 2. * (h_i + h_i1);
  49.                 B = h_i1;
  50.                 F = 6. * ((y[i + 1] - y[i]) / h_i1 - (y[i] - y[i - 1]) / h_i);
  51.                 z = (A * alpha[i - 1] + C);
  52.                 alpha[i] = -B / z;
  53.                 beta[i] = (F - A * beta[i - 1]) / z;
  54.         }
  55.  
  56.         splines[n - 1].c = (F - A * beta[n - 2]) / (C + A * alpha[n - 2]);
  57.        
  58.         for (i = n - 2; i > 0; --i){    splines[i].c = alpha[i] * splines[i + 1].c + beta[i];   }      
  59.         delete[] beta;  delete[] alpha;
  60.  
  61.          
  62.         for (i = n - 1; i > 0; --i)
  63.         {
  64.                 double h_i = x[i] - x[i - 1];
  65.                 splines[i].d = (splines[i].c - splines[i - 1].c) / h_i;
  66.                 splines[i].b = h_i * (2. * splines[i].c + splines[i - 1].c) / 6. + (y[i] - y[i - 1]) / h_i;
  67.         }
  68. }
  69.  
  70. double cubic_spline::f(double x) const
  71. {  
  72.     double qnan = fmod(x,2);
  73.     if (!splines){  return  qnan;   }
  74.          
  75.         spline_tuple *s;
  76.         if (x <= splines[0].x){ s = splines + 1;    }
  77.         else if (x >= splines[n - 1].x)  
  78.                 s = splines + n - 1;
  79.         else  
  80.         {
  81.                 size_t i = 0, j = n - 1;
  82.                 while (i + 1 < j)
  83.                 {
  84.                         size_t k = i + (j - i) / 2;
  85.                         if (x <= splines[k].x)
  86.                                 j = k;
  87.                         else
  88.                                 i = k;
  89.                 }
  90.                 s = splines + j;
  91.         }
  92.  
  93.         double dx = (x - s->x);
  94.         return s->a + (s->b + (s->c / 2. + s->d * dx / 6.) * dx) * dx;
  95. }
  96.  
  97. void cubic_spline::free_mem()
  98. {
  99.         delete[] splines;
  100.         splines = NULL;
  101. }
  102. void main(){
  103.  
  104.     cubic_spline m;
  105.     int n=5000;
  106.      
  107.     srand(time(0));
  108.     for(int i=0;i<n;++i){
  109.     const double xx=rand();
  110.     cout<<m.f(xx);  cout<<"\n";
  111.     }  
  112.     cout<<"\n";
  113. }
Advertisement
Add Comment
Please, Sign In to add comment