Рішення матриці методом простих ітерацій та Зейделя, С++

23 марта, 13:58 Учеба 4352 0

Я написала код для вирішення цього завдання, проте ці методи не працюють, і я не можу зрозуміти, що не так

#include <bits/stdc++.h>

#include <vector>

#define N 4

using namespace std;

 

 

double eps = 0.001;

static const int n = 4;

 

double A[n][n] = { { 8.30, 2.62, 4.10, 1.90 },

               { 3.92, 8.45, 8.78, 2.46 },

               { 3.77, 7.21, 8.04, 2.28 },

               { 2.21, 3.65, 1.69, 6.99 } };

               

double b[n] = {-10.65, 12.21, 15.45, -8.35};

 

bool isDDM(double A[n][n], int n)

{

   // для кожного рядка

   for (int i = 0; i < n; i++)

  {      

 

       // для кожного стовпчика, шукаючи суму кожного рядка

       int sum = 0;

       for (int j = 0; j < n; j++)            

           sum += abs(A[i][j]);      

 

       // видалення діагонального елементу

       sum -= abs(A[i][i]);

 

       // перевірка чи діагональний елемент менший

       // за суму недіагоналих

       if (abs(A[i][i]) < sum)

           return false;

       

   }

 

   return true;

}

 

void diagonalMatrix() {

   std::cout << "Початкова матриця A:" << std::endl;

   for (int i = 0; i < n; i++) {

       for (int j = 0; j < n; j++) {

           std::cout << A[i][j] << " ";

       }

       std::cout << std::endl;

   }

   

   for (int k = 0; k < n; k++) {

       for (int i = k + 1; i < n; i++) {

           double mu = A[i][k] / A[k][k];

           for (int j = 0; j < n; j++) {

               A[i][j] -= A[k][j] * mu;

           }

           b[i] -= b[k] * mu;

       }

   }

   

   std::cout << "Перетворена матриця A:" << std::endl;

   for (int i = 0; i < n; i++) {

       for (int j = 0; j < n; j++) {

           std::cout << A[i][j] << " ";

       }

       std::cout << std::endl;

   }

}

 

void simpleIteration() {

   

   double x[n];      

   double x0[n];      

   double E[n];      

   double max = 0;

 

   for (int i = 0; i < n; i++)  

       x0[i] = b[i];

   int counter = 0;            

   do

   {

       for (int i = 0; i < n; i++)  

       {

           x[i] = 0;                

           for (int j = 0; j < n; j++)

           {

               x[i] += A[i][j] * x0[j];    

           }

           x[i] += b[i];

           E[i] = fabs(x[i] - x0[i]);

       }

       max = 0;

       int i;

       for (i = 0; i < n; i++)

       {

           if (max < E[i]) max = E[i];

           x0[i] = x[i];

       }

       counter++;

   } while (max > eps);

   cout << endl << "Кількість ітерацій: " << counter << endl << endl;

   cout << "x = { ";

   for (int i = 0; i < n; i++) {

       cout << x[i];

       if (i != n-1) cout << ", ";

   }

   cout << " }" << endl;

   

   cout << "Вектор нев'язки r = { ";

   for (int i = 0; i < n; i++) {

       cout << E[i];

       if (i != n-1) cout << ", ";

   }

   cout << " }" << endl;

 

 

}

 

void zeydel() {

   

   double x[n];       // рішення n-ої ітерації

       double x0[n];      // рішення минулої ітерації

       double E[n];       // різниця між відповідними ел-ми

       double max = 0;    // для порівняння з eps

 

       for (int i = 0; i < n; i++)

      {

         x0[i] = b[i]; // для знаходження першого наближення

       }

 

       int counter = 0;   // змінна для підрахунку ітерацій

 

       do

       {

           for (int i = 0; i < n; i++)   // цикл для знаходження невідомих

           {

               x[i] = 0;                      

 

               for (int j = 0; j < n; j++)    

               {

                   x[i] += A[i][j] * x0[j];    

               }

               x[i] += b[i];    // додаємо згідно з формулою кожному x значення вільного члена

               E[i] = fabs(x[i] - x0[i]);  // різниця між знайденим та минулим значенням ітерації

               x0[i] = x[i];    // привласнення значення змінної x[0]

           }

 

           max = 0;

           for (int i = 0; i < n; i++)

           {

               if (max < E[i])  // порівняння max та різниці

                   max = E[i];         // прирівняння

           }

           counter++;

       } while (max > eps);

 

       cout << endl << "Кількість ітерацій: " << counter << endl << endl;

       cout << "x = { ";

       for (int i = 0; i < n; i++) {

           cout << x[i];

           if (i != n-1) cout << ", ";

       }

       cout << " }" << endl;

       

       cout << "Вектор нев'язки r = { ";

       for (int i = 0; i < n; i++) {

           cout << E[i];

           if (i != n-1) cout << ", ";

       }

       cout << " }" << endl;

 

}

 

int main()

{

   (isDDM(A, n)) ? (cout << "Ця матриця є еквівалентною із діагональною перевагою" << endl) : (cout <<"Ця матриця не є еквівалентною із діагональною перевагою" << endl);

   diagonalMatrix();

   simpleIteration();

   zeydel();

   return 0;

}

0 комментариев
Сортировка:
Добавить комментарий

IT Новости

Смотреть все