Advertisement
dark-s0ul

lab3.cpp

Dec 24th, 2017
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.13 KB | None | 0 0
  1. using namespace std;
  2.  
  3. #include <vector>
  4. #include <iostream>
  5. #include <iomanip>
  6. #include <cmath>
  7.  
  8. template <int N>
  9. struct Array {
  10.     double data[N];
  11.  
  12.     double &operator[](int index) {
  13.         return data[index];
  14.     }
  15.  
  16.     const double &operator[](int index) const {
  17.         return data[index];
  18.     }
  19.  
  20.     int size() {
  21.         return N;
  22.     }
  23. };
  24.  
  25. template<int N>
  26. Array<N> operator+(const Array<N> &a, const Array<N> &b) {
  27.     Array<N> r;
  28.     for (int i = 0; i < N; i++) {
  29.         r[i] = a[i] + b[i];
  30.     }
  31.     return r;
  32. }
  33.  
  34. template<int N>
  35. Array<N> operator-(const Array<N> &a, const Array<N> &b) {
  36.     Array<N> r;
  37.     for (int i = 0; i < N; i++) {
  38.         r[i] = a[i] - b[i];
  39.     }
  40.     return r;
  41. }
  42.  
  43. template<int N>
  44. Array<N> operator*(const Array<N> &a, const double &b) {
  45.     Array<N> r;
  46.     for (int i = 0; i < N; i++) {
  47.         r[i] = a[i] * b;
  48.     }
  49.     return r;
  50. }
  51.  
  52. template <int N, int M>
  53. struct Matrix {
  54.     Array<M> data[N];
  55.  
  56.     Array<M> &operator[](int index) {
  57.         return data[index];
  58.     }
  59. };
  60.  
  61.  
  62. template <int N, int M>
  63. void print(Matrix<N, M> A) {
  64.     for (int i = 0; i < N; i++) {
  65.         for (int j = 0; j < M; j++) {
  66.             cout << setw(5) << A[i][j] << ' ';
  67.         }
  68.         cout << endl;
  69.     }
  70. }
  71.  
  72. template <int N, int M>
  73. void single_division(Matrix<N, M> A) {
  74.     cout << "Single Division method" << endl;
  75.     print(A);
  76.  
  77.     Array<N> x;
  78.  
  79.     for (int j = 0; j < N; j++) {
  80.         double a = A[j][j];
  81.         for (int i = j; i < N + 1; i++) {
  82.             A[j][i] /= a;
  83.         }
  84.         for (int k = j + 1; k < N; k++) {
  85.             double a = A[k][j];
  86.             for (int l = j; l < N + 1; l++) {
  87.                 A[k][l] -= A[j][l] * a;
  88.             }
  89.         }
  90.     }
  91.     for (int j = N - 1; j >= 0; j--) {
  92.         double s = 0;
  93.         for (int i = N - 1; i > j; i--) {
  94.             s += A[j][i] * x[i];
  95.         }
  96.         x[j] = A[j][N] - s;
  97.     }
  98.  
  99.     for (int i = 0; i < x.size(); i++) {
  100.         cout << "x[" << (i + 1) << "] = " << x[i] << endl;
  101.     }
  102. }
  103.  
  104. template <int N, int M>
  105. void gauss_seidel(Matrix<N, M> matrix, double eps) {
  106.     cout << "Gauss-Seidel method" << endl;
  107.     print(matrix);
  108.  
  109.     Array<N> x, x0, beta;
  110.  
  111.     for (int i = 0; i < N; i++) {
  112.         x[i] = beta[i] = matrix[i][N] / matrix[i][i];
  113.     }
  114.  
  115.     Matrix<N, N> alfa;
  116.     for(int i = 0; i < N; i++) {
  117.         for(int j = 0; j < N; j++) {
  118.             alfa[i][j] = (i != j) ? (-matrix[i][j] / matrix[i][i]) : 0;
  119.         }
  120.     }
  121.  
  122.     double q = 0;
  123.     for(int i = 0; i < N; i++) {
  124.         double s = 0;
  125.         for(int j = 0; j < N; j++) {
  126.             s += fabs(alfa[i][j]);
  127.         }
  128.         if(s > fabs(q)) q = s;
  129.     }
  130.  
  131.     double epsilon = fabs((1 - q) * eps / q);
  132.     while (true) {
  133.         for (int i = 0; i < N; i++) {
  134.             x0[i] = x[i];
  135.  
  136.             double s = 0;
  137.             for (int j = 0; j < N; j++) {
  138.                 s += alfa[i][j] * x[j];
  139.             }
  140.             x[i] = beta[i] + s;
  141.         }
  142.  
  143.  
  144.         double error = 0;
  145.         for(int i = 0; i < N; i++) {
  146.             double delta = fabs(x0[i] - x[i]);
  147.             if (delta > error) error = delta;
  148.         }
  149.         if (error <= epsilon) break;
  150.     }
  151.     for (int i = 0; i < x.size(); i++) {
  152.         cout << "x[" << (i + 1) << "] = " << x[i] << endl;
  153.     }
  154. }
  155.  
  156. int main() {
  157.     Matrix<4, 5> AB = {{
  158.         {14, 19, 15, 4, 180},
  159.         {17, 33, 5, 10, 208},
  160.         {11, 6, 28, 10, 230},
  161.         { 6, 19, 3, 13, 149}
  162.     }};
  163.  
  164.     Matrix<4, 5> T = {
  165.         (AB[0] - AB[3]) * 2 - AB[2],
  166.         AB[1],
  167.         AB[2],
  168.         AB[3] * 3 - AB[0] * 4,
  169.     };
  170.  
  171.  
  172.     single_division(AB);
  173.    
  174.     cout << endl;
  175.  
  176.     gauss_seidel(T, 1e-20);
  177.    
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement