Dev C++ Решение линейных систем уравнений методом Гаусса
Здесь реализован алгоритм без всяких перестановок что бы было понятней
Также выводятся все этапы расчета до приведения к верхнетреугольному виду прямое ход
Обратный ход более прост не расписывается
исходник Здесь
=
=
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char** argv) {
setlocale (LC_ALL, "Russian");
int i, j, n, m; //solution of systems of linear algebraic equations by the Gauss method
char d;//для меню
float **matrix ;//объявляем двойной указатель на матрицу
cout << "Решение систем линейных алгебраических уравнений методом Гаусса ";
cout << endl;
kt :
// cout << "1- manual input ";
cout << "1- ручной ввод ";
cout << endl;
cout << "2- ввод из файла ";
cout << endl;
cout << "3- выход ";
cout << endl;
cout << "введите: ";
cin >> d;
cout << endl;
if(d > '3'||d < '1' )
{
cout << "правильно выберите пункт меню и введите число ";
cout << endl;
goto kt;//переход на метку kt: если не выбран один из предложанных пунктов
}
if(d == '3'){return 0;}
if(d == '2'){//ввод матрици из файла
ifstream fin;//объявляем перемен для работы с потоком
fin.open("input.txt");//открываем поток и связываем его с файлом
if (!fin) //поток не открылся ошибка
{
cout << "Файл не существует или поврежден";
cout << endl;
goto kt;//файл поврежден или не найден переход к меню выбери ручной ввод данных
}
fin >> n;//читаем из потока связонного с файлом первую строку n-количество строк в мвтрице матрица должна быть квадратной 3Х3; 4Х4; 5Х5
m = n+1;//m-количество столбцов; матрица расширенная последний столбец - свободные члены
//создаем массив
matrix = new float *[n];//выделяем память кол строк
for (i = 0; i<n; i++) { matrix[i] = new float[m]; }//выдиляем память кол столбцов
//инициализируем
for (int i = 0; i < n; i++)//сначала переключаем строки
{
for (int j = 0; j < m; j++)//потом выбираем столбец
fin >> matrix[i][j];//пишим в матрицу данные из файла
}
fin.close();//закрываем поток отключ от файла файл может использовать другая программа
}
if(d == '1'){//ручной ввод данных в матрицу
cout << "Количество уравнений: ";
cin >> n;//
cout << "Количество переменных: ";
cin >> m;//
m += 1;
//создаем массив
matrix = new float *[n];
for (i = 0; i<n; i++){ matrix[i] = new float[m]; }
//инициализируем
for (i = 0; i<n; i++)
for (j = 0; j<m; j++)
{
cout << " Элемент " << "[" << i + 1 << " , " << j + 1 << "]: ";
cin >> matrix[i][j];//заполняем матрицу коэффициентами и свободными членами
}
}
//выводим массив
cout << "расширенная матрица" << endl;//паказываем созданную матрицу "уравнений"
for (i = 0; i<n; i++)
{
for (j = 0; j<m; j++)
cout << matrix[i][j] << " ";
cout << endl;
}
cout << endl;
//Метод Гаусса
//Прямой ход, приведение к верхнетреугольному виду
float tmp;
int k;
float *xx = new float[m];
for (i = 0; i<n; i++)
{
tmp = matrix[i][i];
cout <<"tmp1 = matrix ["<<i<<","<<i<<"] =" << matrix[i][i] ; //[i][i];" <<tmp << " i= "<<i ;
//cout << endl;
for (j = n; j >= i; j--){
//cout <<"matrix ["<<i<<","<<j<<"] = " << matrix[i][j] ;
float vb=matrix[i][j] ;
cout << endl;
matrix[i][j] /= tmp;
cout <<"matrix ["<<i<<","<<j<<"]("<<vb<<")" <<" /= " <<"tmp1("<<tmp<<") == " <<matrix[i][j] ;
//cout << endl;
}
cout << endl;
cout << "матрица после деления на tmp1" << endl;//паказываем созданную матрицу "уравнений"
for (int i = 0; i<n; i++)
{
for (int j = 0; j<m; j++)
cout << matrix[i][j] << " ";
cout << endl;
}
cout << endl;
for (j = i + 1; j<n; j++)
{
cout << endl;
tmp = matrix[j][i];
cout <<"tmp2 = matrix ["<<j<<","<<i<<"] = " << matrix[j][i] ;
//cout << endl;
for (k = n; k >= i; k--){
//cout <<"matrix ["<<j<<","<<k<<"] = " << matrix[j][k] ;
float vb=matrix[j][k] ;
cout << endl;
matrix[j][k] -= tmp*matrix[i][k];
cout <<"matrix ["<<j<<","<<k<<"]("<<vb<<")"<<" -= tmp2" <<"("<<tmp<<")"<<" * "<<"matrix ["<<i<<","<<k <<"]("<<matrix[i][k]<<")"<< " == " <<matrix[j][k] ;
//cout << endl;
}
cout << endl;
}
cout << endl;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
cout << "матрица в верхнетреугольном виде" << endl;//матрица в верхнетреугольном виде
for (i = 0; i<n; i++)
{
for (j = 0; j<m; j++)
cout << matrix[i][j] << " ";
cout << endl;
}
cout << endl;
//////////////////////////////////////////////////////////////////////////////////////////////////////////
/*обратный ход*/
xx[n - 1] = matrix[n - 1][n];
for (i = n - 2; i >= 0; i--)
{
xx[i] = matrix[i][n];
for (j = i + 1; j<n; j++) xx[i] -= matrix[i][j] * xx[j];
}
//Выводим решения
cout << "решения системы уравнений"<< endl;
for (i = 0; i<n; i++)
cout << xx[i] << " ";
cout << endl;
delete[] matrix;
// system("pause");//зависимость от windows лучьше не использовать
cout << "нажмите Enter для выхода ";
cout << endl;
cin.get();//а это пауза
cin.get();
return 0;
}
=
=
|