Я написала код для вирішення цього завдання, проте ці методи не працюють, і я не можу зрозуміти, що не так
#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 комментариев
Добавить комментарий