Advertisement
dark-s0ul

lab6.cpp

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