Advertisement
dark-s0ul

lab5.cpp

Dec 18th, 2017
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.13 KB | None | 0 0
  1. #define _USE_MATH_DEFINES
  2. #include <math.h>
  3. #include <iomanip>
  4. #include <iostream>
  5. using namespace std;
  6.  
  7. double Function(double x) {
  8.     return log(x * x) * sin(x / 2) * exp(pow(x, 1.0/7.0));
  9. }
  10.  
  11. double L(int n, double x) {
  12.     double Ln_next, Ln = x, Ln_first = 1;
  13.  
  14.     if (n == 0) return Ln_first;
  15.     if (n == 1) return Ln;
  16.  
  17.     int i = 1;
  18.     while (i < n) {
  19.         Ln_next = (1.0 * (2 * i + 1) / (i + 1)) * x * Ln - (1.0 * i / (i + 1)) * Ln_first;
  20.         Ln_first = Ln;
  21.         Ln = Ln_next;
  22.         ++i;
  23.     }
  24.     return Ln;
  25. }
  26.  
  27. double func(int N, double t, int k1, int k2, double a, double b) {
  28.     double x = (2 * t - a - b) / (b - a);
  29.     return k2 == N ? Function(t) * L(k1, x) : L(k1, x)*L(k2, x);
  30. }
  31.  
  32. double Simpson(int k1, int k2, double a, double b, int n, int N) {
  33.     double sig1 = 0, sig2 = 0, y0 = func(N, a, k1, k2, a, b), yn = func(N, b, k1, k2, a, b);
  34.  
  35.     double h = (b - a) / n;
  36.     for (int i = 1; i < n; i++) {
  37.         if (i % 2 == 0)
  38.             sig2 += func(N, a + i*h, k1, k2, a, b);
  39.         else
  40.             sig1 += func(N, a + i*h, k1, k2, a, b);
  41.     }
  42.  
  43.     return h / 3 * (2 * sig2 + 4 * sig1 + y0 + yn);
  44. }
  45.  
  46. double Integral(int k1, int k2, double a, double b, int N) {
  47.     double eps = 1e-8;
  48.     int n = ceil((b - a) / sqrt(sqrt(eps)));
  49.  
  50.     double In = Simpson(k1, k2, a, b, n, N);
  51.     double I2n = Simpson(k1, k2, a, b, 2 * n, N);
  52.     double r = fabs(In - I2n) / 15;
  53.  
  54.     while (r > eps) {
  55.         In = I2n;
  56.         n *= 2;
  57.         I2n = Simpson(k1, k2, a, b, n, N);
  58.         r = fabs(In - I2n) / 15;
  59.     }
  60.     return I2n;
  61. }
  62.  
  63. double* ChooseMainElement(double **matrix, int N) {
  64.     double R, *M = new double[N];
  65.     double *res = new double[N];
  66.     double ** transformed = new double*[N + 1];
  67.     for (int i = 0; i < N + 1; i++) {
  68.         transformed[i] = new double[N + 1];
  69.     }
  70.  
  71.     int line = 0, row = 0, _line = 0;
  72.     for (int k = 0; k < N - 1; k++) {
  73.         int a = matrix[0][0];
  74.         for (int i = 0; i < N; i++) {
  75.             for (int j = 0; j < N; j++) {
  76.                 if (fabs(matrix[i][j]) > a) {
  77.                     a = fabs(matrix[i][j]);
  78.                     line = i;
  79.                     row = j;
  80.                 }
  81.             }
  82.         }
  83.  
  84.         for (int j = 0; j < N + 1; j++) {
  85.             transformed[_line][j] = matrix[line][j];
  86.         }
  87.         _line++;
  88.  
  89.         for (int i = 0; i < N; i++) {
  90.             M[i] = -(matrix[i][row] / a);
  91.         }
  92.  
  93.         for (int i = 0; i < N; i++) {
  94.             for (int j = 0; j < N + 1; j++) {
  95.                 if (i == line) continue;
  96.                 matrix[i][j] += matrix[line][j] * M[i];
  97.             }
  98.         }
  99.  
  100.         for (int j = 0; j < N + 1; j++) {
  101.             matrix[line][j] = 0;
  102.         }
  103.  
  104.         for (int i = 0; i < N; i++) {
  105.             matrix[i][row] = 0;
  106.         }
  107.     }
  108.  
  109.  
  110.     for (int i = 0; i < N; i++) {
  111.         if (matrix[i][N] == 0) continue;
  112.         line = i;
  113.     }
  114.  
  115.     for (int j = 0; j < N + 1; j++) {
  116.         transformed[_line][j] = matrix[line][j];
  117.     }
  118.  
  119.     for (int j = 0; j < N; j++) {
  120.         res[j] = 0;
  121.     }
  122.  
  123.     for (int i = N - 1; i >= 0; i--) {
  124.         R = transformed[i][N];
  125.         for (int j = 0; j < N; j++) {
  126.             if ((transformed[i][j] != 0) && (res[j] != 0)) {
  127.                 R -= transformed[i][j] * res[j];
  128.             }
  129.         }
  130.         for (int j = 0; j < N; j++) {
  131.             if ((transformed[i][j] != 0) && (res[j] == 0)) {
  132.                 res[j] = R / transformed[i][j];
  133.             }
  134.         }
  135.     }
  136.  
  137.     return res;
  138. }
  139.  
  140. double * MakeA(double a, double b, int N) {
  141.     int i, j;
  142.     double ** A = new double*[N + 1];
  143.     for (int i = 0; i < N + 1; i++)
  144.         A[i] = new double[N + 1];
  145.  
  146.     for (i = 0; i < N; i++) {
  147.         for (j = 0; j < N + 1; j++) {
  148.             A[i][j] = A[j][i] = Integral(i, j, a, b, N);
  149.         }
  150.         A[i][N] = Integral(i, N, a, b, N);
  151.     }
  152.  
  153.     return ChooseMainElement(A, N);
  154.  
  155. }
  156.  
  157. double Pm(double x, double a, double b, double *A, int n) {
  158.     double  t = (2 * x - b - a) / (b - a);
  159.     double y = 0;
  160.     for (int j = 0; j < n; ++j)
  161.         y += A[j] * L(j, t);
  162.     return y;
  163. }
  164.  
  165. int main() {
  166.     double a = 1, b = 35;
  167.     double eps = 0.01;
  168.  
  169.     int k = (b - a) * 2;
  170.     double step = (b - a) / k;
  171.     int n = 2;
  172.  
  173.     while (true) {
  174.         n *= 2;
  175.         double deviation = 0;
  176.         double x = a;
  177.         double *A = MakeA(a, b, n);
  178.         for (int i = 0; i <= k; ++i) {
  179.             double y = Function(x) - Pm(x, a, b, A, n);
  180.             deviation += y * y;
  181.             x += step;
  182.         }
  183.         deviation = sqrt(deviation / (k + 1));
  184.         if (deviation <= eps) break;
  185.     }
  186.  
  187.     cout << "N = " << n << endl << endl;
  188.  
  189.     double *A = MakeA(a, b, n);
  190.     cout << "|  X  | P(x)" << endl;
  191.     for (double i = a; i <= b; i += step) {
  192.         printf("%3.1f %.8f\n", i, Pm(i, a, b, A, n));
  193.     }
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement