
ИТиУвТС / лабораторная 2
.docБелорусский Государственный Университет Информатики и Радиоэлектроники
Кафедра вычислительных методов и программирования
Лабораторная работа №2
Тема: «Решение слау»
Выполнил студент
Группы 922403
Олешкевич Андрей
Принял
Смирнов В.Л.
Минск 2009
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
void MatrixSwap(double **A, double *b, int r1, int r2, int n)
{
double temp1 = 0.0;
double temp2 = 0.0;
for(int i = 0; i < n; i++)
{
temp1 = A[r1][i];
A[r1][i] = A[r2][i];
A[r2][i] = temp1;
}
temp2 = b[r1];
b[r1] = b[r2];
b[r2] = temp2;
}
bool DiagonalPre(double **A, double *b, int n, char ck)
{
double temp = 0.0;
double sum1 = 0.0; // Сумма элементов текущей строки
if(ck == 'n' || ck == 'N')
{
for(int i = 0; i < n; i++)
{
sum1 = 0.0;
for(int j = 0; j < n; j++)
if(j!=i)
sum1 += fabs(A[i][j]);
if(fabs(A[i][i]) < sum1)
{
double sum2 = 0.0;
for(int j = 0; j < n; j++) // идем по всем строкам
{
sum2 = 0.0;
if(j==i)
continue;
for(int k = 0; k < n; k++)
if(k!=i)
sum2 += fabs(A[j][k]);
if(fabs(A[j][i]) > sum2)
{
MatrixSwap(A, b, i, j, n);
break;
}
if(j == n-2)
{
cout <<"Извините, диагональное преобладание не найдено!!!" << endl;
return false;
}
}
}
}
}
return true;
}
int main()
{
setlocale(0, "rus");
int n = 0;
double **ms; // Матрица коофициентов
double *b; // Вектор свободных членов
double e; // Конечное значение
int it = 0; // Количество итераций
double de; // Счетчик текущих погрешностей
double *x;
int w = 1;
char check = 'n';
cout <<"Введите количество уравнений: ";
cin >> n;
ms = new double*[n];
for(int i = 0; i < n; i++)
ms[i] = new double [n];
b = new double[n];
x = new double[n];
cout <<"Введите матрицу коофициентов... "<< endl;
for(int i = 0; i < n; i++)
{
cout <<"+-Ввод коофициентов в уравнении №" << i+1 << endl;
for(int j = 0; j < n; j++)
{
cout <<"|"<< endl;
cout <<"+---a"<<j+1<<": ";
cin >> ms[i][j];
}
cout << endl;
}
cout <<"Введите матрицу свободных членов... "<< endl;
for(int i = 0; i < n; i++)
{
cout <<"b"<<i+1<<" = ";
cin >> b[i];
}
cout << endl;
cout <<"Введите конечную погрешность..."<< endl;
cin >> e;
cout <<"Желаете отключить проверку диагонального преобладания? (y/n): ";
cin >> check;
DiagonalPre(ms, b, n, check);
do{
de = 0.0;
for(int i = 0; i < n; i++)
{
double s = b[i];
for(int j = 0; j < n; j++)
{
if(j == i)
continue;
s -= ms[i][j]*x[j];
}
s /= ms[i][i];
s = w*s + (1 - w)*x[i];
double d = fabs(x[i]-s);
x[i] = s;
if(d > de)
de = d;
}
it++;
cout << "Итерация " << it <<"..." << endl;
cout <<"x = (";
for(int i = 0; i < n; i++)
{
cout <<x[i]<<" ";
}
cout <<")" << endl;
cout <<"de = " << de << endl;
}while(de > e);
// Освобождение ресурсов
delete b;
delete x;
for (int i = 0; i < n; i++)
delete[]ms[i];
delete[]ms;
return 0;
}