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

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

Сообщение Гость » Чт мар 23, 2023 5:09 pm

Я написала код для решения этой задачи, однако эти методы не работают, и я не могу понять что не так
Код: Выделить всё
#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;
}
Гость
 

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

Сообщение STEMsolver » Вс апр 02, 2023 11:06 am

Решу задачу у себя на канале STEMsolver
STEMsolver
 
Сообщения: 4
Зарегистрирован: Сб апр 01, 2023 2:02 pm


Вернуться в Информатика - программирование



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron