首页 > 代码库 > 论高斯消元实现

论高斯消元实现

高斯消元的实现是用到了增广矩阵变成上三角矩阵,然后从下往上迭代求值。


具体是这样的,


比如说有一个二元一次方程组


那么,把未知数的系数提出来弄成一个2*2的矩阵,然后再把方程组中等号右边的常数项加进来,成为一个2*3的矩阵


这就是一个增广矩阵了,


接下来变成一个上三角矩阵,


从矩阵的第一行开始,一直到最后一行,

比方说现在面临的是第i行,

那么在i到最后一行,找到第i列数的绝对值最大的那行跟第i行换一个位置,这样交换是有好处的,就是当面对0的情况,哈哈,想一想

然后就用第i行开始把从i+1到最后一行的所有行进行消元操作,消元的目的是把i行之后的所有行的第i列变成0

最后,变成的就是一个上三角矩阵了


从下往上迭代求值即可


如果不懂如何迭代求值,打个草稿看看就好了


我的代码:

#include<iostream>
#include<map>
#include<string>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
double gauss(double a[10][10],int n)
{
	int i,j,k,t;
	for(i=0;i<n;i++)
	{
		t=i;
		for(j=i+1;j<n;j++)
			if(fabs(a[j][i])>fabs(a[t][i]))
				t=j;
		if(t!=i)
			for(j=0;j<=n;j++)
				swap(a[i][j],a[t][j]);
		if(a[i][i]!=0)
			for(j=i+1;j<n;j++)
				for(k=n;k>=i;k--)
					a[j][k]-=a[j][i]/a[i][i]*a[i][k];
	}
	for(i=n-1;i>-1;i--)
	{
		for(j=i+1;j<n;j++)
			a[i][n]-=a[j][n]*a[i][j];
		a[i][n]/=a[i][i];
	}
}
int main()
{
	double a[10][10];
	int i,j,n;
	while(cin>>n)
	{
		for(i=0;i<n;i++)
			for(j=0;j<=n;j++)
				cin>>a[i][j];
		gauss(a,n);
		for(i=0;i<n;i++)
			cout<<a[i][n]<<" ";
		cout<<endl;
	}
}


论高斯消元实现