线性方程组求解(高斯消元法、LU三角分解法)
来源:互联网 发布:zdmcad辅助设计软件 编辑:程序博客网 时间:2024/05/22 06:19
一、实验内容
二、代码(python)
import numpy as np''' 列主元高斯消元法 A:系数增广矩阵 n:未知数个数'''def main_element_gauss(A,n): for i in range(0,n-1): if(np.max(A[i:,i])!=A[i,i]): #如果当前系数不是最大值,则列主元 temp_i=int(np.where(A==np.max(A[i:,i]))[0]) #temp_i为最大值所在的行索引 A[[i,temp_i],:]=A[[temp_i,i],:] #交换 for j in range(1,(n-i)): A[i+j,:]=A[i+j,:]-A[i,:]*(A[i+j,i]/A[i,i]) #消元 print("第%d次消元系数矩阵为:\n"%(i+1),A) #回代得解 X=np.zeros((n,1)) for i in range(n-1,-1,-1): temp=0 for j in range(0,n): temp+=A[i,j]*X[j,0] X[i,0]=(A[i,n]-temp)/A[i,i] print("方程组的解为:\n",X)''' LU三角分解法 A:系数增广矩阵'''def LU_break_down(A): #生成维度为(3,3)的矩阵,初值为0 L=np.zeros((3,3)) U=np.zeros((3,3)) #根据公式得到L和U的具体值 U[0,:]=A[0,:3] for i in range(3): L[i,i]=1.0 L[1,0]=A[1,0]/U[0,0] L[2,0]=A[2,0]/U[0,0] U[1,1]=A[1,1]-L[1,0]*U[0,1] U[1,2]=A[1,2]-L[1,0]*U[0,2] L[2,1]=(A[2,1]-L[2,0]*U[0,1])/U[1,1] U[2,2]=A[2,2]-(L[2,0]*U[0,2]+L[2,1]*U[1,2]) print("L为:\n",L) print("U为:\n",U) #将b添加到L,使之变为增广矩阵 L=np.hstack((L,A[:,3].reshape(3,1))) #回代得解 Y=np.zeros((3,1)) for i in range(0,3): temp=0 for j in range(0,3): temp+=L[i,j]*Y[j,0] Y[i,0]=(L[i,3]-temp)/L[i,i] #将Y添加到U,使之变为增广矩阵 U=np.hstack((U,Y)) #回代得解 X=np.zeros((3,1)) for i in range(2,-1,-1): temp=0 for j in range(0,3): temp+=U[i,j]*X[j,0] X[i,0]=(U[i,3]-temp)/U[i,i] print("方程组的解为:\n",X)def main(): #输入 n=int(input("请输入未知数个数:")) temp=[] print("请输入系数的增广矩阵:\n") for i in range(n): temp.append([float(i) for i in input().split()]) A=np.array(temp).reshape(n,n+1) #只有n=3时,有两种方法。因为LU没有支持除3元以外的解法 if(n==3): #菜单选择 print("解方程组方法:\n\t1.列主元高斯消元法\n\t2.LU三角分解法") choice=int(input("请选择一种:")) if(choice==1): main_element_gauss(A,n) else: LU_break_down(A) else: main_element_gauss(A,n)if __name__=='__main__': main()
三、实验结果
- (方程组一)列主元高斯消元法:
- (方程组一)LU三角分解法:
- (方程组二)列主元高斯消元法:
- (方程组二)LU三角分解法:
- (拓展)未知数为4时:
四、感悟
- 对于高斯消元法、列主元高斯消元法、LU三角分解法有了更深的认识。
- 对于高斯消元法我实现了通用的算法实现,但是对于LU三角分解法,由于算法实现难度太高,因此我并未能完成LU三角分解法的通用实现,而只实现了3元的解法,有些可惜。
- 对于python的更深层次的理解,尤其是在切片的运用以及切片的浅拷贝还有深拷贝,最后意外学会了如何合并矩阵,运用np.hstack()和np.vstack()可实现水平和竖直方向的合并,很满足。
- 将课堂是将的理论内容用代码实现,实在有一种数不出的欣喜。
阅读全文
0 0
- 线性方程组求解(高斯消元法、LU三角分解法)
- LU分解法求解线性方程组
- LU分解法解线性方程组(C语言)
- 求解线性方程组--Doolittle分解法
- 求解线性方程组--Cholesky分解法
- 计算方法:矩阵三角分解法解线性方程组
- 求解线性方程组(SVD,QR,Gauss,LU)
- Gauss消去,LU分解法,追赶法解线性方程组
- 杜利特尔分解法Doolittle(LU分解法)_解线性方程组的直接解法
- 紧凑存储的杜利特尔分解法Doolittle(LU分解法)_解线性方程组的直接解法
- 求解线性方程组之LU分解
- 矩阵的LU分解求解线性方程组(C++实现)
- 数值计算-线性方程组求解(1)-LU分解-MATLAB实现
- 矩阵的 LU 分解法(LU decomposition)
- 选主元doolittle分解法求解n元线性方程组 MATLAB实现
- 矩阵的三角分解法之LU分解之Crout分解
- 矩阵的三角分解法之LU分解之Doolittle分解
- 矩阵求逆(基于LU分解法)
- 函数的连续性
- hadoop汇总
- 华为软件测试面试题
- 笔记-劳动法理解
- 171218 逆向-TPCTF(re200)
- 线性方程组求解(高斯消元法、LU三角分解法)
- PHP-5.6.30源码编译安装
- RPC框架中服务的注册与发现
- [u3d笔记] animator 播放动画
- 2017 浙工业院赛预赛 E 小米买东西【二分+贪心】
- angularJs(五)--指令(一)
- STL-lesson001_1_模板实现Array类
- 比特币源码分析
- JavaEE的13种核心技术简介