dark-s0ul

lab5

Dec 28th, 2017
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.30 KB | None | 0 0
  1. using namespace std;
  2.  
  3. #include <math.h>
  4. #include <iomanip>
  5. #include <iostream>
  6.  
  7. const double a = 0, b = 7;
  8. const int k = (b - a) * 50;
  9. const double step = (b - a) / (double)k;
  10. const double sqrEpsilon = 1.0e-6 * (k + 1);
  11.  
  12. double Function(double x) {
  13.     return (x * x - sin(x)) * cos(2.5 * x);
  14. }
  15.  
  16. double Legendre(double x, int N) {
  17.     double Tn = x, Tnm1 = 1;
  18.     if (N == 0) return Tnm1;
  19.  
  20.     for (int i = 1; i < N; i++) {
  21.         double T = 2 * x * Tn - Tnm1;
  22.  
  23.         Tnm1 = Tn;
  24.         Tn = T;
  25.     }
  26.  
  27.     return Tn;
  28. }
  29.  
  30. double Square(double t, int k1, int k2, int N) {
  31.     double x = (2 * t - a - b) / (b - a);
  32.     if (k2 == N) return Function(t) * Legendre(x, k1);
  33.     else return Legendre(x, k1) * Legendre(x, k2);
  34. }
  35.  
  36. double Simpson(int k1, int k2, int n, int N) {
  37.     double h = (b - a) / (double) n;
  38.     double sig1 = 0, sig2 = 0;
  39.     double x = a + h;
  40.  
  41.     for (int i = 1; i < n; i++, x += h) {
  42.         if (i % 2 == 0) sig2 += Square(x, k1, k2, N);
  43.         else sig1 += Square(x, k1, k2, N);
  44.     }
  45.  
  46.     return h / 3.0 * (2.0 * sig2 + 4.0 * sig1 + Square(a, k1, k2, N) + Square(b, k1, k2, N));
  47. }
  48.  
  49. void Ak(double *X, int N) {
  50.     double matrix[N][N + 1], tmatrix[N][N + 1];
  51.  
  52.     for (int i = 0; i < N; i++) {
  53.         for (int j = 0; j <= N; j++) {
  54.             int n = (int((b - a) * 100) >> 1) << 1;
  55.             double In, I2n = Simpson(i, j, n, N);
  56.             do {
  57.                 In = I2n;
  58.                 I2n = Simpson(i, j, n *= 2, N);
  59.             } while (fabs(In - I2n) / 15 > 1e-8);
  60.  
  61.             matrix[i][j] = I2n;
  62.         }
  63.     }
  64.  
  65.     int p, q, ln = 0;
  66.     for (int k = 0; k < N - 1; k++) {
  67.         double a = 0;
  68.         for (int i = 0; i < N; i++) {
  69.             for (int j = 0; j < N; j++) {
  70.                 if (fabs(matrix[i][j]) > a) {
  71.                     a = fabs(matrix[i][j]);
  72.                     p = i;
  73.                     q = j;
  74.                 }
  75.             }
  76.         }
  77.  
  78.         for (int j = 0; j < N + 1; j++) {
  79.             tmatrix[ln][j] = matrix[p][j];
  80.         }
  81.  
  82.         ln++;
  83.  
  84.         for (int i = 0; i < N; i++) {
  85.             if (i == p) continue;
  86.             double m = -matrix[i][q] / a;
  87.             for (int j = 0; j < N + 1; j++) {
  88.                 if (j == q) continue;
  89.                 matrix[i][j] += matrix[p][j] * m;
  90.             }
  91.         }
  92.  
  93.         for (int j = 0; j < N + 1; j++) {
  94.             matrix[p][j] = 0;
  95.         }
  96.  
  97.         for (int i = 0; i < N; i++) {
  98.             matrix[i][q] = 0;
  99.         }
  100.  
  101.     }
  102.    
  103.     for (int i = 0; i < N; i++) {
  104.         if (matrix[i][N] != 0) {
  105.             p = i;
  106.         }
  107.     }
  108.  
  109.     for (int j = 0; j < N + 1; j++) {
  110.         tmatrix[ln][j] = matrix[p][j];
  111.     }
  112.  
  113.     for (int j = 0; j < N; j++) {
  114.         X[j] = 0;
  115.     }
  116.  
  117.     for (int i = N - 1; i >= 0; i--) {
  118.         double R = tmatrix[i][N];
  119.         for (int j = 0; j < N; j++) {
  120.             if ((tmatrix[i][j] != 0) && (X[j] != 0)) {
  121.                 R -= tmatrix[i][j] * X[j];
  122.             }
  123.         }
  124.         for (int j = 0; j < N; j++) {
  125.             if ((tmatrix[i][j] != 0) && (X[j] == 0)) {
  126.                 X[j] = R / tmatrix[i][j];
  127.             }
  128.         }
  129.     }
  130. }
  131.  
  132. double Polinom(double x, double *A, int N) {
  133.     double t = (2 * x - b - a) / (b - a), s = 0;
  134.     for (int j = 0; j < N; j++) {
  135.         s += A[j] * Legendre(t, j);
  136.     }
  137.     return s;
  138. }
  139.  
  140. int main() {
  141.     int N = 2;
  142.  
  143.     double sqrErr = 0;
  144.     do {
  145.         N *= 2;
  146.         sqrErr = 0;
  147.         double *ak = new double[N];
  148.         Ak(ak, N);
  149.  
  150.         double x = a;
  151.         for (int i = 0; i <= k; i++, x += step) {
  152.             sqrErr += pow(Function(x) - Polinom(x, ak, N), 2);
  153.         }
  154.         delete[] ak;
  155.     } while (sqrErr >= sqrEpsilon);
  156.  
  157.     cout << "N = " << N << endl << endl;
  158.  
  159.     double *ak = new double[N];
  160.     Ak(ak, N);
  161.     cout << "X     P(x)" << endl;
  162.     double x = a;
  163.     for (int i = 0; i <= k; i++, x += step) {
  164.         printf("%-5g %g\n", x, Polinom(x, ak, N));
  165.     }
  166.     delete[] ak;
  167. }
Advertisement
Add Comment
Please, Sign In to add comment