1.高斯消元

(1)定义

高斯消元法是求解线性方阵组的一种算法,它也可用来求矩阵的秩,以及求可逆方阵的逆矩阵。它通过逐步消除未知数来将原始线性系统转化为另一个更简单的等价的系统。它的实质是通过初等行变化将线性方程组的增广矩阵转化为行阶梯矩阵.

(2)初等行变换

初等行变换
定义:所谓数域P上矩阵的初等行变换是指下列3种变换:
(1)以P中一个非零的数乘矩阵的某一行
(2)把矩阵的某一行的c倍加到另一行,这里c是P中的任意一个数
(3)互换矩阵中两行的位置
一般来说,一个矩阵经过初等行变换后就变成了另一个矩阵,当矩阵A经过初等行变换变成矩阵B时,一般写作 A -> B 可以证明:任意一个矩阵经过一系列初等行变换总能变成阶梯型矩阵。

2.算法步骤

枚举每一列c
(1)找到绝对值最大的一行
(2)将该行变换到最上面
(3)将该行第一个数变成1
(4)将该行下面所有行的第c列变成0
(5)最后再把阶梯型矩阵从下到上回代到第一层即可得到方程的解

3.代码模板

double a[N][N]; //a[N][N]是增广矩阵
int gauss()
{int c, r;// c 代表 列 col , r 代表 行 rowfor (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;// 如果当前这一列的最大数都是 0 ,那么所有数都是 0,就没必要去算了,因为它的约束方程,可能在上面几行for (int i = c; i < n + 1; i ++ ) swap(a[t][i], a[r][i]); 把当前这一行,换到最上面(不是第一行,是第 r 行)去for (int i = n; i >= c; i -- ) a[r][i] /= a[r][c];// 把当前这一行的第一个数,变成 1, 方程两边同时除以 第一个数,必须要到着算,不然第一个数直接变1,系数就被篡改,后面的数字没法算for (int i = r + 1; i < n; i ++ )// 把当前列下面的所有数,全部消成 0if (fabs(a[i][c]) > eps)// 如果非0 再操作,已经是 0就没必要操作了for (int j = n; j >= c; j -- )// 从后往前,当前行的每个数字,都减去对应列 * 行首非0的数字,这样就能保证第一个数字是 a[i][0] -= 1*a[i][0];a[i][j] -= a[r][j] * a[i][c];r ++ ;// 这一行的工作做完,换下一行}if (r < n)// 说明剩下方程的个数是小于 n 的,说明不是唯一解,判断是无解还是无穷多解{// 因为已经是阶梯型,所以 r ~ n-1 的值应该都为 0for (int i = r; i < n; i ++ )// if (fabs(a[i][n]) > eps)// a[i][n] 代表 b_i ,即 左边=0,右边=b_i,0 != b_i, 所以无解。return 2;  //无解return 1   ;// 否则, 0 = 0,就是r ~ n-1的方程都是多余方程,多组解}// 唯一解 ↓,从下往上回代,得到方程的解for (int i = n - 1; i >= 0; i -- )for (int j = i + 1; j < n; j ++ )a[i][n] -= a[j][n] * a[i][j];//因为只要得到解,所以只用对 b_i 进行操作,中间的值,可以不用操作,因为不用输出return 0;  //一个解
}

4.题目练习

(1).AcWing 883. 高斯消元解线性方程组

输入一个包含n个方程n个未知数的线性方程组。
方程组中的系数为实数。
求解这个方程组。
下图为一个包含m个方程n个未知数的线性方程组示例:

输入格式
第一行包含整数n。
接下来n行,每行包含n+1个实数,表示一个方程的n个系数以及等号右侧的常数。
输出格式
如果给定线性方程组存在唯一解,则输出共n行,其中第i行输出第i个未知数的解,结果保留两位小数。
如果给定线性方程组存在无数解,则输出“Infinite group solutions”。
如果给定线性方程组无解,则输出“No solution”。
数据范围
1≤n≤100,
所有输入系数以及常数均保留两位小数,绝对值均不超过100。
输入样例:
3
1.00 2.00 -1.00 -6.00
2.00 1.00 -3.00 -9.00
-1.00 -1.00 2.00 7.00
输出样例:
1.00
-2.00
3.00

(2).ac代码

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 1e2 + 10;
const double eps = 1e-6;
double a[N][N];
int n;
int gauss()
{int c, r;   //col 列,row 行for (c = 0, r = 0; c < n; c++){int t = c;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 + 1; i++){swap(a[t][i], a[r][i]);}for (int i = n; i >= c; i--)  a[r][i] /= a[r][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++;}if (r < n){for (int i = r; i < n; i++)if (fabs(a[i][n] > eps))return 2;return 1;}for (int i = n - 1; i >= 0; i--)for (int j = i + 1; j < n; j++)a[i][n] -= a[j][n] * a[i][j];return 0;
}int main()
{cin >> n;for (int i = 0; i < n; i++)for (int j = 0; j < n + 1; 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;
}

数论 - 高斯消元算法相关推荐

  1. 第三十四章 数论——高斯消元解线性方程组

    第三十四章 数论--高斯消元解线性方程组 一.高斯消元 1.线性方程组 2.高斯消元步骤 (1)数学知识铺垫 增广矩阵和阶梯矩阵 初等变换 (2)高斯消元步骤 二.代码模板 1.问题: 2.代码 一. ...

  2. Rocksdb Ribbon Filter : 结合 XOR-filter 以及 高斯消元算法 实现的 高效filter

    文章目录 前言 XOR-filter 实现原理 xor filter 的构造原理 xor filter 构造总结 XOR-filter 和 ADD-filter对比 XOR-filter 在计算上的优 ...

  3. 【C++】高斯消元算法

    矩阵初等行变换法则 任一行可以与另一行进行加减. 任一行可以乘或除以一个非零常数(除其实就是乘一个倒数). 任两行可以交换位置. 线性方程组 形如 a1,1x1+a1,2x2+⋯+a1,nxn=b1a ...

  4. 英特尔oneAPI—高斯消元算法并行化

    英特尔oneAPI简介 Intel oneAPI是一个跨行业.开放.基于标准的统一的编程模型,旨在提供一个适用于各类计算架构的统一编程模型和应用程序接口.也就是说,应用程序的开发者只需要开发一次代码, ...

  5. [算法] 高斯消元详解

    原文链接(强烈建议安利) 0.前置知识 知道如何解三元一次方程组 有手,有脑子 1.答案的表示与存储 先解一个方程组: 2x+3y+5z=31 x-4y -z=-6 4x+2y-5z=9 我们把这个方 ...

  6. 计算机编程 高斯消元,高斯-若尔当消元法

    高斯-若尔当消元法(英语:Gauss-Jordan Elimination),或译为高斯-约旦消元法,简称G-J消元法,是数学中的一个算法,是高斯消元法的另一个版本.它在线性代数中用来找出线性方程组的 ...

  7. 基于高斯消元的BATS码的改进译码算法

    基于高斯消元的BATS码的改进译码算法 摘要 BATS 码的编译码原理: 改进的高斯消元的结论: 系数矩阵不满秩下可以解码部分包的情况: 摘要 BATS码:(Batched Sparse Codes, ...

  8. 【算法设计与分析基础】高斯消元

    参考<算法导论>第七部分 算法问题选编中的第28章 矩阵运算. #include<iostream> using namespace std;/*** 一些矩阵例子*//* d ...

  9. 【bzoj3601】一个人的数论 莫比乌斯反演+莫比乌斯函数性质+高斯消元

    Description Sol 这题好难啊QAQ 反正不看题解我对自然数幂求和那里是一点思路都没有qwq 先推出一个可做一点的式子: \(f(n)=\sum_{k=1}^{n}[(n,k)=1]k^d ...

最新文章

  1. “私有云”安全的“过渡”时期-“云朵”方案的设计思路
  2. TensorFlow--实现人脸识别实验精讲 (Face Recognition using Tensorflow)
  3. DeepLearning:pydot安装的使用和安装
  4. SAP创建Web Service以及用ABAP调用
  5. 如何知道是否开启opcode_你知道如何查询企业是否有ICP经营许可证吗?
  6. sjms-3 结构型模式
  7. 有些道理经历过就是道理,没经历过可能就是心灵鸡汤。
  8. 修改内核的启动logo
  9. lambda 对象初始化器 集合初始化器
  10. 一道笔试题:贿赂选民
  11. HALCON 20.11:如何处理标定助手品质问题
  12. mysql运用实例_mysql应用实例
  13. 【剑指 offer】(二十二)—— 栈的压入、弹出序列
  14. IDM(Internet Download Manager)下载各类安装包(github代码、python包)、软件、视频、文档的神器,居家必备良药
  15. 乒乓球单循环赛_乒乓球单循环比赛如何计算得分排名(实用方法)
  16. 部署项目在Tomcat出现,tomcat报错More than one fragment with the name [org_apache_tomcat_websocket]
  17. 墙裂推荐6款实用办公软件!超级好用!
  18. [C#]WPF 3D 绘制一个正方体并调整视场角
  19. 【Leetcode】1324. Print Words Vertically
  20. Vue框架的初识入门

热门文章

  1. WCF 跨域问题解决方案
  2. 2021学而时习之课程学而思春季小学重点干货笔记
  3. 微信小程序--页面传值
  4. 录音函数网络对讲机C#服务器 Android客户端(二) C#服务器代码分析 附加
  5. java字体倾斜_java立体文字效果怎么做?倾斜的怎么做?
  6. Lenovo/联想A628T root教程_方法
  7. 计算机二级设置用户名,计算机二级ms office考试设置技巧
  8. JAVA实现shp文件转wkb文件
  9. 获取京东_JdTdudfp的eid和fp
  10. anaconda配置python环境