您的位置:首页 > 其它

高斯消元

2018-04-11 09:31 134 查看




特别注意主元为零与不可逆矩阵情况

一号代码(曾老):

//高斯消元(SOJ- P514 解方程)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;

int n;
double mem[1001][1002];

void Init()   //读入数据
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++)
cin>>mem[i][j];
}

void Kernel()
{
int i,j,k,l,p;
double tmp;
p=0; i=1;
while(i+p<=n)
{
j=i;
while(j<=n && mem[j][i+p]==0) j++;
if(j>n)
{
p++;
break;
}

for(k=j+1;k<=n;k++)     //消元
{
tmp=mem[k][i+p]/mem[j][i+p];
mem[k][i+p]=0;
for(l=i+p+1;l<=n+1;l++)
mem[k][l]=mem[k][l]-mem[j][l]*tmp;
}

***if(i!=j)//主元为零情况处理
for(k=1;k<=n+1;k++)
{
tmp=mem[i][k];
mem[i][k]=mem[j][k];
mem[j][k]=tmp;***
}
i++;
}

for(i=n;i>=1;i--) //回代过程
{
mem[i][n+1]=mem[i][n+1]/mem[i][i];
mem[i][i]=1;
for(j=i-1;j>=1;j--)
{
tmp=mem[j][i]/mem[i][i];
mem[j][n+1]=mem[j][n+1]-mem[i][n+1]*tmp;
mem[j][i]=0;
}
}
}

void Print() //输出
{
for(int i=1;i<=n-1;i++)
cout<<floor(mem[i][n+1]+0.5)<<" "; //四舍五入输出
cout<<floor(mem
[n+1]+0.5);
}

int main()
{
freopen("gs.in","r",stdin);
//freopen("gs.out","w",stdout);
Init();
Kernel();
Print();
return 0;
}


二号代码(刘书含):

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;

double a[102][102];//必须用double否则误差非常大
double ans[102];
int n;
int main()
{
//freopen("gs.in","r",stdin);
//freopen("gs.out","w",stdout);

scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++)
scanf("%lf",&a[i][j]);

for(int j=1;j<=n;j++)
{
if(a[j][j]==0)//处理前导零情况
{
for(int i=j+1;i<=n;i++)
{
if(a[i][j]!=0)
{
for(int k=j;k<=n+1;k++)//主元为零,与下行不为零交换
swap(a[i][k],a[j][k]);
break;
}
}
}
for(int i=j+1;i<=n;i++)//消元
{
double x=a[i][j]/a[j][j];
for(int k=j;k<=n+1;k++)
a[i][k]=a[i][k]-a[j][k]*x;
}
}
//回代
for(int i=n;i>=1;i--)
{
ans[i]=a[i][n+1]/a[i][i];
for(int k=1;k<=i-1;k++)
a[k][n+1]=a[k][n+1]-a[k][i]*ans[i];//消元
}

for(int i=1;i<=n;i++)
printf("%d ",(int)(ans[i]+0.5));//四舍五入取整

return 0;
}


三号代码(樊思劼):此代码只能解唯一解情况,消元矩阵

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<cctype>
#include<iomanip>
using namespace std;
double matrix[120][120],eps=0.0000001;
int n,m;
void gauss()
{
for(int i=1;i<=n;i++)
{
int maxl;double temp;
maxl=i;
for(int j=i+1;j<=m;j++)//先把最大的数移到最上面,以免在消元时出现主元为零情况
if(fabs(matrix[maxl][i])<fabs(matrix[j][i]))
maxl=j;
if(maxl!=i)
for(int j=i;j<=m;j++)
swap(matrix[maxl][j],matrix[i][j]);

temp=matrix[i][i];//消元+回代
for(int j=i+1;j<=m;j++)
matrix[i][j]=matrix[i][j]/temp;
for(int j=1;j<=n;j++)
if(j!=i)
{
temp=matrix[j][i];
for(int k=i;k<=m;k++)
matrix[j][k]=matrix[j][k]-matrix[i][k]*temp;
}
}
return ;
}
int main()
{
//freopen("gs.in","r",stdin);
scanf("%d",&n);
m=n+1;//列
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%lf",&matrix[i][j]);
gauss();
for(int i=1;i<=n;i++)
{
if(matrix[i][m]<eps)
printf("0 ");
else
printf("%.0lf ",matrix[i][m]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息