数学上,高斯消元法(或译:高斯消去法),是线性代数中的一个算法,可用来为线性方程组求解,求出矩阵的秩,以及求出可逆方阵的逆矩阵。当用于一个矩阵时,高斯消元法会产生出一个“行梯阵式”。高斯消元法可以用在电脑中来解决数千条等式及未知数。不过,如果有过百万条等式时,这个算法会十分费时。一些极大的方程组通常会用迭代法来解决。亦有一些方法特地用来解决一些有特别排列的系数的方程组。
高斯消元法可用来找出下列方程组的解或其解的限制:
#include <stdio.h>
#include <math.h>
#include <iomanip>
using namespace std;
#define N 3
static double a[N][N]= {{2,6,3},{4,7,7},{-2,4,5}};
static double aa[N][N]= {{2,6,3},{4,7,7},{-2,4,5}};
static double b[N]= {3,1,-7};
static double bb[N]= {3,1,-7};
void print()
{
for(int i=0; i<N; i++)
{
for(int j=0; j<N; j++)
{
cout<<setw(15)<<left<<a[i][j];
}
cout<<b[i]<<endl;
}
}
bool check(double *x)
{
int flag=1;
for(int i=0;i<N;i++)
{
double temp=0;
for(int j=0;j<N;j++)
{
temp=temp+aa[i][j]*x[j];
}
if(temp!=bb[i])
{
cout<<"方程组解有误!第"<<i+1<<"方程验证不通过"<<endl;
cout<<"左边="<<showpoint<<temp<<" 右边="<<showpoint<<bb[i]<<endl;
flag=0;
//break;
}
}
return flag;
}
int main()
{
double x[N]= {0};
cout<<"高斯消去法仅仅可以对系数矩阵为满秩矩阵的方程组求解"<<endl;
print();
for(int i=0; i<N-1; i++) ///////////////对每一列找主元消去(最后一列除外)
{
double temp=a[i][i];
int p;
for(int j=i; j<N; j++) /////////找主元
{
if(fabs(a[j][i])>temp)
{
temp=fabs(a[j][i]);
//cout<<temp<<endl;
p=j;
}
}
//////////////////////////////交换行
for(int j=i; j<N; j++)
{
double tem;
tem=a[i][j];
a[i][j]=a[p][j];
a[p][j]=tem;
}
{
double tem;
tem=b[p];
b[p]=b[i];
b[i]=tem;
}
cout<<"找第"<<i+1<<"个主元后:"<<endl;
print();
/////////////////////////////////////////////
if(a[i][i]==0)
{
cout<<"初等变换后系数矩阵第"<<i<<"列全为0,方程组有无数个解"<<endl;
break;
}
else
{
for(int p=i+1; p<N; p++)
{
double rand;
rand=a[p][i]/a[i][i];
if(rand!=0)
{
cout<<"对第"<<i+1<<"个主元对第"<<p+1<<"行消去(消去系数="<<rand<<"):"<<endl;
for(int q=i; q<N; q++)
{
//cout<<"前a["<<p+1<<"]["<<q+1<<"]="<<a[p][q]<<endl;
//cout<<"a[i][q]*rand="<<a[i][q]*rand<<endl;
a[p][q]=a[p][q]-a[i][q]*rand;
//cout<<"后a["<<p+1<<"]["<<q+1<<"]="<<a[p][q]<<endl;
}
b[p]=b[p]-b[i]*rand;
print();
}
}
}
}
for(int i=N-1;i>=0;i--)
{
double temp=0;
for(int j=i;j<N;j++)
{
if(j>i)
temp=temp+a[i][j]*x[j];
}
x[i]=(b[i]-temp)/a[i][i];
}
cout<<"/////////////////////////////////////////////////"<<endl;
for(int i=0;i<N;i++)
{
cout<<"x"<<i+1<<"="<<x[i]<<setw(10)<<right;
}cout<<endl;
if(check(x))cout<<"验证成功"<<endl;
//cout << "Hello world!" << endl;
return 0;
}