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;
}

高斯消元法原理及模板相关推荐

  1. DEDECMS模板原理、模板标签学习

    (转)DEDECMS模板原理.模板标签学习 - .Little Hann 本文,小瀚想和大家一起来学习一下DEDECMS中目前所使用的模板技术的原理: 什么是编译式模板.解释式模板,它们的区别是什么? ...

  2. C++ 泛型编程(一):模板基础:函数模板,类模板,模板原理,模板匹配规则

    类模板 函数模板 泛型编程 泛型编程,泛型即是指具有在多种数据类型上皆可操作的含义,其实就是能够帮助开发者编写完全一般化并可重复使用的算法,同样的工作不需要做多次,同样的算法针对不同的类型也不应该写多 ...

  3. 树状数组基础原理与模板

    树状数组 2021年7月29 1.算法原理 树状数组解决什么问题? 解决区间上点更新与维护的问题.如更改某些点值求区间和,或求某位前有多少比其小的问题. 其实现的原理是什么? 首先看图: 在这个图中, ...

  4. 高斯消元法原理与Matlab实现

    直接法解线性方程组-高斯消元法 1.高斯消元法思想 设有线性方程组如下所示: {a11x1+a12x2+⋯+a1nxn=b1,a21x1+a22x2+⋯+a2nxn=b2,⋮an1x1+an2x2+⋯ ...

  5. (转)DEDECMS模板原理、模板标签学习 - .Little Hann

    本文,小瀚想和大家一起来学习一下DEDECMS中目前所使用的模板技术的原理: 什么是编译式模板.解释式模板,它们的区别是什么? 模板标签有哪些种类,它们的区别是什么,都应用在哪些场景? 学习模板的机制 ...

  6. php 模板 原理,php模板原理讲解

    php模板原理讲解 复制代码 代码如下: $data = array( 'title'=>'ilsea', 'list'=>array( 'hello', 'world' ) ); inc ...

  7. 高斯消元法 思路及模板代码

    高斯消元法解线性方程组 思路及步骤 最后的到一个(近似)阶梯形矩阵 再把它化简成近似单位矩阵,即可得到解 模板代码 //题目背景:AcWing 883 #include<iostream> ...

  8. 中国剩余定理(孙子定理) 原理及模板代码

    背景简介 孙子定理是中国古代求解一次同余式组的方法.是数论中一个重要定理.又称中国余数定理.一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作<孙子算经>卷下第二十六题 ...

  9. php smarty 原理,php模板原理PHP模板引擎smarty模板原理浅谈

    mvc是开发中的一个伟大的思想,使得开发代码有了更加清晰的层次,让代码分为了三层各施其职.无论是对代码的编写以及后期的阅读和维护,都提供了很大的便利. 我们在php开发中,视图层view是不允许有ph ...

最新文章

  1. 超详细的CMD文件讲解
  2. eclipse占用内存过大_MySQL 服务占用cpu 100%,如何排查问题? (MySQL面试第七弹)...
  3. BZOJ:4820: [Sdoi2017]硬币游戏BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)
  4. 认识 URL 及其编码
  5. python基础教程pdf-Python基础教程(第3版) PDF高清完整版免费下载|百度云盘
  6. 考勤系统之计算工作小时数
  7. 机器学习基础---回归方法---支持向量回归(SVR)
  8. 出售永磁同步电机(pmsm)模型预测控制(MPC)matlab/simulink仿真模型,转速控制,电流控制,转矩控制,直接预测控制(有限集模型预测控制)(这单矢量和双矢量,三矢量),无差拍,foc矢
  9. 关于“未使用GUID分区表”无法安装的解决方案
  10. html分辨率与放大倍数,放大镜倍数 你怎样知道放大镜的放大倍数
  11. word计算机二级视频教程,计算机二级Office入门及上机实践视频教程之Word篇
  12. 2的0次方为什么等于1?
  13. 列举Java高并发面试题附答案解析
  14. 【计算方法】插值法多项式的求法--利用Lagrange插值和Newton插值
  15. Camtasia Studio2023喀秋莎免费实用的屏幕录像工具
  16. 【TrackVis 教程】基于DTI的纤维追踪及显示
  17. 2015年总结——为了梦想继续执着
  18. MOSSProject 2007语言包安装和部署
  19. pythonlive2d_Ren'Py引擎从入门到放弃(支线6)——还在探索阶段的Live2D
  20. 孟子正文 活动目录(Active Directory)域故障解决实例(转载)

热门文章

  1. PS色彩算法理解记录 4 Screen
  2. 10.敏捷估计与规划——Financial Prioritization笔记
  3. 天创速盈:拼多多低价引流怎么玩?大部分中小卖家都不知道
  4. 爬取了知乎2.2亿阅读量 “有漂亮女朋友是什么体验“,结果发现...
  5. js日历核心计算方法
  6. 个人如何打破部门墙_做事要有霸气
  7. linux模拟树莓派,使用QEMU模拟树莓派Raspberry Pi
  8. App地推:这些方法让你事半功倍
  9. python爬财务数据_会计终于不用被老板催着做报表,现在95%的财务都在悄悄办这事了!...
  10. 华为荣耀V20存瑕疵,证明三星在技术上还是要强一些