Advertisement
dark-s0ul

lab6

Jan 18th, 2018
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.44 KB | None | 0 0
  1. using namespace std;
  2.  
  3. #include <cmath>
  4. #include <vector>
  5. #include <cstdio>
  6.  
  7. template <int N>
  8. struct Splain {
  9. public:
  10.     Splain(double a, double b, double (*f)(double)) : a(a), b(b), h((b - a) / (double) N), f(f) {
  11.         coef_a();
  12.         coef_b();
  13.         coef_c();
  14.         coef_d();
  15.     }
  16.  
  17.     double operator()(double x) {
  18.         int i = 0;
  19.         double h = (b - a) / N;
  20.         double xi = a + i * h;
  21.  
  22.         while (x >= xi) {
  23.             xi += h;
  24.             i++;
  25.         }
  26.         i--;
  27.         xi = a + i * h;
  28.  
  29.         return A[i] + B[i] * (x - xi) + C[i] * (x - xi) * (x - xi) / 2 + D[i] * (x - xi) * (x - xi) * (x - xi) / 6;
  30.     }
  31. private:
  32.     double A[N]{ 0 }, B[N]{ 0 }, C[N]{ 0 }, D[N]{ 0 }, a, b, h;
  33.     double(*f)(double);
  34.  
  35.     void coef_a() {
  36.         double x = a;
  37.         for (int i = 0; i < N; i++) {
  38.             A[i] = f(x);
  39.             x += h;
  40.         }
  41.     }
  42.  
  43.     void coef_d() {
  44.         D[0] = C[0];
  45.         for (int i = 1; i < N; i++) {
  46.             D[i] = (C[i] - C[i - 1]) / h;
  47.         }
  48.     }
  49.  
  50.     void coef_b() {
  51.         B[0] = 0;
  52.  
  53.         for (int i = 1; i < N; i++) {
  54.             B[i] = (h * C[i] / 2) - (h * h * D[i] / 2) + (f(a + h * i) - f(a + h * (i - 1))) / h;
  55.         }
  56.     }
  57.  
  58.     void coef_c() {
  59.         double *matrix = new double[N * (N + 1)];
  60.  
  61.         double h = (b - a) / N;
  62.         for (int i = 0; i < N; i++) {
  63.             for (int j = 0; j < N + 1; j++) {
  64.                 matrix[i * (N + 1) + j] = 0;
  65.             }
  66.         }
  67.  
  68.         for (int i = 0; i < N; i++) {
  69.             matrix[i * (N + 1) + i] = 4 * h;
  70.             if (i > 0) {
  71.                 matrix[i * (N + 1) + i - 1] = h;
  72.             }
  73.             matrix[i * (N + 1) + i + 1] = h;
  74.             double x_1 = a + h * (i - 1);
  75.             double x_i = a + h * i;
  76.             double x_n = a + h * (i + 1);
  77.             matrix[i * (N + 1) + N] = 6 * (f(x_n) - 2 * f(x_i) + f(x_1)) / h;
  78.         }
  79.  
  80.         for (int j = 0; j < N; j++) {
  81.             double m = 1.0 / matrix[j * (N + 1) + j];
  82.             for (int i = j; i < N + 1; i++) {
  83.                 matrix[j * (N + 1) + i] *= m;
  84.             }
  85.             for (int k = j + 1; k < N; k++) {
  86.                 double a = matrix[k * (N + 1) + j];
  87.                 for (int l = j; l < N + 1; l++) {
  88.                     matrix[k * (N + 1) + l] -= matrix[j * (N + 1) + l] * a;
  89.                 }
  90.             }
  91.         }
  92.         for (int j = N - 1; j >= 0; j--) {
  93.             double s = 0;
  94.             for (int i = N - 1; i > j; i--) {
  95.                 s += matrix[j * (N + 1) + i] * C[i];
  96.             }
  97.             C[j] = matrix[j * (N + 1) + N] - s;
  98.         }
  99.     }
  100. };
  101.  
  102. int main() {
  103.     auto f = [](double x) -> double {
  104.         return 1 / x - 0.1 * x * x * sin(2 * x);
  105.     };
  106.  
  107.     auto splain = Splain<1000>(2, 11, f);
  108.  
  109.     printf("|   x   |      y      |     error     |\n");
  110.     for (double x = 2; x <= 11; x += 0.2) {
  111.         double y = splain(x);
  112.  
  113.         printf("| %5.2f | %11.7f | %13.6e |\n", x, y, f(x) - y);
  114.  
  115.     }
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement