Advertisement
dark-s0ul

lab5.cpp

Dec 26th, 2017
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.29 KB | None | 0 0
  1. using namespace std;
  2.  
  3. #include <iostream>
  4. #include <vector>
  5. #include <cmath>
  6.  
  7. double f(double x) {
  8.     return 10.0 * asin(x) * cos(11.0 * x) * cos(x);
  9. }
  10.  
  11. vector<double> single_division(double **A, int N) {
  12.     int i, j, k, l;
  13.     double tmp1, tmp2, tmp3;
  14.     vector<double> res(N);
  15.  
  16.     for (int j = 0; j < N; j++) {
  17.         tmp1 = A[j][j];
  18.         for (int i = j; i < N + 1; i++) {
  19.             A[j][i] /= tmp1;
  20.         }
  21.         for (int k = j + 1; k < N; k++) {
  22.             tmp2 = A[k][j];
  23.             for (l = j; l < N + 1; l++) {
  24.                 A[k][l] -= A[j][l] * tmp2;
  25.             }
  26.         }
  27.     }
  28.     for (int j = N - 1; j >= 0; j--) {
  29.         tmp3 = 0;
  30.         for (int i = N - 1; i > j; i--) {
  31.             tmp3 += A[j][i] * res[i];
  32.         }
  33.         res[j] = A[j][N] - tmp3;
  34.     }
  35.     return res;
  36. }
  37.  
  38. double chebyshev(double x, int n){
  39.     double Tn = x, Tn_minus_1 = 1;
  40.     if (n == 0) return Tn_minus_1;
  41.  
  42.     for (int i = 1; i < n; i++) {
  43.         double T = 2 * x * Tn - Tn_minus_1;
  44.  
  45.         Tn_minus_1 = Tn;
  46.         Tn = T;
  47.     }
  48.  
  49.     return Tn;
  50. }
  51.  
  52. double func(double x, int k1, int k2, double a, double b, int N){
  53.     double t = (2 * x - (a + b)) / (b - a);
  54.     return chebyshev(t, k1) * (k2 == N ? f(x): chebyshev(t, k2));
  55. }
  56.  
  57. double trapezoid(double a, double b, int k1, int k2, int n, int N){
  58.     double h = (b - a) / n, s = (func(a, k1, k2, a, b, N) + func(b, k1, k2, a, b, N)) * 0.5;
  59.     for (double x = a + h; x < b; x += h) {
  60.         s += func(x, k1, k2, a, b, N);
  61.     }
  62.     return s * h;
  63. }
  64.  
  65. double integral(double a, double b, int k1, int k2, int N){
  66.     double error, In, I2n, eps = 1e-3;
  67.     int n = 2 * ceil((b - a) / sqrt(eps) * 0.5);
  68.     In = trapezoid(a, b, k1, k2, n, N);
  69.     I2n = trapezoid(a, b, k1, k2, 2 * n, N);
  70.     error = fabs(In - I2n) / 3;
  71.  
  72.     while (error > eps) {
  73.         In = I2n;
  74.         n *= 2;
  75.         I2n = trapezoid(a, b, k1, k2, n, N);
  76.         error = fabs(In - I2n) / 3;
  77.     }
  78.     return I2n;
  79. }
  80.  
  81. // double Runge(int k1, int k2, double a, double b, int N) {
  82. //  double error = 1e-8;
  83.    
  84. //  int n = 2 * ceil((b - a) / pow(error, 0.25) / 2.0);
  85. //  double h = (b - a) / n;
  86.    
  87. //  double R = 0, In, I2n = Simpson(k1, k2, a, b, n, N);
  88. //  do {
  89. //      In = I2n;
  90. //      I2n = Simpson(k1, k2, a, b, n *= 2, N);
  91. //      R = fabs(In - I2n) / 15;
  92. //  } while (R > error);
  93.  
  94. //  return I2n;
  95. // }
  96.  
  97. vector<double> Ak(double a, double b, int N){
  98.     double ** A = new double*[N];
  99.     for (int i = 0; i < N + 1; i++) {
  100.         A[i] = new double[N + 1];
  101.     }
  102.  
  103.     for (int i = 0; i < N; i++) {
  104.         for (int j = 0; j < N + 1; j++) {
  105.             A[i][j] = A[j][i] = integral(a, b, i, j, N);
  106.         }
  107.         A[i][N] = integral(a, b, i, N, N);
  108.     }
  109.  
  110.     return single_division(A, N);
  111. }
  112.  
  113. double P(double x, double a, double b, int n, vector<double> A) {
  114.     double  t = (2 * x - b - a) / (b - a);
  115.     double s = 0;
  116.     for (int i = 0; i < n; i++) {
  117.         s += A[i] * chebyshev(t, i);
  118.     }
  119.     return s;
  120. }
  121.  
  122. int N_P(double eps, double a, double b){
  123.     double y, x, error, step = 0.2;
  124.     int n = 2, k = (int)(b - a) / step;
  125.  
  126.     do {
  127.         n *= 2;
  128.         error = 0;
  129.         x = a;
  130.         for (int i = 0; i <= k; ++i) {
  131.             y = f(x) - P(x, a, b, n, Ak(a, b, n));
  132.             error += y * y;
  133.             x += step;
  134.         }
  135.         error = sqrt(error / (k + 1));
  136.     } while (error > eps);
  137.  
  138.     return n;
  139. }
  140.  
  141.  
  142. int main(){
  143.     double a = -1, b = 1;
  144.     double eps = 1e-2;
  145.  
  146.     int N = N_P(eps, a, b) * 2;
  147.     cout << "N = " << N << endl;
  148.  
  149.     auto A = Ak(a, b, N);
  150.     for (double x = a; x <= b; x += 0.1) {
  151.         double res = P(x, a, b, N, A);
  152.         printf("\t{ %-5.1f,  %.8f },\n", x, res);
  153.        
  154.     }
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement