原文链接(强烈建议安利)

0.前置知识

  • 知道如何解三元一次方程组
  • 有手,有脑子

1.答案的表示与存储

先解一个方程组:

2x+3y+5z=31
x-4y -z=-6
4x+2y-5z=9


我们把这个方程组写成 机器能读懂表格形式

2 3 5 31
1 -4 -1 -6
4 2 -5 9

第一列代表 x x x 的系数,第二列代表 y y y 的系数……
注意多出来的第四列是答案的具体数值
第一行代表式子 1,第二列代表式子 2……


因为老是使用 x , y , z x,y,z x,y,z 表示 n n n 个数不方便,所以我们使用 a 1 , a 2 . . . a n a_1,a_2...a_n a1​,a2​...an​ 来表示。

即,上面的表格的意义就是:

第 i ( 1 ≤ i ≤ n ) i(1\le i\le n) i(1≤i≤n) 列代表每个式子中 a i a_i ai​ 的系数,第 n + 1 n+1 n+1 列表示每个式子的具体数值。(因为存储的时候这个都是普通的数值,所以读者务必辨清

第 i ( 1 ≤ i ≤ n ) i(1\le i\le n) i(1≤i≤n) 行代表第 i i i 个式子。

接着全文中,使用 a [ i ] [ j ] a[i][j] a[i][j] 表示第 i i i 行第 j j j 列的数值/系数


2.高斯消元思想

名字这么高级,但是方法很土。具体操作是:加减消元法+代入消元法

首先,接着上面的系数矩阵:

2 3 5 31
1 -4 -1 -6
4 2 -5 9

然后开始高斯消元。

枚举 i i i ,顺序消除未知数 a i a_i ai​ 。

然后枚举 j j j ,找到一个绝对值最小不为 0 0 0 的 a [ j ] [ i ] a[j][i] a[j][i] 。

找到那个构成最小 a [ j ] [ i ] a[j][i] a[j][i] 的 j j j 后,将第 j j j 个式子与第 i i i 个式子交换

枚举 j j j ,设 m u l = a [ i ] [ i ] / a [ j ] [ i ] mul=a[i][i]/a[j][i] mul=a[i][i]/a[j][i] ,
将 j j j 式子乘上 m u l mul mul 并且减去 i i i 式子

我们一层层剖析为什么这样做。
首先,枚举 i i i ,需要消掉第 i i i 个未知数
然后,选择 j j j 使得 a [ j ] [ i ] a[j][i] a[j][i] 最小,这个其实不是必须的(后面讲为什么)。交换 j j j 式子和 i i i 式子。
再后来,枚举每一个 j j j ,将 j j j 式子乘上 a [ i ] [ i ] / a [ j ] [ i ] a[i][i]/a[j][i] a[i][i]/a[j][i] ,是因为需要将 j j j 式子第 i i i 项的系数 调整与 i i i 式子第 i i i 项的系数一样
将 j j j 式子减去 i i i 式子,目的为了消去第 i i i 项的系数

为什么要选择 绝对值最小而不为 0 0 0 的 a [ j ] [ i ] a[j][i] a[j][i] 的 j j j 呢?因为绝对值最小的 a [ j ] [ i ] a[j][i] a[j][i] 大致可以构成更多整除的情况,而这样就可以避免掉精度
不能取 0 0 0 是当然的。

如果还没有理解?那么一层层模拟。
还是以这个方程组为例子:

2 3 5 31
1 -4 -1 -6
4 2 -5 9

首先,消去第一个系数。

1 -4 -1 -6
2 3 5 31
4 2 -5 9

找到最小 a [ 1 ] a[1] a[1] 的式子,调到第一个;

1 -4 -1 -6
1 3/2 5/2 31/2
4 2 -5 9

第二个柿子 × 0.5 \times 0.5 ×0.5 。

1 -4 -1 -6
0 11/2 7/2 43/2
4 2 -5 9

第二个式子减去第一个。


以此类推,最后这个答案的系数矩阵是:(没有对齐,有点丑)

4 0 0 20
0 -4.5 0 -9
0 0 7.611 22.833

然后最后的 n + 1 n+1 n+1 系数除以 第 i i i 行第 i i i 列的数值即可。

3.你们想看的代码。

P3389 【模板】高斯消元法

注释有点少,能看懂就行。

#include<bits/stdc++.h>
#define RI register int
using namespace std;typedef long long LL;const int inf=1073741823;int FL,CH;template<typename T>void in(T&a){for(a=0,FL=1,CH=getchar();!isdigit(CH);CH=getchar())FL=(CH=='-')?-1:1;for(;isdigit(CH);CH=getchar())a=a*10+CH-'0';a*=FL;}template<typename T,typename ...Args>void in(T&a,Args&...args){in(a);in(args...);}
const int maxn=110;const double eps=1e-6;
double a[maxn][maxn];
int n;
int main()
{cin>>n;for(RI i=1;i<=n;++i){for(RI j=1;j<=n+1;++j)scanf("%lf",&a[i][j]);}//输入系数矩阵for(RI rp,i=1;i<=n;++i){rp=i;for(RI j=i+1;j<=n;++j)if(fabs(a[j][i])>fabs(a[rp][i]))rp=j;if(fabs(a[rp][i])<=eps)return printf("No Solution"),0;//寻找绝对值最小的 j//这个特殊一点,要判无解if(i!=rp)swap(a[rp],a[i]);//交换 j 和 idouble div=a[i][i];for(RI j=1;j<=n;++j)if(j!=i){div=a[j][i]/a[i][i];//计算 mul 值for(RI k=1;k<=n+1;++k)a[j][k]-=a[i][k]*div;//乘上,再减去//高斯消元算法的精髓}}for(RI i=1;i<=n;++i)printf("%.2lf\n",a[i][n+1]/a[i][i]);//回代,并输出答案return 0;
}

[算法] 高斯消元详解相关推荐

  1. AC自动机 + 概率dp + 高斯消元 --- HDU 5955 or 2016年沈阳icpc H [AC自动机 + 概率dp + 高斯消元]详解

    题目链接 题目大意: 就是有NNN个人,每个人都会猜一个长度为LLL的只包含{1,2,3,4,5,6}\{1,2,3,4,5,6\}{1,2,3,4,5,6}的序列,现在裁判开始投掷骰子,并且把每次的 ...

  2. 解方程 ( 迭代法/牛顿迭代/高斯消元 ) 详解及模板

    欢迎访问https://blog.csdn.net/lxt_Lucia-- 宇宙第一小仙女\(^o^)/--萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗-- 一.迭代法解方程 ( ...

  3. 【4.7 高斯消元详解】

    更好的阅读体验 \color{red}{更好的阅读体验} 更好的阅读体验 目录 4.7 高斯消元 4.7.1 高斯消元解线性方程组 4.7.2 高斯消元解异或线性方程组 4.7 高斯消元 概念 利用初 ...

  4. 【BZOJ3503】【Cqoi2014】和谐矩阵 高斯消元,解异或方程组

    #include <stdio.h> int main() {puts("转载请注明出处");puts("地址:blog.csdn.net/vmurder/a ...

  5. {算法}高斯消元不高斯

    高斯消元蛋白,由开挂数学家高斯命名.它可以在 O(n2) O(n^2)的时间内解出n元1次方程组. 功能这么强大,其实原理就是常用的"加减消元法". 首先,还是要将方程标准化,都( ...

  6. EM算法高斯混合模型原理详解及小例子

    EM算法与混合高斯模型 EM算法经常用在混合高斯模型下,那么首先我们先介绍一下什么是混合高斯模型 什么是混合高斯模型 首先我们对于单个高斯模型我们会有如下数据,并且不同的数据服从的高斯也不同,也就是它 ...

  7. poj2947(高斯消元解同模方程组)

    题目链接:http://poj.org/problem?id=2947 题意:有n 种装饰物,m 个已知条件,每个已知条件的描述如下: p start end a1, a2......ap (1< ...

  8. 开关问题 POJ - 1830 高斯消元

    开关问题 POJ - 1830 有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变 ...

  9. 矩阵与高斯消元【矩阵乘法,高斯消元求线性方程组,求行列式】 全网最详,附例题与姊妹篇 一万三千字详解

    (详解)矩阵快速幂详解与常见转移矩阵的构造_秦小咩的博客-CSDN博客_矩阵快速幂转移矩阵 目录 矩阵乘法 矩阵快速幂 伪代码模板 例题一 例题2 例题三 例题四 高斯消元 整形高斯消元 浮点型高斯消 ...

最新文章

  1. DHCP在企业网中的应用
  2. php 配置 关闭警告,php warning 关闭的方法
  3. 2016去哪儿编程题:乘坐公交
  4. 局域网打印机共享怎么设置?如何设置打印机共享?
  5. c# 衍生类和基类的构造顺序
  6. 论文浅尝 | 基于知识图谱难度可控的多跳问题生成
  7. 那年学过的Java笔记一SE基础
  8. 点击选中框 批量删除
  9. BZOJ1119[POI2009]SLO BZOJ1697[Usaco2007 Feb]Cow Sorting牛排序
  10. android 查看某一个apk签名,APK提取获取签名
  11. PADS2007教程(一)——原理图封装
  12. windows电脑上一些软件如画图/记事本变成了英文
  13. 基金购买和赎回线下业务
  14. 测试自动化成本及投资回报率
  15. 百度Uditor富文本编辑器使用以及图片不显示问题
  16. php怎样给搜索框加放大镜,Win10系统给小娜搜索框添加放大镜和箭头图标的方法...
  17. qt中去除首尾空格的操作simplified()和trimmed()的对比操作
  18. docker生态-mysql客户端phpAdmin
  19. 通过京东商品ID获取京东优惠券信息,京东优惠券信息接口,京东优惠券API接口,接口说明接入方案
  20. Maven国内源设置 -  OSChina国内源失效了,别更新了

热门文章

  1. Java 开源中文分词器Ansj 学习教程
  2. 人口收入普查数据探索
  3. Emacs之缩进(五十三)
  4. 手写webserver
  5. QQ登录获取unionID
  6. 微信小程序---家庭记账本开发(一)
  7. 网易云刷歌python
  8. 谷歌开源漏洞跟踪工具 Monorail 存在跨站点搜索漏洞
  9. 什么是mmu?为什么要用mmu?
  10. 令我“细思极恐”的Faster-R-CNN