高斯消元法

数学上,高斯消元法(Gaussian Elimination或译:高斯消去法),是线性代数规划中的一个算法,可用来为线性方程组求解。在许多应用中,我们需要解一个包含n个方程的n元联立方程组:

其中,n是一个大数。高斯消去法的思路是把n个线性方程构成的n元联立方程组变成一个等价方程组(也就是说,它的解和原来的方程组相同),该方程组有着一个上三角形的系数矩阵,这种矩阵的主对角线下方元素全部为0。

用矩阵的符号,我们可以把它写成 A x = b = > A ’ x = b ′ {\boldsymbol{A}x=\boldsymbol{b} => \boldsymbol{A’}x=\boldsymbol{b'}} Ax=b=>A’x=b′,其中:

高斯消元法的核心

将一个具有任意系数矩阵的方程组 A \boldsymbol{A} A推导出一个具有上三角系数矩阵的等价方程组 A ′ \boldsymbol{A'} A′是高斯消元法需要解决的一个关键问题,这一部分可以通过一系列初等变换(elementary operation)来做到,而所谓的初等变换就是:

  • 交换方程组中两个方程的位置
  • 把一个方程替换为它的非零倍
  • 把一个方程替换为它和另一个方程倍数之间的和或差

高斯消元法的过程

高斯消元法需要经过前向消去反向替换两个步骤。其中,前向消去是利用初等变换来实现从任意系数矩阵方程组变换成具有上三角系数矩阵的等价方程组的过程,反向替换是在前向消去的基础上,从求解 x n {x_{n}} xn​(在上三角系数矩阵的等价方程组中,直接利用 b n ′ / a n n ′ {b'_{n}/a'_{nn}} bn′​/ann′​得到)开始,将其带回至上一个方程组来求解 x n − 1 x_{n-1} xn−1​,以此类推,逆向求得所有解的过程。

前向消去的实现

// 输入任意矩阵的引用,返回的布尔变量表示矩阵是否有唯一解
// 经过前向消去后,矩阵将转变为具有上三角系数的矩阵
bool ForwardElimination(vector<vector<double>>& matrix){for(int i=0; i<matrix.size()-1; i++){// 部分选主元法,从i至n行中,找到n-i+1列中的最大值所在的行int pivotrow = i;for(int j=i+1; j<matrix.size(); j++){if(abs(matrix[j][i]) > abs(matrix[pivotrow][i])){pivotrow = j;}}// 由于上三角形的对角线一定不为零,所以如果出现零,则表示解不唯一或无解// 同时,这一步可以排除部分主元为零,而出现除零的现象if(matrix[pivotrow][i] == 0){return false;}// 将找到的最大值所在的行与第i行进行交换for(int k=i; k<matrix.size()+1 && i != pivotrow; k++){swap(matrix[i][k], matrix[pivotrow][k]);}// 将第i+1行到第n行的方程组都减去第i行乘一个数得到的方程组for(int j=i+1; j<matrix.size(); j++){double temp = matrix[j][i] / matrix[i][i];for(int k=i; k<matrix.size()+1; k++){matrix[j][k] = matrix[j][k] - matrix[i][k]*temp;}}}// 需要单独检测上三角形的对角线上最后一个元素是否为零,如果为零,则表示解不唯一或无解if(matrix[matrix.size()-1][matrix.size()-1] == 0){return false;}return true;
}

反向替换的实现

// 函数返回解向量
vector<double> BackSubstitution(vector<vector<double>>& matrix){vector<double> solution(matrix.size(), 0);for(int i=matrix.size()-1; i>=0; i--){for(int j=matrix.size()-1; j>i;j--){matrix[i][matrix.size()] -= matrix[i][j]*solution[j];}solution[i] = matrix[i][matrix.size()] / matrix[i][i];}return solution;
}

Gauss消元求解方程组

#include<iostream>
#include<vector>
#include<iomanip>
#include<cmath>
using namespace std;void swap(double& a, double& b){double temp = a;a = b;b = temp;
}bool ForwardElimination(vector<vector<double>>& matrix){for(int i=0; i<matrix.size()-1; i++){int pivotrow = i;for(int j=i+1; j<matrix.size(); j++){if(abs(matrix[j][i]) > abs(matrix[pivotrow][i])){pivotrow = j;}}if(matrix[pivotrow][i] == 0){return false;}for(int k=i; k<matrix.size()+1 && i != pivotrow; k++){swap(matrix[i][k], matrix[pivotrow][k]);}for(int j=i+1; j<matrix.size(); j++){double temp = matrix[j][i] / matrix[i][i];for(int k=i; k<matrix.size()+1; k++){matrix[j][k] = matrix[j][k] - matrix[i][k]*temp;}}}if(matrix[matrix.size()-1][matrix.size()-1] == 0){return false;}return true;
}vector<double> BackSubstitution(vector<vector<double>>& matrix){vector<double> solution(matrix.size(), 0);for(int i=matrix.size()-1; i>=0; i--){for(int j=matrix.size()-1; j>i;j--){matrix[i][matrix.size()] -= matrix[i][j]*solution[j];}solution[i] = matrix[i][matrix.size()] / matrix[i][i];}return solution;
}int main()
{int n;cin >> n;vector<vector<double>> matrix(n, vector<double>(n+1, 0));for(int i=0; i<n; i++){for(int j=0; j<n+1; j++){cin >> matrix[i][j];}}     bool onlyS = ForwardElimination(matrix);if(onlyS){vector<double> solution = BackSubstitution(matrix);for(int i=0; i<solution.size(); i++){cout << fixed <<setprecision(2) << solution[i] << endl;}}else{cout << "No Solution";}return 0;
}

【数据结构与算法】高斯消元法相关推荐

  1. 数据结构与算法 Big O 备忘录与现实

    不论今天的计算机技术变化,新技术的出现,所有都是来自数据结构与算法基础.我们需要温故而知新. 算法.架构.策略.机器学习之间的关系.在过往和技术人员交流时,很多人对算法和架构之间的关系感到不可理解,算 ...

  2. 《数据结构与算法:Python语言描述》一1.3算法和算法分析

    本节书摘来自华章出版社<数据结构与算法:Python语言描述>一书中的第1章,第1.3节,作者 裘宗燕,更多章节内容可以访问云栖社区"华章计算机"公众号查看 1.3算法 ...

  3. Python3-Cookbook总结 - 第一章:数据结构和算法

    第一章:数据结构和算法 Python 提供了大量的内置数据结构,包括列表,集合以及字典.大多数情况下使用这些数据结构是很简单的. 但是,我们也会经常碰到到诸如查询,排序和过滤等等这些普遍存在的问题. ...

  4. 推荐一个关于.NET平台数据结构和算法的好项目

    http://www.codeplex.com/NGenerics 这是一个类库,它提供了标准的.NET框架没有实现的通用的数据结构和算法.值得大家研究. 转载于:https://www.cnblog ...

  5. 数据结构和算法:(3)3.1线性表的顺序存储结构

    -----------------------1.线性表基础操作------------------------ 线性表:(List)由零个或多个数据元素组成的有限序列. 首先他是一个序列,元素之间是 ...

  6. weiss数据结构和算法书的使用说明

    <数据结构与算法分析 C语言描述>Mark Allen Weiss著,冯舜玺译,机械工业出版社.Weiss教授的经典教材三部曲之一,其中的C语言描述版本,也就是本书,被称为20世纪最重要的 ...

  7. 数据结构和算法 -- 学习导图

    数据结构和算法 是作为程序员写出高效代码的基础,为了今后的两年在高效代码之路上持续精进,将按照此学习导图进行 算法和数据结构的刻意练习,同时也希望为同样有高效代码追求的伙伴们提供一条学习路径,共同进步 ...

  8. Java数据结构与算法(第四章栈和队列)

    2019独角兽企业重金招聘Python工程师标准>>> 本章涉及的三种数据存储类型:栈.队列和优先级队列. 不同类型的结构 程序员的工具 数组是已经介绍过的数据存储结构,和其他结构( ...

  9. python数据结构与算法总结

    python常用的数据结构与算法就分享到此处,本月涉及数据结构与算法的内容有如下文章: <数据结构和算法对python意味着什么?> <顺序表数据结构在python中的应用> ...

  10. 学习JavaScript数据结构与算法(一):栈与队列

    本系列的第一篇文章: 学习JavaScript数据结构与算法(一),栈与队列 第二篇文章:学习JavaScript数据结构与算法(二):链表 第三篇文章:学习JavaScript数据结构与算法(三): ...

最新文章

  1. [课堂实践与项目]NavigationController与TabBarController的综合使用及易错点分析(包含消息提醒,app更新)...
  2. linux2.6版及以后内核:支持实时、抢占
  3. Hive的使用之脚本文件
  4. mysql 分类汇总_sql多级分类汇总实现介绍
  5. ubuntu 18.04可以连接内网,无法连接外网
  6. 武汉大学计算机控制考试卷子,武汉大学计算机学院微机接口0809试题及答案.doc...
  7. 用计算机的知识服务社会,科研育人案例-董立红
  8. 你了解的工厂模式可能有误
  9. (机器学习)痛苦的Caffe配置之路(win10 教育版+vs2015+cmaker+cpu_only+python接口)
  10. 【华南理工大学】PC客户端配置-如何在家连接学校的校园网
  11. URLEncoder与URLDecoder
  12. visual studio 2015 Enterprise key vs2015密钥
  13. rzsz工具 源码交叉编译
  14. 通过新版阿里ACE认证,实验操作题你来解一下
  15. 白平衡(WB:white balance)数值设置
  16. 2013-2015阿里双十一技术网络文章总结
  17. 读取Unique reads
  18. Mac 下使用apt-get
  19. DOM初探(14)——查看滚动条的滚动距离
  20. 关于MDL的一些事(2)

热门文章

  1. php支付功能好写吗,php实现微信支付功能的操作步骤 - 编程语言
  2. 如何在企业微信提出离职
  3. linux 开启 远程,linux开启远程桌面连接
  4. 基于SSM的酒店入住预定系统(JavaWeb毕业设计源码)
  5. Mysql 根据经纬度 坐标查询 区域范围 所有坐标 并按距离进行排序
  6. 生成AI(一)—“智能讲师”口唇同步
  7. 建设营销型网站这6个要点要注意
  8. Git版本控制 从入门到精通
  9. jupyter notebook代码运行一直没有反应, 只显示*号
  10. C++ 调C C调c++