众所周知,高斯消元可以用来求n元一次方程组的,主要思想就是把一个n*(n+1)的矩阵的对角线消成1,除了第n+1列(用来存放b的)的其他全部元素消成0,是不是听起来有点不可思议??!

NO NO NO!


这不就是初中学的代入消元和加减消元嘛,思路一样的。

Step 1:将所给出的n元1次方程组的每个未知数系数和等号后面的常数写成一个n*(n+1)的矩阵

比如这个三元一次方程组我们就可以写成如下3×4的矩阵:

Step 2 :运用矩阵的各种性质,来将矩阵消成对角线上的元素为1,并且除了第n+1列其余元素均为0的矩阵,

这样我们就很容易的得出每个未知数的值:分别是从上到下第n+1列的值(因为这时候每个未知数的系数都为1)

那么是神马神奇性质呐???找度娘啊

(1) 任意交换矩阵的两行或两列,矩阵不变;

(2)矩阵任意行或列ai加上或减去任意k倍的任意行或列(ai行也可以加减k倍的ai行),矩阵不变;

………………………………

其余的性质这里就用不到啦,这两条性质足矣。

好啦,下面说一下怎么个消法(重点 嘤嘤嘤~)

以上面的矩阵为例:

明确我们的目的:把矩阵消成对角线为1,除了第n+1列其余元素都为0

也就是说,每一列都至少有一个元素不为0,若有一列全为0肯定有第i行第i列消不成1,此时无解

不理解的话也可以从方程组的数学角度来思考一下:

我们把每个未知数的系数写成矩阵,所以矩阵的某一列就是某一未知数的全部系数,

如果全为0,那么不就是没有这个未知数吗?那么这个未知数的值就不能确定了,那不就是无解吗?对吧。

知道了这个,我们就可以对这个矩阵进行初步判定:

for(int i=;i<=n;i++)
{
pl=i; //从第i行开始往下找,一直找到一个第i列不为0的行
while(a[pl][i]==&&pl<=n)
pl++;
// 判断第i列元素非0的最上行,因为第i行第i列元素不能为0
if(pl==n+) {cout<<"No Solution";return ;}
//一直判到了n+1行,可是一共才只有n行,说明有一列全为0,无解
for(int j=;j<=n+;j++)
//将第i行元素与第pl行第i列不为0的那一行与当前行交换
swap(a[i][j],a[pl][j]); //保证第i行第i列不为0
}

这样一来,我们就保证了第i行第i列的元素不为0,可是我们要让第i行第i列的值整成1啊,我们可以用性质(2),让第i行的每个元素都除以第i行第i列的值

注意:这里用到了除法,就有可能出现小数,所以我们要用double类型定义二维数组矩阵

        double k=a[i][i];                          //让第i行每个元素都除以a[i][i]使得a[i][i]为1
for(int j=;j<=n+;j++)
a[i][j]=a[i][j]/k; //将第i行第i列的元素消成1,注意同行进行同样的操作

我们就让第i行第i列的元素搞成1列,继续完成接下来的任务:顺便把第i列的其他元素搞成0;

我们已经把第i行的搞成了1,所以我们只要把其余行的每个元素都减去本行的首元素*第i行的对应元素(为什么是第i行呢?仗着第i行第i列的元素是1比较好消)

        for(int j=;j<=n;j++)
{
if(i!=j) //将第i列除了第i行的元素全消成0
{ //方法是第j行每个元素a[j][m]都减去a[j][1]*a[i][m]
double ki=a[j][i];
for(int m=;m<=n+;m++)
a[j][m]=a[j][m]-ki*a[i][m];
}
}

到这里就OK啦,最后输出第n+1列的元素就是每个未知数的解啦!

完整代码如下:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,pl;
double a[][];
int main()
{
cin>>n;
for(int i=;i<=n;i++)
for(int j=;j<=n+;j++)
cin>>a[i][j];
for(int i=;i<=n;i++)
{
pl=i;
while(a[pl][i]==&&pl<=n)
pl++;
// 判断第i列首元素非0的最上行,因为第i行第i列元素不能为0
if(pl==n+) {cout<<"No Solution";return ;}
//一直判到了n+1行,可是一共才只有n行,说明有一列全为0,无解
for(int j=;j<=n+;j++) //将第i行第i列元素不为0的那一行与当前行交换
swap(a[i][j],a[pl][j]);
double k=a[i][i]; //让第i行每个元素都除以a[i][i]使得a[i][i]为1
for(int j=;j<=n+;j++)
a[i][j]=a[i][j]/k; //将第i行第i列的元素消成1,注意同行进行同样的操作
for(int j=;j<=n;j++)
{
if(i!=j) //将第i列除了第i行的元素全消成0
{ //方法是第j行每个元素a[j][m]都减去a[j][1]*a[i][m]
double ki=a[j][i];
for(int m=;m<=n+;m++)
a[j][m]=a[j][m]-ki*a[i][m];
}
}
}
for(int i=;i<=n;i++)
printf("%.2lf\n",a[i][n+]);
return ;
}

