Advertisement
IlidanBabyRage

polynom_approx.cpp

Oct 26th, 2015
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.13 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <fstream>
  6. #include <cmath>
  7.  
  8. using namespace std;
  9.  
  10. const double EPS = 0.01;
  11.  
  12. typedef long long int lli;
  13. typedef unsigned long long ulli;
  14. typedef double **matrix;
  15. typedef vector<int> vi;
  16. typedef vector<bool> vb;
  17.  
  18. double det(double** m, int l, vb used, int n);
  19. double vandermond_det(double** m, int n);
  20. double vandermond_det(double* m, int n);
  21. void print_mat(double **mat, int m, int n);
  22. double* pol_approx(double *m, double *b, int n);
  23. double polynom(double *m, double x, int n);
  24.  
  25. int main(){
  26.  
  27.     vb used;
  28.     int n;
  29.     ifstream in_file("input.txt");
  30.     in_file >> n;
  31. //  double **mat = new double*[n];
  32. //  for (int i = 0; i < n; i++)
  33. //        mat[i] = new double[n];
  34. //  for (int i = 0; i < n; i++)
  35. //        for (int j = 0; j < n; j++)
  36. //            in_file >> mat[i][j];
  37. //  print_mat(mat, n, n);
  38.     used.resize(n);
  39.     for (int i = 0; i < n; i++)
  40.         used[i] = false;
  41.     double *x = new double[n];
  42.     double *b = new double[n];
  43.     for (int i = 0; i < n; i++)
  44.         in_file >> x[i] >> b[i];
  45.  
  46.     double *coef = pol_approx(x, b, n);
  47.     for (int i = n - 1; i >= 0; i--)
  48.         cout << coef[i] << endl;
  49. //    for (int i = 0; i < n; i++)
  50. //        delete [] mat[i];
  51. //    delete [] mat;
  52.     in_file.close();
  53.     return 0;
  54. }
  55.  
  56. double det(double** m, int l, vb used, int n){
  57.     if (l >= n)
  58.         return 1;
  59.     double sum = 0;
  60.     int uneven_cnt = 0;
  61.     for (int i = 0; i < n; i++){
  62.         if (!used[i]){
  63.             used[i] = true;
  64.             sum += ((i + uneven_cnt)% 2 ? -1 : 1) * m[l][i] * det(m, l + 1, used, n);
  65.             used[i] = false;
  66.         }else
  67.             uneven_cnt++;
  68.     }
  69.     return sum;
  70. }
  71.  
  72. double vandermond_det(double** m, int n){
  73.     double ans = 1;
  74.     for (int i = n - 1; i >= 0; i--)
  75.         for (int j = i - 1; j >= 0; j--)
  76.             ans *= (m[i][1] - m[j][1]);
  77.     return ans;
  78. }
  79.  
  80. double vandermond_det(double* m, int n){
  81.     double ans = 1;
  82.     for (int i = n - 1; i >= 0; i--)
  83.         for (int j = i - 1; j >= 0; j--)
  84.             ans *= (m[i] - m[j]);
  85.     return ans;
  86. }
  87.  
  88. double* pol_approx(double *m, double *b, int n){
  89.     double vand = vandermond_det(m, n), tmp;
  90.     if (vand < EPS){
  91.         cout << "nope" << endl;
  92.         return NULL;
  93.     }
  94.     double **tmp_mat = new double*[n];
  95.     double *ans = new double[n];
  96.     for (int i = 0; i < n; i++)
  97.         tmp_mat[i] = new double[n];
  98.     for (int i = 0; i < n; i++)
  99.         for (int j = 0; j < n; j++)
  100.             tmp_mat[i][j] = pow(m[i], j);
  101.     vb used;
  102.     used.resize(n);
  103.     for (int i = 0; i < n; i++){
  104.         for (int j = 0; j < n; j++)
  105.             swap(tmp_mat[j][i], b[j]);
  106.         ans[i] = det(tmp_mat, 0, used, n) / vand;
  107.         for (int j = 0; j < n; j++)
  108.             swap(tmp_mat[j][i], b[j]);
  109.     }
  110.     return ans;
  111. }
  112.  
  113. double polynom(double *m, double x, int n){
  114.     double ans = 0;
  115.     for (int i = n - 1; i >= 1; i--){
  116.         ans = (ans + m[i]) * x;
  117.     }
  118.     return ans + m[0];
  119. }
  120.  
  121. void print_mat(double **mat, int m, int n){
  122.     for (int i = 0; i < m; i++){
  123.         for (int j = 0; j < n; j++)
  124.             printf("%4.4f ", mat[i][j]);
  125.         printf("\n");
  126.     }
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement