Advertisement
SomeBody_Aplle

Untitled

Jan 12th, 2022
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.00 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3.  
  4. using namespace std;
  5.  
  6. // Условие окончания
  7. bool converge(double xk[10], double xkp[10], int n, double eps)
  8. {
  9.     double norm = 0;
  10.     for (int i = 0; i < n; i++)
  11.         norm += (xk[i] - xkp[i]) * (xk[i] - xkp[i]);
  12.     return (sqrt(norm) < eps);
  13. }
  14.  
  15. double okr(double x, double eps)
  16. {
  17.     int i = 0;
  18.     double neweps = eps;
  19.     while (neweps < 1)
  20.     {
  21.         i++;
  22.         neweps *= 10;
  23.     }
  24.     int okr = pow(double(10), i);
  25.     x = int(x * okr + 0.5) / double(okr);
  26.  
  27.     return x;
  28. }
  29.  
  30. bool diagonal(double a[10][10], int n)
  31. {
  32.     int i, j, k = 1;
  33.     double sum;
  34.     for (i = 0; i < n; i++) {
  35.         sum = 0;
  36.         for (j = 0; j < n; j++) sum += abs(a[i][j]);
  37.         sum -= abs(a[i][i]);
  38.         if (sum > a[i][i])
  39.         {
  40.             k = 0;
  41.             cout << a[i][i] << " < " << sum << endl;
  42.         }
  43.         else
  44.         {
  45.             cout << a[i][i] << " > " << sum << endl;
  46.         }
  47.  
  48.  
  49.     }
  50.  
  51.     return (k == 1);
  52.  
  53. }
  54.  
  55.  
  56.  
  57.  
  58. int main()
  59. {
  60.     setlocale(LC_ALL, "");
  61.  
  62.     double eps = 0.1, a[10][10], b[10], x[10], p[10];
  63.     int n, i, j, m = 0;
  64.     int method;
  65.     cout << "Введите размер квадратной матрицы: ";
  66.     cin >> n;
  67.     cout << "Заполните матрицу А: " << endl << endl;
  68.     for (i = 0; i < n; i++)
  69.         for (j = 0; j < n; j++)
  70.         {
  71.             cout << "A[" << i << "][" << j << "] = ";
  72.             cin >> a[i][j];
  73.         }
  74.     cout << endl << endl;
  75.     cout << "Ваша матрица А: " << endl << endl;
  76.     for (i = 0; i < n; i++)
  77.     {
  78.         for (j = 0; j < n; j++)
  79.             cout << a[i][j] << " ";
  80.         cout << endl;
  81.     }
  82.  
  83.     cout << endl;
  84.  
  85.     cout << "Заполните столбец свободных членов: " << endl << endl;
  86.     for (i = 0; i < n; i++)
  87.     {
  88.         cout << "В[" << i + 1 << "] = ";
  89.         cin >> b[i];
  90.     }
  91.  
  92.     cout << endl << endl;
  93.  
  94.  
  95.     /*
  96.     Ход метода, где:
  97.     a[n][n] - Матрица коэффициентов
  98.     x[n], p[n] - Текущее и предыдущее решения
  99.     b[n] - Столбец правых частей
  100.     Все перечисленные массивы вещественные и
  101.     должны быть определены в основной программе,
  102.     также в массив x[n] следует поместить начальное
  103.     приближение столбца решений (например, все нули)
  104.     */
  105.  
  106.     for (int i = 0; i < n; i++)
  107.         x[i] = 1;
  108.  
  109.     cout << "Диагональное преобладание: " << endl;
  110.     if (diagonal(a, n)) {
  111.         do
  112.         {
  113.             for (int i = 0; i < n; i++)
  114.                 p[i] = x[i];
  115.             for (int i = 0; i < n; i++)
  116.             {
  117.                 double var = 0;
  118.                 for (int j = 0; j < n; j++)
  119.                     if (j != i) var += (a[i][j] * x[j]);
  120.  
  121.                 x[i] = (b[i] - var) / a[i][i];
  122.             }
  123.             m++;
  124.         } while (!converge(x, p, n, eps));
  125.  
  126.  
  127.  
  128.         cout << "Решение системы:" << endl << endl;
  129.         for (i = 0; i < n; i++) cout << "x" << i << " = " << okr(x[i], eps) << "" << endl;
  130.         cout << "Итераций: " << m << endl;
  131.     }
  132.     else {
  133.         cout << "Не выполняется преобладание диагоналей" << endl;
  134.     }
  135.  
  136.     system("pause");
  137.     return 0;
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement