Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ИТиУвТС / лабораторная 2

.doc
Скачиваний:
8
Добавлен:
01.04.2014
Размер:
35.33 Кб
Скачать

Белорусский Государственный Университет Информатики и Радиоэлектроники

Кафедра вычислительных методов и программирования

Лабораторная работа №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;

}