一,高斯消元法简介

将线性方程组写成矩阵的形式,通过两行交换或者某一行加另一行的k倍,构造上三角阵,跟据扩展矩阵秩的关系判断解的个数。

二,hpl标准(一个高性能计算的评测标准,可跳过)

HPL是针对现代并行计算机提出的测试方式,Linpack是国际上最流行的用于测试高性能计算机系统浮点性能的benchmark。HPL采用高斯消元法求解线性方程组。求解问题规模为N时,浮点运算次数为(2/3 * N^3-2*N^2)。因此,只要给出问题规模N,测得系统计算时间T,峰值=计算量(2/3 * N^3-2*N^2)/计算时间T,测试结果以浮点运算每秒(Flops)给出,衡量计算机性能的一个重要指标就是计算峰值或者浮点计算峰值。HPL测试结果是TOP500排名的重要依据。

三、秩与解的关系

四、高斯消元法思路

1,正向迭代,构造上三角阵,每次消除一列,如下

def gauss(matrix_a,matrix_b):if not np.all(matrix_b==0):augmented=np.concatenate([matrix_a,matrix_b],1)  # 拼接增广矩阵else:augmented=matrix_arow=augmented.shape[0]  # 行数col=augmented.shape[1]  # 列数for j in range(col):if j>=row:breakif augmented[j,j]==0:for t in range(j+1,row):if augmented[t,j] !=0:exchange2row(augmented[t,:], augmented[j,:])break# todo 如果除已处理的行,全为零怎么办?此时秩一定少于未知数个数if augmented[j, j] == 0:  # 检验交换是否成功,如果这一列全为零,跳过print("###第"+j+"列全零,无唯一解")breakfor i in range(j+1,row):if augmented[i,j]==0:continuemul=augmented[i,j]/augmented[j,j]  # 倍数augmented[i,:]=augmented[i,:]-mul*augmented[j,:]  # 转变成上三角阵judge(augmented)

2,若有唯一解,则反向迭代,构造单位阵

# 化简成行最简求解 回代 对角线元素不能为零 m为增广矩阵
def solve(m,rank):row = m.shape[0]  # 行数col = m.shape[1]  # 列数# 收集结果ans=[]for i in range(rank-1,-1,-1):m[i, :]=m[i,:]/m[i,i]  # 归一化ans.append(-m[i,col-1])for j in range(i-1,-1,-1):if m[j,i]==0:continuemul=m[j,i]/m[i,i]m[j,:]=m[j,:]-mul*m[i,:]print("归一化后的增广矩阵:n",m)print("唯一解为:n",ans[::-1])

五,并行思路

列的消除是有序的,第一个for循环不能并行;但是消除某一列数据时,每一行进行相同的操作,这一部分可以并行。

六,mpi并行代码(python)

mport numpy as np
from mpi4py import MPI# 交换矩阵两行 输入矩阵两行
def exchange2row(a,b):t=a.copy()a=bb=t# 判断是否有解
def judge(m):row = m.shape[0]  # 行数col = m.shape[1]  # 列数h=min(col,row)rank=0for i in range(h):if np.all(m[i,:]==0):  # 全零行后置for j in range(h-1,i,-1):if not np.all(m[j, :] == 0):exchange2row(m[i,:],m[j,:])rank+=1else:rank += 1print("矩阵的秩为:",rank)if m[rank-1,col-1]==0:  # rank_a = rank_abif rank==col-1:print("有唯一解")solve(m, rank)if rank<col-1:print("有无穷多解")else:if np.all(m[rank-1, 0:col-1] == 0):print("无解")elif rank==col-1:print("有唯一解")solve(m,rank)elif rank<col-1:print("有无穷多解")# 化简成行最简求解 回代 对角线元素不能为零 m为增广矩阵
def solve(m,rank):row = m.shape[0]  # 行数col = m.shape[1]  # 列数# 收集结果ans=[]for i in range(rank-1,-1,-1):m[i, :]=m[i,:]/m[i,i]  # 归一化ans.append(-m[i,col-1])for j in range(i-1,-1,-1):if m[j,i]==0:continuemul=m[j,i]/m[i,i]m[j,:]=m[j,:]-mul*m[i,:]print("归一化后的增广矩阵:n",m)print("唯一解为:n",ans[::-1])# 高斯消元法
def mpi_gauss(augmented):row=augmented.shape[0]  # 行数col=augmented.shape[1]  # 列数for j in range(col):if j>=row:breakif augmented[j,j]==0:print("主元为0,换行",j)for t in range(j+1,row):if augmented[t,j] !=0:exchange2row(augmented[t,:], augmented[j,:])break# todo 如果除已处理的行,全为零怎么办?此时秩一定少于未知数个数if augmented[j, j] == 0:  # 检验交换是否成功,如果这一列全为零,跳过print("###第"+j+"列全零,无唯一解")breakcomm.bcast(j, root=0)comm.bcast(augmented, root=0)for p in range(1,comm_size):data = comm.recv(source=p)length = n / (comm_size - 2)start = int((p - 1) * length)end = int(min(start + length, n))start1 = int(max(j + 1, start))for i in range(start1,end):augmented[i, :]=data[i,:]judge(augmented)# 生成指定规模问题
def pre_ques(n):np.random.seed(n)a=np.random.random(size=(n, n))b=np.random.random(size=(n, 1))print("测试数据a=n",a,"n测试数据b=n",b)return np.concatenate([a,b],1)# 初始化mpi
comm = MPI.COMM_WORLD
comm_rank = comm.Get_rank()
comm_size = comm.Get_size()n=4  # 指定问题规模
if comm_rank==0:data0 = pre_ques(n)  # 构建增广矩阵print("rank=", comm_rank,"size=",comm_size)mpi_gauss(data0)
else:print("rank=", comm_rank)col=0length=n/(comm_size-2)  # 0进程不处理,留一个进程处理余数start=int((comm_rank-1)*length)end=int(min(start+length,n))while col<n-1:# 获取当前处理列col = comm.bcast(None, root=0)data0 = comm.bcast(None, root=0)start=int(max(col+1,start))for i in range(start,end):mul = data0[i, col] / data0[col, col]  # 倍数data0[i, :] = data0[i, :] - mul * data0[col, :]  # 转变成上三角阵comm.send(data0, dest=0)

参考文献

shi先森:高斯消元法解线性方程组​zhuanlan.zhihu.com

刘梳子:麻省理工线性代数笔记(二)-高斯消元法​zhuanlan.zhihu.com

python实现高斯消元法求线性方程组的解_python_weixin_44410742的博客-CSDN博客​blog.csdn.net

高斯消元法线性方程组python_高斯消元法解线性方程组mpi并行相关推荐

  1. matlab sor解线性方程组,SOR算法解线性方程组的matlab程序

    编写用SOR 方法求解线性方程组Ax=B 的标准程序,并求下列方程组的解,并比较松弛因子取 1.0.1.25.1.5时所需迭代的次数. 可取初始向量 (0) (1,1,1) T =x ,迭 代终止条件 ...

  2. matlab算线性方程解,MATLAB计算方法3解线性方程组计算解法.pptx

    第三章线性方程组数值解法解线性方程组 §3.1 直接法一. Gauss 消去法设 有消 元: 用Matlab实现顺序Gauss消去法在Matlab程序编辑器中输入:function x=nagauss ...

  3. 科学计算机解多元方程组,南京大学计算机科学与技术系 数值计算方法(第3章)3 向量和矩阵的范数 病态方程组 解线性方程组的迭代法.ppt...

    南京大学计算机科学与技术系 数值计算方法(第3章)3 向量和矩阵的范数 病态方程组 解线性方程组的迭代法.ppt 上传人:ct****5 文档编号:43116102 上传时间:2020-01-21 格 ...

  4. 【算法竞赛模板】求解线性方程组是否有解(求解矩阵的秩)

        在实际运用中需判断线性方程组有无解,可以通过矩阵运算判断线性方程组是否有解 线性方程组有无解总结: 矩阵求解秩流程:   所以:当我们遇到题目问线性方程组是否有解时,只需求解系数矩阵的秩与增广 ...

  5. matlab用高斯消元法解线性方程组,用matlab利用高斯消元法求解线性方程组

    用matlab利用高斯消元法求解线性方程组Tag内容描述: 1.用C语言编写软件完成以下任务:请用高斯列主元消元法解下列线性方程组:方法说明(以4阶为例):第1步消元在增广矩阵(A,b)第一列中找到绝 ...

  6. 高斯消元法解线性方程组(C++实现)

    高斯消元法解线性方程组(C++实现) #include<cstdio> #include<iostream> using namespace std; void gaosi(d ...

  7. NOI数学之提高级:线性方程组的高斯消元法

    怎样用高斯消去法解线性方程组 https://jingyan.baidu.com/article/39810a23e40c80b636fda63a.html\ 高斯消元法解线性方程组 高斯消元法解线性 ...

  8. 直接法 matlab,解线性方程组直接方法matlab用法.doc

    解线性方程组直接方法matlab用法 在这章中我们要学习线性方程组的直接法,特别是适合用数学软件在计算机上求解的方法. 2.1 方程组的逆矩阵解法及其MATLAB程序 2.1.3 线性方程组有解的判定 ...

  9. matlab解线性方程组后结果是小数,MATLAB线性方程组求解

    有唯一解线性方程组求法 对于一般的,有唯一解的线性方程组,我们可以转换成矩阵的形式: A x = b Ax=bAx=b 则可以用矩阵运算求解x,即x=A\b 有无穷解的线性方程组求法 齐次线性方程组的 ...

最新文章

  1. 25个出众的Web表单范例
  2. ecshop 订单-》订单状态 2
  3. c++中queue用法
  4. [HAOI2006] 聪明的猴子
  5. 基于php的小区物业管理系统
  6. 什么!爬虫要违法了?别慌:守住规则,大胆去爬
  7. 期望收益率、方差、协方差、相关系数的计算公式
  8. 微信接口昵称在服务器乱码,微信网页开发获取用户昵称乱码 微信昵称包含emoji表情乱码的解决方案...
  9. Pr:导出设置之字幕
  10. Android学习之登陆界面设计(二)基本界面设计
  11. P02014250陈彦菁 信息论
  12. 蓝桥杯JAVA数列求和
  13. 性价比很高的三款ePUB阅读器(转载)
  14. VFP6.0运行exe文件后显示:程序错误 “不能存取文件”
  15. 处理png图片为透明
  16. 怎么用python编写程序计算标准差_python 标准差计算的实现(std)
  17. facsum (线性筛 积性函数)
  18. 鸿蒙系统笔记本电脑价格,鸿蒙系统笔记本电脑要来了?
  19. 证书不被信任解决方法
  20. 用贝塞尔曲线玩出来的花样简直不要太美

热门文章

  1. Articulate、iSpring与Snap!功能对比分析
  2. 云渲染技术在虚拟仿真应急培训中的应用
  3. 关于怎么将PDF文件转换成PPT格式的方法
  4. 字典序最大子序列java_字典序最大的子序列
  5. “Adobe Illustrator CS6 已停止工作”的问题
  6. EFR32修改开发板VCOM串口波特率的方法
  7. 杰理之VCOM按键复位【篇】
  8. 微信开发工具常用快捷键
  9. MySQL8.0.23 社区免费版安装配置教程
  10. asp .net mvc实现 富文本框