高斯消元法原理及模板
1.线形代数中的高斯消元法
高斯消元法:简单来说,就是消减未知元,来解多个方程组的一种方法,在线性代数中经常把方程组换算成矩阵,通过行列之间的加减法,把原来的矩阵转换成一个三角矩阵,然后回代求解。
解方程组例:
(1)x1+x2+x3=3
2*x1+3*x2+x3=5
3*x1+5*x2+6*x3=17
(2)第二式减去第一式的二倍,第三式减去第一式的三倍。
x1+x2+x3=3
x2-x3=-1
2*x2+3*x3=8
(3)第三式减去第2式的2倍
x1+x2+x3=3
x2-x3=-1
5*x3=10
(4)得出x3=2,然后代回原来的式子中进行求解。
转换成矩阵举例:
2.高斯消元法代码模板
int a[maxn][maxn]; //增广矩阵
int x[maxn]; //解集
bool freeX[maxn]; //标记解是否是自由变元int gcd(int a, int b)
{return b ? gcd(b, a % b) : a;
}int lcm(int a, int b)
{return a / gcd(a, b) * b;
}//高斯消元解方程组
//返回值-2表示有浮点数解,无整数解
//返回值-1表示无解,0表示有唯一解,大于0表示有无穷解,返回自由变元个数
//有equ个方程,var个变元
//增广矩阵行数[0, equ - 1]
//增广矩阵列数[0, var]
int gauss(int equ, int var)
{for (int i = 0; i <= var; i++){x[i] = 0;freeX[i] = true;}//转换为阶梯矩阵//col表示当前正在处理的这一列int col = 0;int row = 0;//maxR表示当前这个列中元素绝对值最大的行int maxRow;for (; row < equ && col < var; row++, col++){//枚举当前正在处理的行//找到该col列元素绝对值最大的那行与第k行交换maxRow = row;for (int i = row + 1; i < equ; i++){if (abs(a[maxRow][col]) < abs(a[i][col])){maxRow = i;}}if (maxRow != row){//与第row行交换for (int j = row; j < var + 1; j++){swap(a[row][j], a[maxRow][j]);}}if (a[row][col] == 0){//说明该col列第row行以下全是0,处理当前行的下一列row--;continue;}for (int i = row + 1; i < equ; i++){//枚举要删的行if (a[i][col] != 0){int LCM = lcm(abs(a[i][col]), abs(a[row][col]));int ta = LCM / abs(a[i][col]);int tb = LCM / abs(a[row][col]);//异号if (a[i][col] * a[row][col] < 0)tb = -tb;for (int j = col; j < var + 1; j++){a[i][j] = a[i][j] * ta - a[row][j] * tb;}}}}// //1. 无解的情况: 化简的增广阵中存在(0, 0, ..., a)这样的行(a != 0).for (int i = row; i < equ; i++){if (a[i][col] != 0){return -1;}}// 2. 无穷解的情况: 在var * (var + 1)的增广阵中出现(0, 0, ..., 0)这样的行,即说明没有形成严格的上三角阵.// 出现的行数即为自由变元的个数.if (row < var){// 首先,自由变元有var - k个,即不确定的变元至少有var - k个.for (int i = row - 1; i >= 0; i--){// 第i行一定不会是(0, 0, ..., 0)的情况,因为这样的行是在第k行到第equ行.// 同样,第i行一定不会是(0, 0, ..., a), a != 0的情况,这样的无解的.// freeNum用于判断该行中的不确定的变元的个数,如果超过1个,则无法求解,它们仍然为不确定的变元.int freeNum = 0;int freeIndex = 0;for (int j = 0; j < var; j++){if (a[i][j] != 0 && freeX[j]){freeNum++;freeIndex = j;}}if (1 < freeNum)// 无法求解出确定的变元.continue;// 说明就只有一个不确定的变元freeIndex,那么可以求解出该变元,且该变元是确定的.int tmp = a[i][var];for (int j = 0; j < var; j++){if (a[i][j] != 0 && j != freeIndex){tmp -= a[i][j] * x[j];}}x[freeIndex] = tmp / a[i][freeIndex];freeX[freeIndex] = false;}return var - row;}// 3. 唯一解的情况: 在var * (var + 1)的增广阵中形成严格的上三角阵.// 计算出Xn-1, Xn-2 ... X0.for (int i = var - 1; i >= 0; i--){int tmp = a[i][var];for (int j = i + 1; j < var; j++){if (a[i][j] != 0){tmp -= a[i][j] * x[j];}}if (tmp % a[i][i] != 0)//浮点数return -2;x[i] = tmp / a[i][i];}return 0;
}
3.高斯消元法经典例题
有一个5 * 6的矩阵,每个位置表示灯,1表示灯亮,0表示灯灭。
然后如果选定位置i,j点击,则位置i,j和其上下左右的灯的状态都会反转。
现在要你求出一个5 * 6的矩阵,1表示这个灯被点击过,0表示没有。
要求这个矩阵能够使得原矩阵的灯全灭。
#include <iostream>
#include <memory>
#include <cstring>
#include <string>
using namespace std;
char oriLights[5];
char Lights[5];
char result[5];
int GetBit(char c,int i)
{ return (c >> i) & 1;
}void SetBit(char &c,int i,int v)
{if (v) {c |=(1 << i);}else {c &= ~(1 << i);}
}void FlipBit(char &c,int i)
{c ^= (1 << i);
}void OutputResult(int t,char result[])
{cout << "PUZZLE #" << t << endl;for (int i = 0; i < 5;i++) {for (int j = 0; j < 6;j++) {cout << GetBit(result[i], j);if (j<5)cout << " ";}cout << endl;}
}
int main()
{int T;cin >> T;for (int t = 1; t <= T;t++) {memset(oriLights, 0, sizeof(oriLights));for (int i = 0; i < 5;i++) {for (int j = 0; j < 6;j++) {int s;cin >> s;SetBit(oriLights[i], j, s);}}for (int n = 0; n < 64;n++) {memcpy(Lights, oriLights, sizeof(oriLights));int switchs = n;for (int i = 0; i < 5;i++) {result[i] = switchs;for (int j = 0; j < 6;j++) {if (GetBit(switchs,j)) {if (j>0) FlipBit(Lights[i], j-1);FlipBit(Lights[i], j);if(j<5)FlipBit(Lights[i], j + 1);}}if (i<4) {Lights[i + 1] ^= switchs;}switchs = Lights[i];}if (Lights[4]==0) {OutputResult(t, result);break;}}}getchar();getchar();return 0;
}
高斯消元法原理及模板相关推荐
- DEDECMS模板原理、模板标签学习
(转)DEDECMS模板原理.模板标签学习 - .Little Hann 本文,小瀚想和大家一起来学习一下DEDECMS中目前所使用的模板技术的原理: 什么是编译式模板.解释式模板,它们的区别是什么? ...
- C++ 泛型编程(一):模板基础:函数模板,类模板,模板原理,模板匹配规则
类模板 函数模板 泛型编程 泛型编程,泛型即是指具有在多种数据类型上皆可操作的含义,其实就是能够帮助开发者编写完全一般化并可重复使用的算法,同样的工作不需要做多次,同样的算法针对不同的类型也不应该写多 ...
- 树状数组基础原理与模板
树状数组 2021年7月29 1.算法原理 树状数组解决什么问题? 解决区间上点更新与维护的问题.如更改某些点值求区间和,或求某位前有多少比其小的问题. 其实现的原理是什么? 首先看图: 在这个图中, ...
- 高斯消元法原理与Matlab实现
直接法解线性方程组-高斯消元法 1.高斯消元法思想 设有线性方程组如下所示: {a11x1+a12x2+⋯+a1nxn=b1,a21x1+a22x2+⋯+a2nxn=b2,⋮an1x1+an2x2+⋯ ...
- (转)DEDECMS模板原理、模板标签学习 - .Little Hann
本文,小瀚想和大家一起来学习一下DEDECMS中目前所使用的模板技术的原理: 什么是编译式模板.解释式模板,它们的区别是什么? 模板标签有哪些种类,它们的区别是什么,都应用在哪些场景? 学习模板的机制 ...
- php 模板 原理,php模板原理讲解
php模板原理讲解 复制代码 代码如下: $data = array( 'title'=>'ilsea', 'list'=>array( 'hello', 'world' ) ); inc ...
- 高斯消元法 思路及模板代码
高斯消元法解线性方程组 思路及步骤 最后的到一个(近似)阶梯形矩阵 再把它化简成近似单位矩阵,即可得到解 模板代码 //题目背景:AcWing 883 #include<iostream> ...
- 中国剩余定理(孙子定理) 原理及模板代码
背景简介 孙子定理是中国古代求解一次同余式组的方法.是数论中一个重要定理.又称中国余数定理.一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作<孙子算经>卷下第二十六题 ...
- php smarty 原理,php模板原理PHP模板引擎smarty模板原理浅谈
mvc是开发中的一个伟大的思想,使得开发代码有了更加清晰的层次,让代码分为了三层各施其职.无论是对代码的编写以及后期的阅读和维护,都提供了很大的便利. 我们在php开发中,视图层view是不允许有ph ...
最新文章
- 超详细的CMD文件讲解
- eclipse占用内存过大_MySQL 服务占用cpu 100%,如何排查问题? (MySQL面试第七弹)...
- BZOJ:4820: [Sdoi2017]硬币游戏BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)
- 认识 URL 及其编码
- python基础教程pdf-Python基础教程(第3版) PDF高清完整版免费下载|百度云盘
- 考勤系统之计算工作小时数
- 机器学习基础---回归方法---支持向量回归(SVR)
- 出售永磁同步电机(pmsm)模型预测控制(MPC)matlab/simulink仿真模型,转速控制,电流控制,转矩控制,直接预测控制(有限集模型预测控制)(这单矢量和双矢量,三矢量),无差拍,foc矢
- 关于“未使用GUID分区表”无法安装的解决方案
- html分辨率与放大倍数,放大镜倍数 你怎样知道放大镜的放大倍数
- word计算机二级视频教程,计算机二级Office入门及上机实践视频教程之Word篇
- 2的0次方为什么等于1?
- 列举Java高并发面试题附答案解析
- 【计算方法】插值法多项式的求法--利用Lagrange插值和Newton插值
- Camtasia Studio2023喀秋莎免费实用的屏幕录像工具
- 【TrackVis 教程】基于DTI的纤维追踪及显示
- 2015年总结——为了梦想继续执着
- MOSSProject 2007语言包安装和部署
- pythonlive2d_Ren'Py引擎从入门到放弃(支线6)——还在探索阶段的Live2D
- 孟子正文 活动目录(Active Directory)域故障解决实例(转载)
热门文章
- PS色彩算法理解记录 4 Screen
- 10.敏捷估计与规划——Financial Prioritization笔记
- 天创速盈:拼多多低价引流怎么玩?大部分中小卖家都不知道
- 爬取了知乎2.2亿阅读量 “有漂亮女朋友是什么体验“,结果发现...
- js日历核心计算方法
- 个人如何打破部门墙_做事要有霸气
- linux模拟树莓派,使用QEMU模拟树莓派Raspberry Pi
- App地推:这些方法让你事半功倍
- python爬财务数据_会计终于不用被老板催着做报表,现在95%的财务都在悄悄办这事了!...
- 华为荣耀V20存瑕疵,证明三星在技术上还是要强一些