bsuir.info
БГУИР: Дистанционное и заочное обучение
(файловый архив)
Вход (быстрый)
Регистрация
Категории каталога
Другое [157]
АВС [6]
КПиЯП [80]
ОАиП [305]
ОКТ [79]
СиСПО [8]
Форма входа
Поиск
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Файловый архив
Файлы » ПОИТ » ОАиП

Лаба №1-7. Лабораторные работы по ОАиП 2 семестр (численные методы) [Вариант 3]
Подробности о скачивании 23.09.2010, 18:47
Файл Slau.h

#ifndef _SLAU_H_
#define _SLAU_H_

#include <iostream>
#include <cmath>
using std::cout;
using std::endl;
using std::cin;
using std::fabs;

class SLAU
{
public:
SLAU(int val);
~SLAU();
bool ForwardStroke(); // Прямой ход метода Гаусса
bool BackStroke(); // Обратный ход метода Гаусса
void PrintResult(); // Вывод полученых корней
void PrintUtochRes(); // Печать уточнений
void Nevazka(); // Поиск невязок
bool Utochnenie(double nv); // Уточнение корней
private:
const int n; // Количество уравнений

double **ms; // Двумерный масив индексов
double **nev; // Копия двумерного массива
double *tmp; // Массив значений x1, x2, xn
double *tmp2; // Массив невязок
double *tmp3; // Массив корней, которые постепенно уточняются
double nevazka; // Общая невязка системы

// Закрытые функции
void InputValue(); // Ввод значений в матрицу
void PrintCurrent(); // Печатает текущие состояние матрицы
void Replace(int a, int b); // Меняет соответствующие строки
};

#endif /* _SLAU_H_ */

Файл Slau.cpp

#include "Slau.h"

SLAU::SLAU(int val): n(val)
{
ms = new double*[n];
nev = new double*[n];

for(int i = 0; i < n; i++)
{
ms[i] = new double [n+1];
nev[i] = new double [n+1];
}

tmp = new double[n];
tmp2 = new double[n];
tmp3 = new double[n];

InputValue();
}

SLAU::~SLAU()
{
for (int i = 0; i < n; i++)
{
delete[]ms[i];
delete[]nev[i];
}
delete[]ms;
delete[]nev;
delete tmp;
delete tmp2;
delete tmp3;
}

void SLAU::PrintCurrent()
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n+1; j++)
cout <<"\t" <<ms[i][j];
cout << endl;
}
}

void SLAU::InputValue()
{
for(int i = 0; i < n; i++)
{
cout <<"+-Ввод коофициентов в уравнении №" << i+1 << endl;
for(int j = 0; j < n+1; j++)
{
cout <<"|"<< endl;
cout <<"+---a"<<j+1<<": ";
cin >> ms[i][j];
nev[i][j] = ms[i][j];
}
cout << endl;
}
}

bool SLAU::ForwardStroke()
{
double temp;

for(int i = 0; i < n-1; i++)
{
int index = 0;
double max = fabs(ms[i][i]);

for(int b = i+1; b < n; b++)
{
if(fabs(ms[b][i]) > max)
{
max = fabs(ms[b][i]);
index = b;
}
}

if(index != 0)
Replace(index, i);

if(ms[i][i] == 0)
{
cout <<"Главный элемент равен нулю..." << endl;
return false;
}

for(int j = 0; j < n-1-i; j++)
{
temp = ms[j+i+1][i]/ms[i][i];
for(int h = 0; h < n+1; h++)
ms[j+i+1][h] -= ms[i][h]*temp;
}
}

return true;
}

bool SLAU::BackStroke()
{
if(ms[n-1][n-1] == 0)
{
cout <<"Главный элемент равен нулю..." << endl;
return false;
}

tmp[n-1] = ms[n-1][n]/ms[n-1][n-1];

for(int k = n-2; k >= 0; k--)
{
double s = 0;
for(int i = k+1; i < n; i++)
{
s+=ms[k][i]*tmp[i];
}

if(ms[n-1][n-1] == 0)
{
cout <<"Главный элемент равен нулю..." << endl;
return false;
}

tmp[k] = (ms[k][n]-s)/ms[k][k];
}

return true;
}

void SLAU::Replace(int a, int b)
{
double *tmp = new double [n+1];

for(int i = 0; i < n+1; i++)
{
tmp[i] = ms[a][i];
ms[a][i] = ms[b][i];
ms[b][i] = tmp[i];
}

delete tmp;
}

void SLAU::Nevazka()
{
for(int i = 0; i < n; i++)
{
double sum = 0.0;
double d = 0.0;

for(int j = 0; j < n; j++)
{
sum += ms[i][j] * tmp[j];
}

tmp2[i] = fabs(ms[i][n] - sum);

if(fabs(tmp2[i]) > nevazka)
nevazka = fabs(tmp2[i]);
}
}

void SLAU::PrintResult()
{
for(int i = 0; i < n; i++)
{
cout <<"x" << i+1 <<": " << tmp[i] <<" ";
}
cout << endl;

for(int i = 0; i < n; i++)
cout <<"Невязка для уравнения №"<< i+1 <<": " << tmp2[i] << endl;
cout <<"Общая невязка: " << nevazka << endl << endl;
}

bool SLAU::Utochnenie(double nv)
{
if(nevazka > nv)
{
for(int i = 0; i < n; i++)
tmp3[i] = tmp[i];

cout << endl << endl;
cout <<"######### Результаты уточнения СЛАУ #########"<< endl;
cout <<"#################################################"<< endl << endl;

for(int i = 0; i < n; i++)
{
for(int j = 0; j < n+1; j++)
ms[i][j] = nev[i][j];

ms[i][n] = tmp2[i];
}

ForwardStroke();
BackStroke();

for(int i = 0; i < n; i++)
tmp3[i] += tmp[i];

for(int i = 0; i < n; i++)
ms[i][n] = tmp3[i];

ForwardStroke();
BackStroke();

}else return false;

PrintUtochRes();

return true;
}

void SLAU::PrintUtochRes()
{
cout <<"Уточненые корни (соответственно)..." << endl;
for(int i = 0; i < n; i++)
{
cout <<"x" << i+1 <<": " << tmp3[i] <<" ";
}
cout << endl << endl;
}

Файл test.cpp

#include "Slau.h"

int main()
{
int v = 0;
double nevaz = 0.0;
setlocale(0, "rus");

cout <<"######### Решение СЛАУ методом Гауса #########"<< endl;
cout <<"##################################################"<< endl << endl;

cout <<"Введите количество уравнений: ";
cin >> v;

SLAU *slau = new SLAU(v);

if(slau->ForwardStroke())
if(slau->BackStroke())
{
slau->Nevazka();
cout <<"########## Результаты решения СЛАУ ##########"<< endl;
cout <<"#################################################"<< endl << endl;
slau->PrintResult();

while(slau->Utochnenie(nevaz));
}

delete slau;
system("pause");
return 0;
}

Министерство образования Республики Беларусь
Учреждение образования
«Белорусский государственный университет информатики и
радиоэлектроники»
Кафедра «Вычислительные методы и программирование»

Лабораторная работа №1
Тема: «Решение СЛАУ методом Гаусса»

Выполнил студент группы 922403
Олешкевич А.С.

Принял Смирнов В.Л.

Минск 2010 г.

Категория: ОАиП | Добавил: gosha
Просмотров: 2694 | Загрузок: 55
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]