c++高斯列主元素消去法求解线性方程组
高斯列主元素消去法原理
设有线性方程组
A
x
=
b
Ax=b
Ax=b
根据线性代数的知识,当
d
e
t
A
!
=
0
det A!=0
detA!=0时,上述方程组的解存在且唯一,对增广矩阵
(
A
,
b
)
(A,b)
(A,b)施行初等变换,化
A
A
A为上三角矩阵,在初等变换过程中位于矩阵对角线上的元素称为主元素,为了避免较小数作为除数产生误差,每步消去时都将主元素所在列最大元所在行换到主元素所在行,然后再进行消元计算,此种方法称为高斯列主元素消去法。
程序代码
#include<iostream>
using namespace std;
//高斯消去法求解矩阵
int main()
{
int n,i,j,k,p,ii,jj,kk=1,iq,jq;
cout<<"请输入系数矩阵的阶数n=";
cin>>n;
cout<<"请输入增广矩阵元素(A,b)=\n";
float a[n][n+1],h,x[n],m,maxa=0,b;
for(i=1;i<=n;i++)//增广矩阵输入
{
x[i]=0;
for(j=1;j<=n+1;j++)
{
cin>>a[i][j];
}
cout<<'\n';
}
for(i=1;i<n;i++)//高斯消去
{
//排序
maxa=a[i][i];
p=i;
kk++;
for(ii=kk;ii<=n;ii++)
{
if((a[ii][kk-1]>0?a[ii][kk-1]:-a[ii][kk-1])>maxa)
{
maxa=(a[ii][kk-1]>0?a[ii][kk-1]:-a[ii][kk-1]);
p=ii;
}
}
for(jj=1;jj<=n+1;jj++)
{
b=a[p][jj];
a[p][jj]=a[i][jj];
a[i][jj]=b;
}
cout<<"列主元素="<<endl;
for(iq=1;iq<=n;iq++)
{
for(jq=1;jq<=n+1;jq++)
{
cout<<a[iq][jq]<<' ';
}
cout<<'\n'<<endl;
}
//排序
for(j=i+1;j<=n;j++)
{
if(a[i][i]==0)
{
cout<<"无穷多解";
}
h=a[j][i]/a[i][i];
for(k=1;k<=n+1;k++)
{
a[j][k]=a[j][k]-h*a[i][k];
}
}
cout<<"高斯消去="<<endl;
for(iq=1;iq<=n;iq++)
{
for(jq=1;jq<=n+1;jq++)
{
cout<<a[iq][jq]<<' ';
}
cout<<'\n'<<endl;
}
}
cout<<"高斯消去法得到的(A,b)="<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n+1;j++)
{
cout<<a[i][j]<<' ';
}
cout<<'\n'<<endl;
}
x[n]=a[n][n+1]/a[n][n];
for(i=n-1;i>0;i--)
{
m=0;
for(j=n;j>i;j--)
{
m=m+a[i][j]*x[j];
}
x[i]=(a[i][n+1]-m)/a[i][i];
}
cout<<"解x=";
for(i=1;i<=n;i++)
{
cout<<x[i]<<' ';
}
return 0;
}