Advertisement
MaPV

VP_4_GAUSS-ZEIDEL

Dec 31st, 2016
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.19 KB | None | 0 0
  1. /*Метод Гаусса-Зейделя иногда называют также итерационным методом "последовательных смещений", а его основная идея - немедленно вовлекать уже полученную информацию в вычислительный процесс - с успехом применима и для нелинейных итерационных схем.
  2. т.е. это метод якоби с использованием значений вектора х, найденных в текущем шаге
  3. */
  4. #include <iostream>
  5. #include <cmath>
  6. #include <iomanip>
  7. #include <vector>
  8. using namespace std;
  9.  
  10. double eps = 0.000000001;
  11. double N = 3;
  12.  
  13. bool converge (vector<double> &xk,vector<double> &xkp){ //условие сходимости
  14.     double norm = 0;
  15.     for (int i = 0; i < N; i++){
  16.         norm += (xk[i] - xkp[i])*(xk[i] - xkp[i]);
  17.     }
  18.     if (sqrt (norm) >= eps)
  19.         return false;
  20.     return true;
  21. }
  22.  
  23. double iterat (vector<vector<double>> &A,vector<double> B){// Решаем систему методом Гаусса-Зейделя.
  24.         int k=0;
  25.         vector<double>x(N),p(N);  //текущие и предыдущие решения
  26.         int i,j;
  27.         do
  28.         {//iteracii
  29.         //for (i = 0; i < N; i++)
  30.             p = x;
  31.  
  32.                 for (i = 0; i < N; i++)
  33.                 {
  34.                     double var = 0;
  35.                     for (j = 0; j < i; j++)
  36.                         var +=  A[i][j] * x[j];
  37.                     for(j=i+1;j<N;j++)
  38.                         var+=(A[i][j]*p[j]);
  39.                     x[i] = (B[i]-var)/A[i][i];
  40.                 }
  41.  
  42.             k++;
  43.         } while (!converge (x,p));
  44.  
  45.             cout << "Решение системы:" << endl;
  46.             for (i = 0; i < N; i++){
  47.                 cout << "X" << i+1 << " = " << x[i]<<fixed<<setprecision(8) << endl;
  48.             }
  49.             cout << "Число итераций: " << k - 1 << endl;
  50.     return 0;
  51. }
  52.  
  53. void crt (vector<vector<double>> &matrix,vector<double>&matrixB,double N){
  54.     cout << "Заполните матрицу А: " << endl;
  55.     for (int i = 0; i < matrix.size (); i++){
  56.         for (int j = 0; j < matrix[i].size (); j++){
  57.         cout<<"A["<<i+1<<"]["<<j+1<<"] = ";
  58.             cin >> matrix[i][j];
  59.         }
  60.         cout << endl;
  61.     }
  62.     cout<<"Заполните стоблец свободных членов:"<<endl;
  63.     for (int i = 0; i < matrixB.size (); i++){
  64.         cout << "В[" << i + 1 << "] = ";
  65.         cin >> matrixB[i];
  66.     }
  67.     cout<<endl;
  68. }
  69. void prnt (vector<vector<double>> &matrix){
  70.     int i,j;
  71.     for (i = 0; i < matrix.size (); i++){
  72.         for (j = 0; j < matrix[i].size (); j++){
  73.             cout << matrix[i][j] << " ";
  74.         }
  75.         cout << "\n";
  76.     }
  77.     cout << "\n";
  78. }
  79. void prntB (vector<double> &matrix){
  80.     int i,j;
  81.     for (i = 0; i < matrix.size (); i++){
  82.             cout << matrix[i] << " ";
  83.     }
  84.     cout << "\n";
  85. }
  86.  
  87.  
  88. int main (){
  89.     setlocale (LC_ALL,"Ru");
  90.     vector<vector<double>> A (N,vector<double> (N));
  91.     vector<double> B(N);
  92.     //crt(A,B,N);
  93.     A[0] = {5.6,2.8,6.7};
  94.     A[1] = {1.14,9.18,0.3};
  95.     A[2] = {0.3,2.3,7.3};
  96.     B[0]={10};
  97.     B[1]={15.9};
  98.     B[2]={32.6};
  99.     //0.686098 4.43678 -2.29026
  100.  
  101.     /*cout<<"Заполните матрицу А: "<<endl;
  102.     for (int i = 0; i < Ab.size (); i++){
  103.     for (int j = 0; j < Ab[i].size (); j++){
  104.     cin >> Ab[i][j];
  105.     }
  106.     cout<<endl;
  107.     }*/
  108.     prnt(A);
  109.     prntB (B);
  110.     cout << endl;
  111.     iterat (A,B);
  112.     system("pause");
  113.     return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement