// Gauss.cpp: 定义控制台应用程序的入口点。
//
/*
实验名称:列主元高斯消去
实验时间:2018/4/10
实现语言:c++
实验环境:VS 2017
*/
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
//输出系数矩阵、右侧矩阵
void displayZengGuang(vector<vector<float>> A)
{
cout << endl;
for (int i = 0; i < A.size(); i++)
{
for (int j = 0; j < A[i].size(); j++)
{
cout << A.at(i).at(j) << " ";
}
cout << endl;
}
cout << endl;
}
//高斯消元算法
void gauss(vector<vector<float>> A, vector <float> b,int n)
{
//形成增广矩阵
for (int i = 0; i < A.size(); i++)
{
A[i].push_back(b[i]);
}
//高斯消元
float L_ik;
for (int k = 0; k < n - 1; k++)
{
if (A[k][k] != 0)//保证主元不为零
{
for (int i = k + 1; i < n ; i++)
{
L_ik = (float)A[i][k] / A[k][k];//计算系数
for (int j = k ; j < n+1 ; j++)
{
A[i][j] = A[i][j] - L_ik * (float)A[k][j];//对下一行的每个元素减去相应
}
}
}
else
{
cout << "存在主元为零的情况,高斯消元不能继续!" << endl;
break;
}
}
cout << endl << "消元完成的增广矩阵如下:" << endl;
displayZengGuang(A);
//回代求解
vector<float> result;
result.resize(n);
result[n - 1] = A[n - 1][n] / (float)A[n - 1][n - 1];//先计算最后
for (int i = n - 2; i >= 0; i--)
{
float sum = 0;
for (int j = i + 1; j < n; j++)//求和
{
sum += A[i][j] * result[j];
}
result[i] = (A[i][n] - sum) / A[i][i];
}
cout << endl << "回代求解结果如下:" << endl;
for (int i = 0; i < n; i++)
{
cout << result[i] << " ";
}
cout << endl << endl;
}
//输出系数矩阵、右侧矩阵
void display(vector<vector<float>> A, vector <float> b)
{
cout << endl << "系数矩阵如下:" << endl;
for (int i = 0; i < A.size(); i++)
{
for (int j = 0; j < A.size(); j++)
{
cout << A.at(i).at(j) << " ";
}
cout << endl;
}
cout << endl << "右侧矩阵如下:" << endl;
for (int i = 0; i < b.size(); i++)
{
cout << b[i] << " ";
}
cout << endl;
}
//主函数
int main()
{
//读取文件,获取矩阵信息,n等
ifstream infile;
int n;//矩阵的阶数
vector<vector<float>> A;//左侧系数矩阵
infile.open("data.txt");
bool flag = true;
while (!infile.eof())
{
if (flag)
{
infile >> n;
flag = false;
}
vector<float> vector_temp;
int temp;
for (int i = 0; i < n; i++)
{
infile >> temp;
vector_temp.push_back(temp);
}
A.push_back(vector_temp);
}
infile.close();
//右侧一维矩阵
vector <float> b;
b.resize(n);
//右侧矩阵赋值
for (int i = 0; i < n; i++)
{
b[i] = A.at(n).at(i);
}
A.pop_back();
//矩阵显示
display(A, b);
//高斯消元
gauss(A, b, n);
system("pause");
return 0;
}