高斯消元法

  首先,我们导入几个概念。

定义1: 一个矩阵称为阶梯形(行阶梯形),若它有以下三个性质:

  1.每一非零行在每一零行之上;

  2.某一行的先导元素所在的列位于前一行先导元素的后面;

  3.某一行先导元素所在列下方元素都是零。

  比如,

定义2:若一个阶梯形矩阵还满足以下性质,称它为简化阶梯形(简化行阶梯形):

  1.每一非零行的先导元素是1;

  2.每一先导元素1是该元素所在列的惟一非零元素。

  比如,

定理1:每个矩阵行等价于惟一的简化阶梯形矩阵。即简化阶梯形矩阵是惟一的。


  下面,我们用一个具体例子来说明高斯消元法的主要步骤。

  原矩阵:

  第一步,由最左的非零列开始,这是一个主元列。主元位置在该列顶端。

  第二步,在主元列中选取一个非零元作为主元。若有必要的话,对换两行使这个元素移到主元位置上。

  第三步,用倍加行变换将主元下面的元素变成0.

  第四步,暂时不管包含主元位置的行以及它上面的各行,对剩下的子矩阵使用上述的三个步骤直到没有非零行需要处理为止。

  对每一行重复上述步骤。

  第五步,由最右面的主元开始,把每个主元上方的各元素变成0.若某个主元不是1,用倍乘变换将它变成1.

  最后,我们就得到了原矩阵的简化阶梯形。

  其中,第1~4步称为行化简算法的向前步骤,产生唯一的简化阶梯形的第5步,称为向后步骤。


C++实现

  我们尝试用C++来实现以上步骤。这里只是简单的实现,也就是用代码描述了上述步骤,没有考虑过多的问题。欢迎大家在评论里指出问题,提出更好的建议,以便于日后改进。

  大概的实现思路就是先实现向前步骤:

  首先,我们对于每一行找到第一个不为零的元素,并且将这一行置为1 * * * *的形式,用这一行乘上倍数加到之后的每一行。

  再实现向后步骤:

  然后,我们从最后一行开始,选择主元,加到之前的每一行上,使得该列的元素都为零。

  最后,我们就完成了化简,得到了简化阶梯形。

  以上算法只是一个粗略实现,主要体现在:

  1.对于主元的选定不够最优;

  2.会出现精度问题;

  3.对于某些情况无法处理。

  先暂时贴上代码,之后有时间再进行优化。

 #include <iostream>
#include <cstdio> using namespace std; int main()
{
double martix[][];
int n, m; // n行m列 scanf("%d %d", &n, &m); // 输入
for(int i = ; i < n; i++)
for(int j = ; j < m; j++)
scanf("%lf", &martix[i][j]); // 向前步骤
for(int i = ; i < n - ; i++)
{
// 找主元
int pos = ;
for(int j = ; j < m; j++)
if(martix[i][j])
{
pos = j;
break;
} if(martix[i][pos] != && martix[i][pos] != )
{
double tmp = martix[i][pos];
for(int j = pos; j < m; j++)
{
martix[i][j] = martix[i][j] / tmp;
}
}
for(int j = i + ; j < n; j++)
{
if(!martix[j][pos])
continue;
double tmp = martix[j][pos];
for(int k = pos; k < m; k++)
{
martix[j][k] = martix[j][k] - martix[i][k] * tmp;
}
}
} // 向后步骤
for(int i = n - ; i > ; i--)
{
int pos = ;
for(int j = ; j < m; j++)
if(martix[i][j])
{
pos = j;
break;
} if(martix[i][pos] != && martix[i][pos] != )
{
double tmp = martix[i][pos];
for(int j = pos; j < m; j++)
{
martix[i][j] = martix[i][j] / tmp;
}
} for(int j = ; j < i; j++)
{
if(!martix[j][pos])
continue;
double tmp = martix[j][pos];
for(int k = pos; k < m; k++)
{
martix[j][k] = martix[j][k] - martix[i][k] * tmp;
}
}
} // 输出
for(int i = ; i < n; i++)
{
for(int j = ; j < m; j++)
printf("%-10.2f", martix[i][j]);
printf("\n");
}
return ;
}

高斯消元法的C++简单实现的更多相关文章

  1. POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37427   Accepted: 16288 Descr ...

  2. POJ1222 高斯消元法解抑或方程

    第一次学怎么用高斯消元法解抑或方程组,思想其实很简单,方法可以看下面的链接:http://blog.csdn.net/zhuichao001/article/details/5440843 有了这种思 ...

  3. 高斯消元法(Gauss Elimination)【超详解&模板】

    高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵.高斯消元法的原理是:若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组. ...

  4. Eigen学习之简单线性方程与矩阵分解

    Eigen提供了解线性方程的计算方法,包括LU分解法,QR分解法,SVD(奇异值分解).特征值分解等.对于一般形式如下的线性系统: 解决上述方程的方式一般是将矩阵A进行分解,当然最基本的方法是高斯消元 ...

  5. 【造轮子】打造一个简单的万能Excel读写工具

    大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...

  6. Fabio 安装和简单使用

    Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的 ...

  7. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  8. 哪种缓存效果高?开源一个简单的缓存组件j2cache

    背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...

  9. 在Openfire上弄一个简单的推送系统

    推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...

随机推荐

  1. Java_JS_01_java调用js

    二.资源帖 1.JAVA执行javascript方法 2.在Java中直接调用js代码 3.Java执行js脚本 4.Java 8 Nashorn 教程 5.Java 脚本引擎

  2. NserviceBus过期处理

    NserviceBus不过期,修改注册表 HKEY_CURRENT_USER\Software\NServiceBus\3.3下的项TrailDate到2099-08-02

  3. 泛型,注解,反射配合优化BaseDao的猜想

    package test; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.la ...

  4. eclipse导入java web项目,项目出现红叉而其他地方没有红叉的问题解决方法

    eclipse导入别人的Java web项目时会出现这种情况:仅项目名出现红叉而其他地方没有红叉的问题.这可能是以下几种情况导致的,其解决方法如下: 1.导入项目之前,请确认工作空间编码已设置为utf ...

  5. C语言小程序(八)、统计字母个数

    这么简单的程序本不应贴在这里,但每写一篇博客,积分涨10分,距离摆脱千里之外的排名又进一步,相当于刷榜了,哈哈! #include <stdio.h> #include <strin ...

  6. 系列文章--Node.js学习笔记系列

    Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...

  7. [转]HTTP中cache-control的应用及说明

    网页的缓存是由http消息头中的“Cache-control”来控制的,常见的取值有private.no-cache.max-age.must-revalidate等,默认为private.其作用根据 ...

  8. BZOJ1012:[JSOI2008]最大数

    浅谈栈:https://www.cnblogs.com/AKMer/p/10278222.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...

  9. POJ2420:A Star not A Tree?

    我对模拟退火的理解:https://www.cnblogs.com/AKMer/p/9580982.html 我对爬山的理解:https://www.cnblogs.com/AKMer/p/95552 ...

  10. CF 293E Close Vertices——点分治

    题目:http://codeforces.com/contest/293/problem/E 仍旧是点分治.用容斥,w的限制用排序+两个指针解决, l 的限制就用树状数组.有0的话就都+1,相对大小不 ...