QWQ,大家一定跃跃欲试了吧,给大家推荐一个洛谷板子题,巩固一下吧。

【模板】高斯消元法

高斯消元(Gauss消元)的更多相关文章

  1. 高斯消元和高斯约旦消元 Gauss(-Jordan) Elimination

    高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵. 在讲算法前先介绍些概念 矩阵的初等变换 矩阵的初等变换又分为矩阵的初等行变换和矩阵的初等列变换 ...

  2. $Gauss$消元

    $Gauss$消元 今天金牌爷来问我一个高消的题目,我才想起来忘了学高消... 高斯消元用于解线性方程组,也就是形如: $\left\{\begin{matrix}a_{11}x_1+a_{12}x_ ...

  3. hdu 5755(Gauss 消元) &poj 2947

    Gambler Bo Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tota ...

  4. 求一个n元一次方程的解,Gauss消元

    求一个n元一次方程的解,Gauss消元 const Matrix=require('./Matrix.js') /*Gauss 消元 传入一个矩阵,传出结果 */ function Gauss(mat ...

  5. Gauss 消元(模板)

    /* title:Gauss消元整数解/小数解整数矩阵模板 author:lhk time: 2016.9.11 没学vim的菜鸡自己手打了 */ #include<cstdio> #in ...

  6. poj 1681(Gauss 消元)

    Painter's Problem Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5875   Accepted: 2825 ...

  7. POJ 1830 开关问题(Gauss 消元)

    开关问题 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7726   Accepted: 3032 Description ...

  8. (转)AS3正则:元子符,元序列,标志,数量表达符

    (转)AS3正则:元子符,元序列,标志,数量表达符: AS3正则:元子符,元序列,标志,数量表达符 七月 4th, 2010 归类于 AS3前端技术 作者Linkjun 进行评论 as3正则:元子符, ...

  9. 5G套餐资费或为199元至599元,高昂价格会阻碍大众使用热情吗?

    近段时间,运营商各种谜一般的操作让其走上舆论的风口浪尖,成为人们口诛笔伐的对象.比如在前段时间,运营商相继宣布要取消"达量降速版畅享套餐",对用户的权益造成巨大冲击,引发了网络热议 ...

随机推荐

  1. max-width和width的区别

    width为宽度 max-width为最大宽度 如果设置了width,那宽度就定死了,不能动态的改变,显得僵硬 而设置了max-width,实际宽度可以在0~max-width之间,当元素内部宽度不足 ...

  2. WebGIS中以version方式实现代码更新后前端自动读取更新代码的方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 前言 GIS代码进行更新后,由于用户前端已有缓存,导致更新的功能不 ...

  3. 一个磁盘I/O故障导致的AlwaysOn FailOver 过程梳理和分析

    下面是我们在使用AlwaysOn过程中遇到的一个切换案例.这个案例发生在2014年8月,虽然时间相对久远了,但是对我们学习理解AlwaysOn的FailOver原理和过程还是很有帮助的.本次FailO ...

  4. location.origin不兼容IE8解决方案

    最近项目中遇到一个问题,在ajax跟后台交互时需要传一个全路径url.项目上线后,在谷歌,火狐,360等浏览器访问一切正常.但唯独IE8下出现问题,提示url:undefined ! 这就尴尬了!!! ...

  5. Web开发人员学习路线图

    http://www.runoob.com/w3cnote/2018-web-developer.html

  6. 目录命令(dir)

    DIR 命令: // 描述: (Directory) 显示目录的文件和子目录的列表. // 语法: dir [<Drive>:][<Path>][<FileName> ...

  7. Bootstrap -- 表格样式、表单布局

    Bootstrap -- 表格样式.表单布局 1. 表格的一些样式 举例: <!DOCTYPE html> <html> <head> <meta http- ...

  8. ABAP 7.53 中的ABAP SQL(原Open SQL)新特性

    S/4 HANA 1809 已经在上月发布,随之而来的是ABAP 7.53. 本文是更新文档中ABAP SQL的部分的翻译. 本次更新的内容较多,主要内容包括:Open SQL更名为ABAP SQL: ...

  9. socket粘包问题解决

    粘包client.send(data1)client.send(data2)这两次send紧挨在一起,处理的时候会放在一起发过去在Linux里每次都粘包,Windows里面某次会出现粘包在两次send ...

  10. Python开发【第一篇】基础题目二

    1 列表题 l1 = [11, 22, 33] l2 = [22, 33, 44] # a. 获取l1 中有,l2中没有的元素 for i in l1: if i not in l2: # b. 获取 ...