Advertisement
Falexom

Untitled

May 19th, 2022
524
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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.                 // При j < i можем использовать уже посчитанные
  58.                 // на этой итерации значения неизвестных
  59.                 if (j < i)
  60.                 {
  61.                     currentVariableValues[i] -= matrix[i][j] * currentVariableValues[j];
  62.                 }
  63.  
  64.                 // При j > i используем значения с прошлой итерации
  65.                 if (j > i)
  66.                 {
  67.                     currentVariableValues[i] -= matrix[i][j] * previousVariableValues[j];
  68.                 }
  69.             }
  70.  
  71.             // Делим на коэффициент при i-ой неизвестной
  72.             currentVariableValues[i] /= matrix[i][i];
  73.         }
  74.  
  75.         // Посчитаем текущую погрешность относительно предыдущей итерации
  76.         long double error = 0.0;
  77.        
  78.         for (int i = 0; i < size; i++)
  79.         {
  80.             error += abs (currentVariableValues[i] - previousVariableValues[i]);
  81.         }
  82.  
  83.         // Если необходимая точность достигнута, то завершаем процесс
  84.         if (error < eps)
  85.         {
  86.             break;
  87.         }
  88.  
  89.         // Переходим к следующей итерации, так
  90.         // что текущие значения неизвестных
  91.         // становятся значениями на предыдущей итерации
  92.         previousVariableValues = currentVariableValues;
  93.     }
  94.  
  95.     // Выводим найденные значения неизвестных с 8 знаками точности
  96.     for (int i = 0; i < size; i++)
  97.     {
  98.         printf ("%.8llf ", previousVariableValues[i]);
  99.     }
  100.  
  101.     return 0;  
  102. }
Advertisement
RAW Paste Data Copied
Advertisement