Advertisement
Guest User

Untitled

a guest
Sep 20th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.12 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. double eps = 0.0001;   // точность
  7. int iter = 0;          // количество итераций
  8.  
  9. void Out(double** a, double* y, int n) {   //Функция вывода матрицы
  10.     for (int i = 0; i < n; i++) {
  11.         for (int j = 0; j < n; j++) {
  12.             cout << a[i][j] << " ";
  13.         }
  14.         cout << y[i] << endl;
  15.     }
  16.     system("PAUSE");
  17. }
  18.  
  19. void Relax(int n, double** a, double* y)       // Метод релаксации
  20. {
  21.     double max;                     //максимальная невязка
  22.     int max_index=-1;                 // ее индекс
  23.     int ret = 0;                     //костыль
  24.  
  25.     double* R;                       //вектор невязок
  26.     double* x;                       // вектор приращений
  27.     double* Sx;                      // вектор значений Х
  28.  
  29.     R = new double[n];     //Столбец невязок
  30.     x = new double[n];         // Создание столбца приращений     
  31.     Sx = new double[n];    //Создание столбца значений
  32.  
  33.     for (int i = 0; i < n; i++) {
  34.         x[i] = 0;                    //начальное приближение 0
  35.         R[i] = 0;
  36.         Sx[i] = 0;
  37.     }
  38.  
  39.     for (int i = 0; i < n; i++) {          //Модификация матрицы для итерационного метода
  40.         for (int j = 0; j < n; j++) {
  41.             if (i != j)a[i][j] =-1* a[i][j] / a[i][i];
  42.         }
  43.         y[i] = y[i]/a[i][i];    
  44.         a[i][i] = -1;
  45.     }
  46.    
  47.     for (;;) {               // нахождение   невязок
  48.         for (int i = 0; i < n; i++) {
  49.             for (int j = 0; j < n; j++) {
  50.                 if(i!=max_index)R[i] += a[i][j] * Sx[j];
  51.             }
  52.             if (i != max_index)R[i] += y[i];
  53.         }
  54.         max_index = 0;
  55.         max = R[0];
  56.         iter++;
  57.  
  58.         for (int i = 0; i < n; i++) {        // нахождение максимальной невязки
  59.             if (abs(max) < abs(R[i])) {
  60.                 max = R[i];
  61.                 max_index = i;
  62.             }
  63.         }
  64.         x[max_index] = R[max_index];
  65.         Sx[max_index] += x[max_index];      //к финальному значению x-итой добавляем максимальную невязку на данной итерации
  66.  
  67.         cout << "++++++++++++++" << endl;
  68.         for (int i = 0; i < n; i++) {
  69.             cout << Sx[i] << " x=" << x[i] << " R=" << R[i] << endl;    //Sx – сумма приращений, x – приращение, R – невязки
  70.         }
  71.         cout << "------------------";
  72.  
  73.         for (int i = 0; i < n; i++) {          //условие выхода
  74.             if (abs(R[i]) < eps)ret++;
  75.         }
  76.        
  77.         if (ret == n)return;
  78.         ret = 0;
  79.  
  80.         for (int i = 0; i < n; i++) {
  81.             R[i] = 0;
  82.         }
  83.     }
  84. }
  85.  
  86. int main()
  87. {
  88.     double**a, *y;
  89.  
  90.     int n;
  91.  
  92.     n = 3;
  93.  
  94.     a = new double*[n];
  95.     y = new double[n];
  96.  
  97.      for (int i = 0; i < n; i++) {
  98.         a[i] = new double[n];
  99.     }
  100.  
  101.     a[0][0] = 1,17;
  102.     a[0][1] = -0,65;
  103.     a[0][2] = 1,54;
  104.     a[1][0] = -0,65;
  105.     a[1][1] = 1,16;
  106.     a[1][2] = -1,33;
  107.     a[2][0] = 1,54;
  108.     a[2][1] = -1,33;
  109.     a[2][2] = 2,15;
  110.  
  111.     y[0] = -1,43;
  112.     y[1] = 0,68;
  113.     y[2] = 1,87;
  114.  
  115.     Relax(n, a, y);
  116.     cout << "Количество итераций: " << iter << endl;
  117.  
  118.     system("PAUSE");
  119.  
  120.     return 0;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement