Advertisement
dmkozyrev

splines.cpp

Dec 2nd, 2016
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.17 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <cmath>
  5.  
  6. using namespace std;
  7.  
  8. class Spline {
  9.     public:
  10.         vector<double> x, f, c;
  11.         Spline(const string & filename);
  12.         double calc(double x1, double & p, double & p1, double & p2) const;
  13. };
  14.  
  15. int main() {
  16.     Spline s("04_in.txt");
  17.     cout << "x\tf(x)\ts(x)\teps" << endl;
  18.     for (int i = 0, n = s.x.size()-1; i < n; ++i) {
  19.         double p, p1, p2;
  20.         s.calc(s.x[i], p, p1, p2);
  21.         double eps = fabs(s.f[i]-p)/fabs(s.f[i]);
  22.         cout << s.x[i] << "\t" << s.f[i] << "\t" << p << "\t" << eps << endl;
  23.     }
  24.     double p, p1, p2;
  25.     s.calc(1.5, p, p1, p2);
  26.     cout << "s(1.5) = " << p << endl;
  27.     cout << "f(1.5*pi/6) = " << cos(1.5*M_PI/6) << endl;
  28.     return 0;
  29. }
  30. // f(i, x) = a(i)+b(i)*(x-x[i-1])+c(i)*(x-x[i-1])^2+d(i)*(x-x[i-1])^3
  31. Spline::Spline(const string & filename) {
  32.     ifstream fin(filename);
  33.     int n;
  34.     fin >> n;
  35.     x.assign(n+1, 0);
  36.     f.assign(n+1, 0);
  37.     c.assign(n+1, 0);
  38.     for (int i = 0; i < n; ++i)
  39.         fin >> x[i] >> f[i];
  40.        
  41.     vector<double> k(n+1, 0);
  42.     k[1] = c[1] = 0;
  43.     for (int i = 2; i <= n; ++i) {
  44.         int j = i - 1, m = j - 1;
  45.         double a, b, r;
  46.         a = x[i] - x[j];
  47.         b = x[j] - x[m];
  48.         r = 2*(a+b)-b*c[j];
  49.         c[i] = a/r;
  50.         k[i] = (3.0*((f[i]-f[j])/a-(f[j]-f[m])/b)-b*k[j])/r;
  51.     }
  52.    
  53.     c[n] = k[n];
  54.     for (int i = n-1; i >= 2; --i)
  55.         c[i] = k[i]-c[i]*c[i+1];
  56. }
  57.  
  58. double Spline::calc(double x1, double & p, double & p1, double & p2) const {
  59.     int i = 1, n = x.size();
  60.     while (x1 > x[i] && i != n) ++i;
  61.     int j = i-1;
  62.     double a, b, q, r, d;
  63.    
  64.    
  65.     printf("\t--> i=%d:\t", i);
  66.     printf("a=%lf\t", f[i-1]);
  67.     printf("b=%lf\t", (f[i]-f[i-1])/(x[i]-x[i-1])-(c[i+1]+2*c[i])*(x[i]-x[i-1])/3.0);
  68.     printf("c=%lf\t", c[i]);
  69.     printf("d=%lf\t\n", (c[i+1]-c[i])/(3.0*(x[i]-x[i-1])));
  70.     a = f[j];
  71.     b = x[j];
  72.     q = x[i] - b;
  73.     r = x1-b;
  74.     p = c[i];
  75.     d = c[i+1];
  76.    
  77.     b = (f[i]-a)/q-(d+2*p)*q/3.0;
  78.     d = (d-p)/q*r;
  79.    
  80.    
  81.     p1 = b + r*(2*p+d);
  82.     p2 = 2*(p+d);
  83.     p = a+r*(b+r*(p+d/3.0));
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement