【计算方法】列主元高斯消去



// 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值