Advertisement
dark-s0ul

lab5

Jan 18th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.45 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cmath>
  3. #include <vector>
  4.  
  5. double a = 1;
  6. double b = 6.5;
  7.  
  8. double F(double x) {
  9.     return exp(pow(x + 5.0, 0.25)) * sin(3.0 * x) * cos(x);
  10. }
  11.  
  12. double Chebyshev(double x, int n) {
  13.     if (n == 0) return 1;
  14.  
  15.     double tn = x;
  16.     double tnm1 = 1;
  17.  
  18.     for (int i = 1; i < n; i++) {
  19.         double tnp1 = 2 * x * tn - tnm1;
  20.  
  21.         tnm1 = tn;
  22.         tn = tnp1;
  23.     }
  24.  
  25.     return tn;
  26. }
  27.  
  28. double F(double x, int k1, int k2, int N) {
  29.     double t = (2 * x - (a + b)) / (b - a);
  30.  
  31.     return Chebyshev(t, k1) * (k2 == N ? F(x) : Chebyshev(t, k2));
  32. }
  33.  
  34. double Simpson(int k1, int k2, int n, int N) {
  35.     double h = (b - a) / (double)n;
  36.     double s = F(a, k1, k2, N) + F(b, k1, k2, N);
  37.  
  38.     for (int i = 1; i < n; i++) {
  39.         double x = a + i * h;
  40.  
  41.         s += F(x, k1, k2, N) * (i % 2 == 0 ? 2.0 : 4.0);
  42.     }
  43.  
  44.     return h * s / 3.0;
  45. }
  46.  
  47. double Runge(int k1, int k2, int N) {
  48.     int n = (b - a) * 100;
  49.  
  50.     double I2n = Simpson(k1, k2, n, N);
  51.  
  52.     for (;;) {
  53.         double In = I2n;
  54.         I2n = Simpson(k1, k2, n *= 2, N);
  55.         if (fabs(In - I2n) < 15e-8) break;
  56.     }
  57.  
  58.     return I2n;
  59. }
  60.  
  61. double Polinom(double x, const std::vector<double> &p) {
  62.     double t = (2 * x - b - a) / (b - a);
  63.     double s = 0;
  64.  
  65.     for (int i = 0, N = p.size(); i < N; i++) {
  66.         s += p[i] * Chebyshev(t, i);
  67.     }
  68.     return s;
  69. }
  70.  
  71. int main() {
  72.     std::vector<double> p(4);
  73.  
  74.     while (true) {
  75.         int N = p.size();
  76.  
  77.         double **matrix = new double*[N];
  78.         for (int i = 0; i < N; i++) {
  79.             matrix[i] = new double[N + 1];
  80.         }
  81.  
  82.         for (int i = 0; i < N; i++) {
  83.             for (int j = 0; j <= N; j++) {
  84.                 matrix[i][j] = Runge(i, j, N);
  85.             }
  86.         }
  87.  
  88.         for (int j = 0; j < N; j++) {
  89.             double m = 1.0 / matrix[j][j];
  90.             for (int i = j; i <= N; i++) {
  91.                 matrix[j][i] *= m;
  92.             }
  93.             for (int k = j + 1; k < N; k++) {
  94.                 double m = matrix[k][j];
  95.                 for (int l = j; l <= N; l++) {
  96.                     matrix[k][l] -= matrix[j][l] * m;
  97.                 }
  98.             }
  99.         }
  100.  
  101.         for (int i = N - 1; i >= 0; i--) {
  102.             double s = 0;
  103.             for (int j = i + 1; j < N; j++) {
  104.                 s += matrix[i][j] * p[j];
  105.             }
  106.             p[i] = matrix[i][N] - s;
  107.         }
  108.  
  109.         for (int i = 0; i < N; i++) {
  110.             delete[] matrix[i];
  111.         }
  112.         delete[] matrix;
  113.  
  114.         double err = 0;
  115.         for (int i = 0; i <= 60; i++) {
  116.             double x = a + i * 0.02;
  117.             double d = F(x) - Polinom(x, p);
  118.             err += d * d;
  119.         }
  120.  
  121.         if (err < 61e-6) break;
  122.         p.resize(N << 1);
  123.     }
  124.  
  125.     printf("N = %i\n", p.size());
  126.  
  127.     for (int i = 0; i <= 60; i++) {
  128.         double x = a + i * 0.02;
  129.  
  130.         printf("%-.2f\t%.8f\n", x, Polinom(x, p));
  131.     }
  132.     return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement