Advertisement
dark-s0ul

lab5.cpp

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