您的位置:首页 > 其它

高斯消元,解线性方程组

2017-04-20 23:24 405 查看
讲 高斯消元, 必然会讲到线性代数问题,  解决线性方程组,多元问题, 转化为矩阵求解

我们拿这个为例子    可以写出 增广矩阵

2x + y - z = 8 (L1)

-3x - y + 2z = -11 (L2)

-2x + y + 2z = -3 (L3)



代码的思路也是如此

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stdio.h>

const int MAXN=1000;
const double inf=0;

using namespace std;

double a[MAXN][MAXN];
double b[MAXN],c[MAXN];
int col,row;//col 行 row 列
void input()
{
for(int i=1;i<=col;i++)
{
for(int j=1;j<=row;j++)
cin>>a[i][j];//方程系数
cin>>b[i];//常数项
}
}
void change(int x,int y) //更换行
{
for(int i=1;i<=row;i++)//当前行的 每一项
{
swap(a[x][i],a[y][i]);
}
swap(b[x],b[y]);
}
int gauss()
{

bool flag,fflag=false;;//fflaga  判断 是否多解问题
for(int i=1;i<=row;i++)//每一列
{
flag=false;
for(int j=i;j<=col;j++)// 每一行开始检索不为0 的项
{
if(fabs(a[j][i])>0)
{
change(i,j);
flag=true;
break;
}
}
if(!flag)
{
fflag=true; //说明秩 小于n  方程多解
continue;
}
for(int j=i+1;j<=col;j++)// 当前i的下一行
{
double temp=a[j][i]/a[i][i];// 两行之间的比例关系
for(int k=1;k<=row;k++)//每一项都要操作
{
a[j][k]-=temp*a[i][k];
}
b[j]-=temp*b[i];
}
}
if(fflag)
return 0;//多解问题
for(int i=1;i<=col;i++)//判断 是否为0  无解问题
{
flag=false;
for(int j=1;j<=row;j++)
{
if(fabs(a[i][j])>0)
{

4000
flag=true;
break;
}
}
if(!flag&&fabs(b[i])>inf)//无解
return -1;
}
for(int i=row;i>=1;i--)
{
for(int j=i+1;j<=row;j++)//巧妙  倒着 将结果带进去
{
b[i]-=a[i][j]*c[j];
a[i][j]=0;
}
c[i]=b[i]/a[i][i];//存结果
}
return 1;

}
int main()
{
while(cin>>col>>row)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
input();
int flag=gauss();
switch(flag)
{
case -1:printf("方程无解\n");break;
case 0: printf("方程多解\n");break;
case 1:for(int i=1;i<=row;i++)
printf("%d ",(int)(c[i]));
puts("");break;
}

}

return 0;
}
/*
3 3
2 1 -1 8
-3 -1 2 -11
-2 1 2 -3
*/


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: