高斯消元求解n元一次线性方程组的板子题:

先举个栗子:

• 2x + y -   z =  8-----------①
•-3x - y + 2z = -11---------②
•-2x + y + 2z = -3----------③
 先将它存到矩阵中:

②+①* (2/3)

③+①

接着对①变换

得到x,y,z;

但是我们想到,如果它有在原方程中就有两个或多个方程本质上是一样的,那他不就解不出来了咩?

比如:

最后得出:

这显然就属于无解的情况

又比如:

这显然就属于无穷多解的情况

这里我们引入一个定理:

一个矩阵的行列式如果不为0,方程组有唯一解,否则无解或者无穷多解


然后我们就可以通过计算行列式来判断有无解辣!


高斯消元求解线性方程组的步骤:

Step1:利用高斯消元将原矩阵(蒟阵 变为对角矩阵    

   具体方法:将a[i][i]除成1,这一行也进行同样的变换,用这个1去消其他的项

Step2:将对角线上的值连乘得到行列式
    一个矩阵的行列式如果不为0,方程组有唯一解,否则无解或者无穷多解
 

在将原矩阵变为对角矩阵的过程中,线性方程组就已经消成了ax=b的形式,故只需要判断有无解即可;

求行列式:

先了解一下运算法则:传送门

行列式的计算:

举两个例子

测试代码如下(注意是这里输入n是未知数个数,m是方程个数,对于这个题mn输入一样的就可以辣!):

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<cstdlib>
  7. using namespace std;
  8. typedef long long ll;
  9. typedef long double ld;
  10. typedef pair<int,int> pr;
  11. const double pi=acos(-);
  12. #define rep(i,a,n) for(int i=a;i<=n;i++)
  13. #define per(i,n,a) for(int i=n;i>=a;i--)
  14. #define Rep(i,u) for(int i=head[u];i;i=Next[i])
  15. #define clr(a) memset(a,0,sizeof a)
  16. #define pb push_back
  17. #define mp make_pair
  18. #define fi first
  19. #define sc second
  20. ld eps=1e-;
  21. ll pp=;
  22. ll mo(ll a,ll pp){if(a>= && a<pp)return a;a%=pp;if(a<)a+=pp;return a;}
  23. ll powmod(ll a,ll b,ll pp){ll ans=;for(;b;b>>=,a=mo(a*a,pp))if(b&)ans=mo(ans*a,pp);return ans;}
  24. ll read(){
  25. ll ans=;
  26. char last=' ',ch=getchar();
  27. while(ch<'' || ch>'')last=ch,ch=getchar();
  28. while(ch>='' && ch<='')ans=ans*+ch-'',ch=getchar();
  29. if(last=='-')ans=-ans;
  30. return ans;
  31. }
  32. //head
  33. int n,m;
  34. double a[][];
  35.  
  36. bool check(int k){
  37. if(fabs(a[k][n+])<eps)return ;
  38. rep(i,,n)
  39. if(fabs(a[k][i])>eps)return ;
  40. return ;
  41. }
  42. int main(){
  43.  
  44. n=read();m=read();
  45. // a_i,1 a_i,2 ... a_i,n a_i,n+1
  46. rep(i,,m)
  47. rep(j,,n+)a[i][j]=read();
  48. rep(j,,m){
  49. rep(k,,n+)cout<<a[j][k]<<" ";
  50. puts("");
  51. }
  52. int flag=;
  53. rep(i,,n){
  54. int t=i;
  55. while(a[t][i]== && t<=n)t+=;
  56. if(t==n+){
  57. flag=;
  58. continue;
  59. }
  60. rep(j,,n+)swap(a[i][j],a[t][j]);//交换两行
  61. double kk=a[i][i];//每一行对角线上的值
  62. rep(j,,n+)a[i][j]/=kk;
  63. rep(j,,m)//循环m个式子 开始消元
  64. if(i!=j){
  65. double kk=a[j][i];
  66. rep(k,,n+)
  67. a[j][k]-=kk*a[i][k];//这样就能保证正好把第i列的数除了a[i][i] 都消成0
  68. }
  69. puts("------------");
  70. rep(j,,m){
  71. rep(k,,n+)cout<<a[j][k]<<" ";
  72. puts("");
  73. }
  74. }
  75. if(flag){//如果flag=1,可能是 无解,也可能是无穷解
  76. rep(i,,m)
  77. if(!check(i)){
  78. printf("No solution\n");
  79. return ;
  80. }
  81. printf("So many solutions\n");
  82. }
  83.  
  84. }

本题AC代码:稍微改一下就行啦

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<cstdlib>
  7. using namespace std;
  8. typedef long long ll;
  9. typedef long double ld;
  10. typedef pair<int,int> pr;
  11. const double pi=acos(-);
  12. #define rep(i,a,n) for(int i=a;i<=n;i++)
  13. #define per(i,n,a) for(int i=n;i>=a;i--)
  14. #define Rep(i,u) for(int i=head[u];i;i=Next[i])
  15. #define clr(a) memset(a,0,sizeof a)
  16. #define pb push_back
  17. #define mp make_pair
  18. #define fi first
  19. #define sc second
  20. ld eps=1e-;
  21. ll pp=;
  22. ll mo(ll a,ll pp){if(a>= && a<pp)return a;a%=pp;if(a<)a+=pp;return a;}
  23. ll powmod(ll a,ll b,ll pp){ll ans=;for(;b;b>>=,a=mo(a*a,pp))if(b&)ans=mo(ans*a,pp);return ans;}
  24. ll read(){
  25. ll ans=;
  26. char last=' ',ch=getchar();
  27. while(ch<'' || ch>'')last=ch,ch=getchar();
  28. while(ch>='' && ch<='')ans=ans*+ch-'',ch=getchar();
  29. if(last=='-')ans=-ans;
  30. return ans;
  31. }
  32. //head
  33. int n,m;
  34. double a[][];
  35.  
  36. bool check(int k){
  37. if(fabs(a[k][n+])<eps)return ;
  38. rep(i,,n)
  39. if(fabs(a[k][i])>eps)return ;
  40. return ;
  41. }
  42. int main(){
  43.  
  44. n=read();m=n;
  45. // a_i,1 a_i,2 ... a_i,n a_i,n+1
  46. rep(i,,m)
  47. rep(j,,n+)a[i][j]=read();
  48.  
  49. int flag=;
  50. rep(i,,n){
  51. int t=i;
  52. while(a[t][i]== && t<=n)t+=;
  53. if(t==n+){
  54. flag=;
  55. continue;
  56. }
  57. rep(j,,n+)swap(a[i][j],a[t][j]);//交换两行
  58. double kk=a[i][i];//每一行对角线上的值
  59. rep(j,,n+)a[i][j]/=kk;
  60. rep(j,,m)//循环m个式子 开始消元
  61. if(i!=j){
  62. double kk=a[j][i];
  63. rep(k,,n+)
  64. a[j][k]-=kk*a[i][k];//这样就能保证正好把第i列的数除了a[i][i] 都消成0
  65. }
  66. }
  67. if(flag){
  68.  
  69. return printf("No Solution\n"),;
  70. }
  71. rep(j,,m){
  72. printf("%.2lf",a[j][n+]/a[j][j]);
  73. puts("");
  74. }
  75.  
  76. }

P3389 【模板】高斯消元法的更多相关文章

  1. 洛谷P3389 【模板】高斯消元法

    P3389 [模板]高斯消元法 题目背景 Gauss消元 题目描述 给定一个线性方程组,对其求解 输入输出格式 输入格式: 第一行,一个正整数 n 第二至 n+1行,每行 n+1 个整数,为a1​,a ...

  2. 题解 P3389 【【模板】高斯消元法】

    题解 P3389 [[模板]高斯消元法] 看到大家都没有重载运算符,那我就重载一下运算符给大家娱乐一下 我使用的是高斯-约旦消元法,这种方法是精度最高的(相对地) 一句话解释高斯约旦消元法: 通过加减 ...

  3. 洛谷——P3389 【模板】高斯消元法

    P3389 [模板]高斯消元法 以下内容都可省略,直接转大佬博客%%% 高斯消元总结 只会背板子的蒟蒻,高斯消元是什么,不知道诶,看到大佬们都会了这个水题,蒟蒻只好也来切一切 高斯消元最大用途就是解多 ...

  4. 洛谷P3389 【模板】高斯消元法(+判断是否唯一解)

    https://www.luogu.org/problemnew/show/P3389 这里主要说说怎么判断不存在唯一解 我们把每一行的第一个非零元称为关键元 枚举到一个变量,如果剩下的行中该变量的系 ...

  5. 【洛谷P3389 【模板】高斯消元法】

    这是个版子题,当然本蒟蒻也是看了好几天才明白 对于这样的线性方程组,我们可以看成是一个矩阵 对于百度百科给的定义(我感到很迷)赶脚和行列式有的一拼 但我们要注意的是: 行列式是一个确切的值(有关行列式 ...

  6. 【luogu P3389 高斯消元法】 模板

    题目链接: gauss消元求线性方程组的解. 这道题对于多解和无解都输出No solution #include <algorithm> #include <cstdio> # ...

  7. 洛谷 P3389 【模板】高斯消元法

    以下这个好像叫高斯约旦消元法,没有回代 https://www.luogu.org/blog/37781/solution-p3389 #include<cstdio> #include& ...

  8. 【洛谷P3389】(模板)高斯消元

    对于高斯消元法求解线性方程组, 我的理解就类似于我们在做数学题时的加减消元法, 只是把它写成一个通用的程序运算过程 对于一个线性方程组,我们从左往右每次将一列对应的行以下的元通过加减消元消去, 每个元 ...

  9. 「LuoguP3389」【模板】高斯消元法

    题目背景 Gauss消元 题目描述 给定一个线性方程组,对其求解 输入输出格式 输入格式: 第一行,一个正整数 nn 第二至 n+1n+1行,每行 n+1n+1 个整数,为a_1, a_2 \cdot ...

随机推荐

  1. 9个Console命令

    九个Console命令,让js调试更简单 By.cllgeek 一.显示信息的命令 1: <!DOCTYPE html> 2: <html> 3: <head> 4 ...

  2. 【20190415】JavaScript-事件流与stopPropagation()、stopImmediatePropagation()的误区解析

    这两天仔细看了一下MDN上关于事件流机制和相关方法的文档,发现有个很大的误区.过去我一直以为stopPropagation()就是用来阻止事件冒泡的,甚至很多博客和菜鸟教程上都是这样写的.但实际上文档 ...

  3. 无依赖简单易用的Dynamics 365实体记录数计数器并能计算出FetchXml返回的记录数

    本人微信公众号:微软动态CRM专家罗勇 ,回复278或者20180812可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 我们 ...

  4. PHP如何实现在数据库随机获取几条记录

    本文实例讲述了PHP实现在数据库百万条数据中随机获取20条记录的方法.PHP实例分享给大家供大家参考,具体如下: 为什么要写这个? 在去某个公司面试时,让写个算法出来,当时就蒙了,我开发过程中用到算法 ...

  5. 利用ZYNQ SOC快速打开算法验证通路(3)——PS端DMA缓存数据到PS端DDR

    上篇该系列博文中讲述W5500接收到上位机传输的数据,此后需要将数据缓存起来.当数据量较大或者其他数据带宽较高的情况下,片上缓存(OCM)已无法满足需求,这时需要将大量数据保存在外挂的DDR SDRA ...

  6. 【PAT】B1016 部分A+B

    水题 以字符和字符串形式储存输入,比较,计算出两个个数的D的个数,用for循环拼成P,相加得出结果 #include<stdio.h> int main(){ char A[20],DA, ...

  7. 浅谈百度地图API的坑

    我们可以使用百度地图生成器生成地图码(功能开发 还是使用官方文档吧) 注意百度地图坑 1.地图和我们申请的ak码版本问题 (解决方案:推荐大家使用2.0) 远程链接:<script type=& ...

  8. Dockerfile Volume指令与docker -v的区别

    在学习Dockerfile的过程中有个VOLUME命令,很多教程或书中说的是用来定义匿名卷的,其作用如下: 容器运行时应该尽量保持容器存储层不发生写操作,对于数据库类需要保存动态数据的应用,其数据库文 ...

  9. centos7下git版本升级及gitlab安装

    centos系统自带的git版本过低,当使用git拉取.推送.克隆的时候可能会报错,常见的错误: error: The requested URL returned error: 401 Unauth ...

  10. Taro文件上传:Blob Url下载Blob对象本身并通过接口上传到服务器

    最近项目的文件上传遇到一个问题,就是Taro的chooseImage传给回调的是一个Blob对象,一般来说,上传控件都会导出Data Url,而Taro给了一个Blob Url,问题在于,我直接令im ...