Advertisement
VictoriaLodochkina

simple_it

Nov 15th, 2021
732
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.71 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4.  
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9.     // Считываем размер вводимой матрицы
  10.     int size;
  11.     cin >> size;
  12.  
  13.     // Будем хранить матрицу в векторе, состоящем из
  14.     // векторов вещественных чисел
  15.     vector <vector <long double> > matrix;
  16.  
  17.     // Матрица будет иметь размер (size) x (size + 1),
  18.     // c учетом столбца свободных членов    
  19.     matrix.resize(size);
  20.     for (int i = 0; i < size; i++)
  21.     {
  22.         matrix[i].resize(size + 1);
  23.  
  24.         for (int j = 0; j < size + 1; j++)
  25.         {
  26.             cin >> matrix[i][j];
  27.         }
  28.     }
  29.  
  30.     // Считываем необходимую точность решения
  31.     long double eps;
  32.     cin >> eps;
  33.  
  34.     // Введем вектор значений неизвестных на предыдущей итерации,
  35.     // размер которого равен числу строк в матрице, т.е. size,
  36.     // причем согласно методу изначально заполняем его нулями
  37.     vector <long double> previousVariableValues(size, 0.0);
  38.  
  39.     // Будем выполнять итерационный процесс до тех пор,
  40.     // пока не будет достигнута необходимая точность    
  41.     while (true)
  42.     {
  43.         // Введем вектор значений неизвестных на текущем шаге      
  44.         vector <long double> currentVariableValues(size);
  45.  
  46.         // Посчитаем значения неизвестных на текущей итерации
  47.         // в соответствии с теоретическими формулами
  48.         for (int i = 0; i < size; i++)
  49.         {
  50.             // Инициализируем i-ую неизвестную значением
  51.             // свободного члена i-ой строки матрицы
  52.             currentVariableValues[i] = matrix[i][size];
  53.  
  54.             // Вычитаем сумму по всем отличным от i-ой неизвестным
  55.             for (int j = 0; j < size; j++)
  56.             {
  57.                 if (i != j)
  58.                 {
  59.                     currentVariableValues[i] -= matrix[i][j] * previousVariableValues[j];
  60.                 }
  61.             }
  62.  
  63.             // Делим на коэффициент при i-ой неизвестной
  64.             currentVariableValues[i] /= matrix[i][i];
  65.         }
  66.  
  67.         // Посчитаем текущую погрешность относительно предыдущей итерации
  68.         long double error = 0.0;
  69.  
  70.         for (int i = 0; i < size; i++)
  71.         {
  72.             error += abs(currentVariableValues[i] - previousVariableValues[i]);
  73.         }
  74.  
  75.         // Если необходимая точность достигнута, то завершаем процесс
  76.         if (error < eps)
  77.         {
  78.             break;
  79.         }
  80.  
  81.         // Переходим к следующей итерации, так
  82.         // что текущие значения неизвестных
  83.         // становятся значениями на предыдущей итерации
  84.         previousVariableValues = currentVariableValues;
  85.     }
  86.  
  87.     // Выводим найденные значения неизвестных с 8 знаками точности
  88.     for (int i = 0; i < size; i++)
  89.     {
  90.         //printf("%.8llf ", previousVariableValues[i]);
  91.         cout << previousVariableValues[i] << " ";
  92.     }
  93.  
  94.     return 0;
  95. }
  96.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement