Advertisement
MeShootIn

Least squares

May 4th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <math.h>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. double binary_power(double a, int n){
  8.     if(n == 0){
  9.         return 1;
  10.     }
  11.    
  12.     if(n % 2 == 0){
  13.         double res = binary_power(a, n / 2);
  14.        
  15.         return res * res;
  16.     }
  17.     return a * binary_power(a, n - 1);
  18. }
  19.  
  20. void fill(vector < vector <double> > & M, vector <double> & x, vector <double> & y, vector <double> & b){
  21.     int N = x.size();
  22.     int k = M.size() - 1;
  23.     vector <double> Sum(2 * k + 1);
  24.    
  25.     Sum[0] = N;
  26.     for(int i = 1; i <= 2 * k; ++i){
  27.         for(int j = 0; j < N; ++j){
  28.             Sum[i] += binary_power(x[j], i);
  29.         }
  30.     }
  31.    
  32.     for(int i = 0; i <= k; ++i){
  33.         for(int j = 0; j <= k; ++j){
  34.             M[i][j] = Sum[2 * k - (i + j)];
  35.         }
  36.     }
  37.    
  38.     for(int i = 0; i <= k; ++i){
  39.         for(int j = 0; j < N; ++j){
  40.             b[i] += binary_power(x[j], k - i) * y[j];
  41.         }
  42.     }
  43. }
  44.  
  45. void triangulation(vector < vector <double> > & A, vector <double> & b){
  46.     int N = A.size();
  47.    
  48.     for(int j = 0; j < N; ++j){
  49.         if(A[j][j] == 0){
  50.             int index = 0;
  51.             for(int i = 1; i < N; ++i){
  52.                 if(fabs(A[i][j]) > A[index][j] && A[i][j] != 0){
  53.                     index = i;
  54.                 }
  55.             }
  56.             swap(A[j], A[index]);
  57.             swap(b[j], b[index]);
  58.         }
  59.         for(int i = j + 1; i < N; ++i){
  60.             double m = A[i][j] / A[j][j];
  61.             for(int k = j; k < N; ++k){
  62.                 A[i][k] -= m * A[j][k];
  63.             }
  64.             b[i] -= m * b[j];
  65.         }
  66.     }
  67. }
  68.  
  69. void solve(vector < vector <double> > & A, vector <double> & x, vector <double> & b){
  70.     int N = A.size();
  71.    
  72.     for(int i = N - 1; i >= 0; --i){
  73.         double Sum = 0;
  74.         for(int j = i + 1; j < N; ++j){
  75.             Sum += A[i][j] * x[j];
  76.         }
  77.         x[i] = (b[i] - Sum) / A[i][i];
  78.     }
  79. }
  80.  
  81. int main(){
  82.     cout << "Enter the number of points:\n";
  83.     int N;
  84.     cin >> N;
  85.    
  86.     vector <double> x(N), y(N);
  87.    
  88.     cout << "Enter " << N << " pairs of coordinates (x, y):\n";
  89.     for(int i = 0; i < N; ++i){
  90.         cin >> x[i] >> y[i];
  91.     }
  92.    
  93.     cout << "Enter polynomial degree:\n";
  94.     int k;
  95.     cin >> k;
  96.    
  97.     vector < vector <double> > M(k + 1, vector <double> (k + 1));
  98.     vector <double> b(k + 1);
  99.     fill(M, x, y, b);
  100.    
  101.     vector <double> a(N);
  102.    
  103.     triangulation(M, b);
  104.     solve(M, a, b);
  105.    
  106.     cout << "Polynomial coefficients (starting from the highest power):\n";
  107.     for(int i = 0; i <= k; ++i){
  108.         cout << a[i] << " ";
  109.     }
  110.     cout << "\n";
  111.    
  112.     system("PAUSE");
  113.     return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement