初等变换:通过初等行(列同理)变换把增广矩阵变为简化阶梯型矩阵线性方程组求解算法

  •   具体步骤:
  1. 枚举每一列,找到枚举的当前列绝对值最大数的所在行
  2. 将该行换到最上面一行(第r行)
  3. 将该行第一个数(该行第c列元素)消成1
  4. 将该行第一个元素(该行第c列元素)下面的所有非零元素消成0
  5. 重复上面的操作,直到枚举到最后一列,把矩阵消成简化阶梯型矩阵

目录

1.初等变换基本操作

2.具体函数实现

枚举每一列

找到枚举当前列绝对值最大的数的所在行 (ps:fabs函数:求绝对值函数)

将绝对值最大的所在行换到最上面一行(第r行)

将该行第一个数消成1

将该行第一个元素(该行第c列元素)下面的所有非零元素消成0

整体代码


1.初等变换基本操作

       复习:

  • 用一个非零的数乘某一行
  • 把其中一行的若干倍加到另一行上
  • 交换两行的位置

在函数实现的时候无形之中会用到如上的三条操作,以下就不再证明。

2.具体函数实现

枚举每一列

for (c = 0, r = 0; c < n; c++)

找到枚举当前列绝对值最大的数的所在行 (ps:fabs函数:求绝对值函数)

int t = r;for (int i = r + 1; i < n; i++)if (fabs(a[t][c]) < fabs(a[i][c]))t = i;

如果该列全为0,continue直接让c++(跳过这一列,开始处理下一列)

ps:由于浮点数加减乘除时候会有精度问题,所以这里认定:如果浮点数 < eps(eps是一个很小的数,其值为1e-6),就认为该浮点数的值为0

< eps 代表 == 0 ,> eps 代表 非零

if (fabs(a[t][c]) < eps) continue;

将绝对值最大的所在行换到最上面一行(第r行)

for (int i = c; i <= n; i++)  swap(a[t][i], a[r][i]);

将该行第一个数消成1

注意:这里需要倒着消,最后在处理第一个数 (如果先处理第一个数,后面的数就都是除1)

for (int i = n; i >= c; i--)    a[r][i] /= a[r][c];

将该行第一个元素(该行第c列元素)下面的所有非零元素消成0

for (int i = r + 1; i < n; i++)if (fabs(a[i][c]) > eps) // 保证消的都是非零元素for (int j = n; j >= c; j--)a[i][j] -= a[i][c] * a[r][j];

最后让r++,代表这一行已经处理完了,不再参与后面的运算(非常重要)

r++;

进行完如上操作之后,该矩阵就变成了阶梯型矩阵(共有如下几种情况)

1.完美的阶梯型矩阵

例如:

最右侧一列为常数列

由最后一行可以直接得出x3 == 1

将x3往上代入就可以依次求解出x2和x1

可以将向上代入得过程等价于把矩阵化成简化阶梯型矩阵(类对角形矩阵)

 此时常数列的值对应的就是x1 x2 x3的值(如图 x1 == 3 ,x2 == 1, x3 == 1)

for (int i = n - 1; i >= 0; i--)for (int j = i + 1; j < n; j++)a[i][n] -= a[i][j] * a[j][n];

此处代码非常抽象,下面用图解的方法帮助理解

从下往上消,将阶梯型矩阵消成简化阶梯型矩阵(类对角型矩阵)

由于x3的系数是1,所以1上面的2(a[i][j])就是要乘的倍数

a[i][n] -= a[i][j] * a[j][n]

以此类推

2.不完美的阶梯型矩阵

x的取值一共有两种情况:0或非0

在讨论之前先了解一个概念:

方程个数 < 未知数的个数   -> 此方程有无穷多组解

方程个数 = 未知数的个数   -> 此方程有唯一解

矩阵化简得过程出现了等式左右不相等的情况 -> 此方程无解

若x == 0 ,最后一行相当于是一个恒等式0 == 0 ,此时方程个数 < 未知数的个数,方程有无穷多组解

若x != 0, 最后一行出现了等式左右不相等的情况,此方程无解

if (r < n)//不完美的阶梯型矩阵{for (int i = r; i < n; i++)if (fabs(a[i][n]) > eps)return 2; // 无解return 1; // 无穷多组解}
//r == n 的情况  往上代入把矩阵化为简化阶梯型矩阵for (int i = n - 1; i >= 0; i--)for (int j = i + 1; j < n; j++)a[i][n] -= a[i][j] * a[j][n];return 0;//唯一解

返回2代表无解,返回1代表无穷多组解,返回0代表唯一解

整体代码

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 110;
double a[N][N];
int n;
const double eps = 1e-6;
int gauss()
{int c, r;for (c = 0, r = 0; c < n; c++){int t = r;for (int i = r + 1; i < n; i++)if (fabs(a[t][c]) < fabs(a[i][c]))t = i;if (fabs(a[t][c]) < eps) continue;for (int i = c; i <= n; i++)   swap(a[t][i], a[r][i]);for (int i = n; i >= c; i--)    a[r][i] /= a[r][c];for (int i = r + 1; i < n; i++)if (fabs(a[i][c]) > eps)for (int j = n; j >= c; j--)a[i][j] -= a[i][c] * a[r][j];r++;}if (r < n){for (int i = r; i < n; i++)if (fabs(a[i][n]) > eps)return 2; // 无解return 1; // 无穷多组解}for (int i = n - 1; i >= 0; i--)for (int j = i + 1; j < n; j++)a[i][n] -= a[i][j] * a[j][n];return 0;
}
int main()
{cin >> n;for (int i = 0; i < n; i++)for (int j = 0; j < n + 1; j++)cin >> a[i][j];int t = gauss();if (t == 0){for (int i = 0; i < n; i++){if (fabs(a[i][n]) < eps) a[i][n] = 0;printf("%.2lf\n", a[i][n]);}}else if (t == 1) puts("Infinite group solutions"); // 无穷多组解else puts("No solution");//无解return 0;
}

示例:

结果x1 == 1,x2 == -2,x3 == 3

初等变换法求解线性方程组相关推荐

  1. matlab逆矩阵/初等变换法求解线性方程组

    线性方程组是线性代数学课的考虑范畴,会使用matlab解决,可以效率更快.matlab种逆矩阵是左除和右除.初等变换法就是一个rref函数 逆矩阵 两种格式熟记即可 X=A\B % 表示求解矩阵方程A ...

  2. 牛顿-拉普森法求解线性方程组原理及matlab程序

    牛顿-拉普森法求解线性方程组原理及matlab程序 牛顿-拉普森法原理 Nowton-Raphson方法matlab程序? 牛顿-拉普森法原理   在多变量微积分和矩阵理论的交叉点是求解非线性代数方程 ...

  3. Gauss-Jordan消去法中完全选主元法求解线性方程组

    Gauss-Jordan消去法中完全选主元法求解线性方程组 分类: 数值分析 2007-12-01 09:50 1245人阅读 评论(0) 收藏 举报 outputmatrix算法stringclas ...

  4. 初等变换法求解λ矩阵的不变因子

    初等变换法求解λ矩阵的不变因子 当然也可以用行列式因子法求解

  5. 部分主元法求解线性方程组

    !//---------------原方程------------- !// x + y + z + w = 10 !// 2x + 3y + z + w = 15 !// 3x - y + 2z - ...

  6. 分别用雅可比(Jacobi)迭代法和高斯—塞德尔(Gauss—Seidel)迭代法求解线性方程组(转载)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yyywww666/article/details/42805071 算法介绍(迭代法介绍): 代码C ...

  7. 分别用雅可比(Jacobi)迭代法和高斯—塞德尔(Gauss—Seidel)迭代法求解线性方程组

    算法介绍(迭代法介绍): 代码C语言实现; # include<stdio.h> # include<math.h> # define N 6 /* *使用雅可比迭代法和高斯- ...

  8. 共轭梯度法求解线性方程组Ax=b(附代码)

    共轭梯度法求解线性方程组:Ax=b 数值分析老师给的作业,写出来代码平时分满分.简单勿喷,hhhh 原理 CG求解线性方程组的原理大家翻一翻数值分析的课本即可,此处不哔哔直接上matlab代码 代码 ...

  9. 迭代法求解线性方程组的收敛问题总结

    本讲之前,先将高斯-赛德尔迭代法和雅克比迭代法以及迭代法求解线性方程组贴出来,毕竟收敛问题研究的是迭代方法的收敛问题. 进入主题: 判断迭代法收敛的办法: 1.首先根据方程组的系数矩阵A的特点判断: ...

最新文章

  1. Finding the Edges (Sobel Operator)
  2. Google发布用于Google Cloud的.Net API
  3. PS网页设计教程XXIX——如何在PS中设计一个画廊布局
  4. 面试又栽在JVM调优上了!
  5. 如何在winform或者wpf里面打开浏览器并设置宽高位置
  6. 5G 时代,AI 如何破竹而出? | AI ProCon
  7. GO语言学习之路14
  8. mysql中show status介绍一
  9. pytorch RuntimeError: expected scalar type Double but found Float
  10. WordPress使用360CDN替换google服务,解决WordPress打开速度变慢问题
  11. 证明神经网络的通用逼近定理_在您理解通用逼近定理之前,您不会理解神经网络。...
  12. “华硕zx50j,键盘背光灯无法显示,fn组合键不可用”解决办法
  13. onvif开发踩坑【二】鉴权失败
  14. 苹果6怎样分屏_皮皮喵聚合搜索漫画APP苹果版IOS付费版更新 0.3.6,已购账号快来更新,分享一下,兑换码大赠送活动,共享喜悦!...
  15. 证书服务器搭建与邮件签名加密
  16. 在OCI中为计算实例添加第二块网卡
  17. android 组件透明,万能小组件透明小组件-万能小组件透明背景设置v1.0.0 安卓版_永辉资源网...
  18. python 使用豆瓣镜像下载安装工具包
  19. 物理学转行?读了四年物理学,优势在哪里?
  20. 今天才发现,手机外放声音小,这样设置一下,轻松增大手机音量

热门文章

  1. kubectl源码分析之cordon and uncordon
  2. Cadence教程1——ncsu-cdk安装
  3. 【python】python matplotlib绘制并保存多张图片+绘制多张子图
  4. MongoDB4.0 配置文件
  5. NUC977 烧录uboot到 SPI flash
  6. vue 项目 想修改代码严格模式 lintOnSave
  7. 推荐系统中的pointwise和pairwise区别
  8. 学习python需要什么?
  9. 设计模式是不是一件脱裤子放屁的事
  10. Unity 安卓 apk 反编译 重新打包 签名修改