Advertisement
dark-s0ul

lab5_anton

Jan 17th, 2018
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.64 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cmath>
  3. #include <vector>
  4.  
  5. #define a 0
  6. #define b 1.2
  7.  
  8. double Function(double x) {
  9.     return 10 * x * x * cosh(x) * sin(13 * 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.     if (k2 == N) {
  32.         return Chebyshev(t, k1) * Function(x);
  33.     }
  34.     else {
  35.         return Chebyshev(t, k1) * Chebyshev(t, k2);
  36.     }
  37. }
  38.  
  39. double Simpson(int k1, int k2, int n, int N) {
  40.     double h = (b - a) / (double)n;
  41.     double s1 = 0;
  42.     double s2 = 0;
  43.  
  44.     for (int i = 1; i < n; i++) {
  45.         double x = a + i * h;
  46.  
  47.         if (i % 2 == 0) {
  48.             s2 += F(x, k1, k2, N);
  49.         }
  50.         else {
  51.             s1 += F(x, k1, k2, N);
  52.         }
  53.     }
  54.  
  55.     return h / 3.0 * (2.0 * s2 + 4.0 * s1 + F(a, k1, k2, N) + F(b, k1, k2, N));
  56. }
  57.  
  58. double Runge(int k1, int k2, int N) {
  59.     int n = (b - a) * 100;
  60.  
  61.     double I2n = Simpson(k1, k2, n, N);
  62.  
  63.     for (;;) {
  64.         double In = I2n;
  65.         I2n = Simpson(k1, k2, n *= 2, N);
  66.         if (fabs(In - I2n) < 15e-8) break;
  67.     }
  68.  
  69.     return I2n;
  70. }
  71.  
  72. void FillPolinom(std::vector<double> &p) {
  73.     int N = p.size();
  74.  
  75.     double **M = new double*[N];
  76.     for (int i = 0; i < N; i++) {
  77.         M[i] = new double[N + 1]{ 0 };
  78.     }
  79.  
  80.     for (int i = 0; i < N; i++) {
  81.         for (int j = 0; j <= N; j++) {
  82.             M[i][j] = Runge(i, j, N);
  83.         }
  84.     }
  85.  
  86.     for (int j = 0; j < N; j++) {
  87.         double m = M[j][j];
  88.         for (int i = j; i <= N; i++) {
  89.             M[j][i] /= m;
  90.         }
  91.         for (int k = j + 1; k < N; k++) {
  92.             double m = M[k][j];
  93.             for (int l = j; l <= N; l++) {
  94.                 M[k][l] -= M[j][l] * m;
  95.             }
  96.         }
  97.     }
  98.  
  99.     for (int i = N - 1; i >= 0; i--) {
  100.         double s = 0;
  101.  
  102.         for (int j = i + 1; j < N; j++) {
  103.             s += M[i][j] * p[j];
  104.         }
  105.         p[i] = M[i][N] - s;
  106.     }
  107.  
  108.     for (int i = 0; i < N; i++) {
  109.         delete[] M[i];
  110.     }
  111.     delete[] M;
  112. }
  113.  
  114. double Polinom(double x, const std::vector<double> &p) {
  115.     double t = (2 * x - b - a) / (b - a);
  116.     double s = 0;
  117.  
  118.     for (int i = 0, N = p.size(); i < N; i++) {
  119.         s += p[i] * Chebyshev(t, i);
  120.     }
  121.     return s;
  122. }
  123.  
  124. std::vector<double> FindPolinom() {
  125.     for (std::vector<double> p(4); ; p.resize(p.size() << 1)) {
  126.         FillPolinom(p);
  127.  
  128.         double sqrError = 0;
  129.         for (int i = 0; i <= 60; i++) {
  130.             double x = a + i * 0.02;
  131.             double d = Function(x) - Polinom(x, p);
  132.             sqrError += d * d;
  133.         }
  134.  
  135.         if (sqrError < 61e-6) return p;
  136.     }
  137. }
  138.  
  139. int main() {
  140.     auto const &p = FindPolinom();
  141.  
  142.     printf("N = %i\n", p.size());
  143.  
  144.     for (int i = 0; i <= 60; i++) {
  145.         double x = a + i * 0.02;
  146.  
  147.         printf("%-.2f\t%.8f\n", x, Polinom(x, p));
  148.     }
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement