高斯消元解线性方程组

题链

tips:

  1.变换出上三角矩阵

  2.行变换是对整行进行操作

/*
高斯消元
枚举每一列c
    找到绝对值最大的那一行
    将该行换到最上面(当前最上面)
    将该行第一个数变成一
    将下面所有行的第c列消成零
倒着推出答案
*/
#include <iostream>
#include <algorithm>
#include <cmath>
#include<stdio.h>
using namespace std;

const int N = 110;
const double eps=1e-6;
int n;
double a[N][N];

int gauss(){
    int c,r;//c表示当前列,r表示行
    for(c=0, r=0; c<n; c++){
        int t=r;
        //找到当前列最大值所在的行号
        for(int i=r; i<n; i++){
            if(fabs(a[i][c]) > fabs(a[t][c]) )
                t=i;
        }
        //如果当前列所有数为零,直接看下一列
        if(fabs(a[t][c]) < eps ) continue;
        //将当前列最大值所在行换到当前最上面
        for(int i=c; i <= n; i++ ) swap(a[t][i],a[r][i]);
        //倒着除,使该行第一个数变为1
        for(int i=n; i >= c; i-- ) a[r][i] /= a[r][c];
        //将下面所有行的第c列消成零
        for(int i=r+1; i < n; i++ ){
            if(fabs(a[i][c]) > eps){
                for(int j=n; j >= c; j--){
                    a[i][j] -= a[r][j]*a[i][c];
                }
            }

        }
        r++;
    }
    //从线性方程组的角度讨论解的情况
    //r=n,则所有未知元Xi都在,具有唯一解
    //r<n,未知元个数小于n个,判断余下的方程左边是零,判断右边是否为非零常数,即出现0=c(非零),无解
    if( r< n){
        for(int i=r; i<n ;i++){
            if(fabs(a[i][n]>eps))
                return 2;//无解
        }
        return 1;//有无穷多组解
    }
    //主元系数为1,答案存在a[i][n]中
    for(int i=n-1; i >= 0; i--){
        for(int j=i+1; j<n; j++){
            a[i][n] -= a[i][j]*a[j][n];//第i行方程的值a[i][n]减去方程左边对应系数与已求解出的变量的乘积
        }
    }
    return 0;//有唯一解

}
int main(){
    cin >> n;
    for( int i=0; i<n; i++){
        for(int j=0; j<= n; j++){
            cin>>a[i][j];
        }
    }

    int t = gauss();
    if(t==0){
        for(int i=0; i<n; i++) printf("%.2lf\n",a[i][n]);
    }
    else if(t==1) puts("Infinite group solutions");
    else puts("No solution");

    return 0;
}
View Code

 

posted @ 2019-07-26 11:10  SUMay  阅读(225)  评论(0编辑  收藏  举报