高斯消元,解线性方程组



讲 高斯消元, 必然会讲到线性代数问题,  解决线性方程组,多元问题, 转化为矩阵求解


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


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)
            {
                 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
*/



posted @ 2017-04-20 23:25  Sizaif  阅读(247)  评论(0编辑  收藏  举报