高斯消元法

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

定义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. Mysql总结_02_mysql数据库忘记密码时如何修改

    1.从cmd进入mysql的bin下,输入命令  mysqld --skip-grant-tables  回车 注:(输入命令前,确保在任务管理器中已没有mysql的进程在运行,可输入命令:net s ...

  2. linux命令学习笔记(1):ls命令

    ls命令是linux下最常用的命令.ls命令就是list的缩写缺省下ls用来打印出当前目录的清单 如果ls指定其他目录那么就会显示指定目录里的文件及文件夹清单. 通过ls 命令不仅可以查 看li ...

  3. Struts2 - 表单的重复提交问题

    用户重复提交表单在某些场合将会造成非常严重的后果.例如,在使用信用卡进行在线支付的时候,如果服务器的响应速度太慢,用户有可能会多次点击提交按钮,而这可能导致那张信用卡上的金额被消费了多次.因此,重复提 ...

  4. ACM学习历程—UESTC 1218 Pick The Sticks(动态规划)(2015CCPC D)

    题目链接:http://acm.uestc.edu.cn/#/problem/show/1218 题目大意就是求n根木棒能不能放进一个容器里,乍一看像01背包,但是容器的两端可以溢出容器,只要两端的木 ...

  5. NOIp2018集训test-10-17 (bike day3)

    发现自己gradully get moodier and moodier了 负面情绪爆发地越来越频繁,根本out of control,莫名其妙地就像着了魔一样 为什么用英语大概是因为今天早上早自习因 ...

  6. Parallel Programming-使用CancellationTokenSource调度并行运行的Task

    本文主要介绍使用CancellationTokenSource调度并行运行的Task. 一.使用场景 有多个Task并行运行时,如果其中一个Task所运行的程序出现异常,我们想马上终止所有待执行的Ta ...

  7. Navicat生成数据库结构同步SQL

    作为一个苦逼的技术男,在做开发的时候经常会遇见程序版本升级,数据库结构变化.我们需要一个快捷的方式让客户尽快从旧版本数据库结构更新至新版本数据库结构.如果每做一次改动我们就记录一下当然是好事,但是万一 ...

  8. 添加一个用户并且让用户获得root权限

    1.创建一般用户: 完全参考默认值创建一个用户, 一般账号UID应该是500以后的. 默认会创建用户家目录和账号一模一样的群组名.创建使用账号且给予口令才算完成了用户的创建流程. useradd us ...

  9. MySQL on Azure高可用性设计 DRBD - Corosync - Pacemaker - CRM (二)

    在上一篇文章中描述了MySQL HA on Azured 设计思路,本篇文章中将描述具体的部署,每个组件的安装和配置. 整体的设计架构如下: 下面将是所有组件的安装配置过程,所有的虚拟机是CentOS ...

  10. JSP标签和EL表达式

    1.jsp标签: sun原生的,直接jsp使用 <jsp:include> -- 实现页面包含,动态包含 <jsp:include page="/index.jsp&quo ...