Advertisement
dmkozyrev

gauss.cpp

Dec 2nd, 2016
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.70 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3. #include <iomanip>
  4. #include <cmath>
  5. #include <fstream>
  6.  
  7. using namespace std;
  8.  
  9. ofstream fout ("out.txt");
  10.  
  11. void print(const vector<vector<double>> & v) {
  12.     for (auto & row : v) {
  13.         for (auto & it : row)
  14.             fout << setw(12) << it;
  15.         fout << endl;
  16.     }
  17. }
  18.  
  19. vector<double> solve(vector<vector<double>> & D) {
  20.     int m = D.size(), n = D.front().size(), now = 0;
  21.     for (int j = 0, i; j < n-1; ++j) {
  22.         for (i = now; i < m && !D[i][j]; ++i);
  23.         if ( i == m ) continue;
  24.         swap(D[i], D[now]);
  25.         for (i = now+1; i < m; ++i) {
  26.             if ( !D[i][j] ) continue;
  27.             double c = D[i][j] / D[now][j];
  28.             for (int k = j; k < n; ++k)
  29.                 D[i][k] -= c * D[now][k];
  30.         }
  31.         ++now;
  32.     }
  33.    
  34.     now = m-1;
  35.    
  36.     for (int j = n-2; j >= 0; --j, --now) {
  37.         if ( !D[now][j] ) continue;
  38.        
  39.         for (int i = now-1; i >= 0; --i) {
  40.             if ( !D[i][j] ) continue;
  41.             double c = D[i][j] / D[now][j];
  42.             for (int k = n-1; k >= 0; --k)
  43.                 D[i][k] -= c * D[now][k];
  44.         }
  45.     }
  46.    
  47.     vector<double> answer(m, 0);
  48.     for (int i = 0; i < m; ++i)
  49.         if ( D[i][i] ) {
  50.             D[i].back() /= D[i][i];
  51.             D[i][i] = 1;
  52.             answer[i] = D[i].back();
  53.         }
  54.     return answer;
  55. }
  56.  
  57. int main() {
  58.     vector<vector<double>> f = {
  59.         {-1.0, 0.86603},
  60.         {0.0, 1.0},
  61.         {1.0, 0.86603},
  62.         {2.0, 0.5},
  63.         {3.0, 0.0},
  64.         {4.0, -0.5}
  65.     };
  66.    
  67.     for (int n = 1; n <= 6; ++n) {
  68.         fout << "--------------------------------------------------------------" << endl;
  69.         fout << "n = " << n << endl;
  70.         vector<vector<double>> s (n+1, vector<double>(n+2, 0.0));
  71.         for (int k = 0; k <= n; ++k) {
  72.             for (int i = 0; i <= n; ++i)
  73.                 for (int j = 0; j < f.size(); ++j)
  74.                     s[k][i] += pow(f[j][0], k+i);
  75.            
  76.             for (int j = 0; j < f.size(); ++j)
  77.                 s[k].back() += f[j][1] * pow(f[j][0], k);
  78.         }
  79.        
  80.         fout << "Before:" << endl;
  81.         print(s);
  82.         fout << endl;
  83.        
  84.         auto a = solve(s);
  85.        
  86.         fout << "After:" << endl;
  87.         print(s);
  88.         fout << endl;
  89.        
  90.         fout << "Answer:" << endl;
  91.         for (auto & it : a)
  92.             fout << setw(12) << it;
  93.        
  94.         fout << endl;
  95.        
  96.         double F = 0;
  97.         for (int j = 0; j < f.size(); ++j) {
  98.             double r = 0;
  99.             for (int i = 0; i <= n; ++i)
  100.                 r += a[i] * pow(f[j][0], i);
  101.             r -= f[j][1];
  102.             F += r*r;
  103.         }
  104.         fout << endl << "F = " << F << endl;
  105.     }
  106.    
  107.     return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement