【计算方法】实验二:python实现高斯消去、列主元高斯消去,LU分解分别求解线性方程组
文章目录
- 题目
- 方法一:高斯消去法
- 结果截图
- 方法二:列主元素高斯消元法
- 结果截图
- 方法三:LU分解
- 结果截图
- 结果总结
题目
实现高斯消去、列主元高斯消去,LU分解分别求解线性方程组
方法一:高斯消去法
消去过程:
l i k = a i k ( k − 1 ) / a k k ( k − 1 ) ( i = k + 1 , k + 2 , . . . , n ) l_{ik} = a_{ik}^{(k-1)}/a_{kk}^{(k-1)} (i=k+1,k+2,...,n) lik=aik(k−1)/akk(k−1)(i=k+1,k+2,...,n)
a i j ( k ) = a i j ( k − 1 ) − l i k a j k ( k − 1 ) ( i , j = k + 1 , k + 2 , . . . , n ) a_{ij}^{(k)} = a_{ij}^{(k-1)}-l_{ik}a_{jk}^{(k-1)}(i,j=k+1,k+2,...,n) aij(k)=aij(k−1)−likajk(k−1)(i,j=k+1,k+2,...,n)
b i ( k ) = b i ( k − 1 ) − l i k b k ( k − 1 ) ( i = k + 1 , k + 2 , . . . , n ) b_{i}^{(k)} = b_{i}^{(k-1)}-l_{ik}b_{k}^{(k-1)}(i=k+1,k+2,...,n) bi(k)=bi(k−1)−likbk(k−1)(i=k+1,k+2,...,n)
回代过程:
x n = b n ( n − 1 ) / a n n ( n − 1 ) x_{n}= b_{n}^{(n-1)}/a_{nn}^{(n-1)} xn=bn(n−1)/ann(n−1)
x k = ( b k ( k − 1 ) − ∑ j = k + 1 n a k j ( k − 1 ) x j ) / a k k ( k − 1 ) x_{k}= (b_{k}^{(k-1)}-\sum_{j=k+1}^{n}a_{kj}^{(k-1)}x_j )/a_{kk}^{(k-1)} xk=(bk(k−1)−j=k+1∑nakj(k−1)xj)/akk(k−1)
在消元法第k次迭代时,首先 ,寻找第k列中从k到n处的绝对值最大的一个,然后互换该行和第k行的所有位置。 然后再消元。这样的好处是能控制舍入误差的扩大和传播。 基本算法如下:
import numpy as np
A = np.array([[10,-7,0,1],[-3, 2.099999,6,2 ],[5,-1,5,-1],[2,1,0,2]])
b = np.array([[8],[5.900001],[5],[1]])
def guass(A,b):n = b.shape[0]A=A.astype('float')b=b.astype('float')#消元for k in range(n-1): #k第一层循环,第(0~n-1)行
# print('第',k+1,'次的初值')
# print(A)
# print(b)for i in range(k+1,n): #i第二层循环,第(k+1,n)行mik = A[i,k]/A[k,k]for j in range(k+1,n): A[i,j] = A[i,j] - mik*A[k,j]b[i] = b[i] - mik*b[k]
# print('第',k+1,'次消元后的值')
# print(A)
# print(b)#回代solution = np.zeros(n)solution[n-1] = b[n-1]/A[n-1,n-1] #改为n-1for i in range(n-2,-1,-1):for j in range(i+1,n):solution[i] = solution[i] + A[i,j]*solution[j]solution[i] = (b[i] - solution[i])/A[i,i]return solutionguass(A,b)
结果截图
方法二:列主元素高斯消元法
def guass_zhuyuan(A,b):n = b.shape[0]A=A.astype('float')b=b.astype('float')#寻找列主元素for k in range(n-1): #k第一层循环,第(0~n-2)行
# print('第',k+1,'次的初值')
# print(A)
# print(b)arr = abs(A[k:n,k]) #每一列最大值的数组value = max(arr) #最大值position = np.argmax(arr) #最大值索引#print(position)if position != 0:
# A[k,k:n-1],A[position+k,k:n-1] = A[position+k,k:n-1],A[k,k:n-1]
# b[k],b[position+k] = b[position+k],b[k]A[[k,position+k],k:n] = A[[position+k,k],k:n]b[[k,position+k],:] = b[[position+k,k],:]
# print('第',k+1,'次交换后的值')
# print(A)
# print(b)#消元for i in range(k+1,n): #i第二层循环,第(k+1,n-1)行mik = A[i,k]/A[k,k]for j in range(k+1,n): #j从k开始循环,不是k+1A[i,j] -= mik*A[k,j]b[i] = b[i] - mik*b[k]
# print('第',k+1,'次消元后的值')
# print(A)
# print(b)#回代solution = np.zeros(n)solution[n-1] = b[n-1]/A[n-1,n-1] #改为n-1for i in range(n-2,-1,-1):for j in range(i+1,n):solution[i] = solution[i] + A[i,j]*solution[j]solution[i] = (b[i] - solution[i])/A[i,i]return solution
结果截图
方法三:LU分解
def LUfenjie(A,b):n = b.shape[0]A = A.astype('float')b = b.astype('float')U = np.zeros(A.shape)L = np.zeros(A.shape)U[0,:] = A[0,:] #U的第一行元素和A的第一行元素相等L[1:n,0] = A[1:n,0]/U[0,0] #L的每一行的第一列元素和U第一个元素相乘=A的对应元素#分解#U为上三角元素 k=1~n-1行 j=k~n-1列 r=0~k-2行 i=k+1~n-1行
# for k in range(1,n):
# for j in range(k,n):
# U[k,j] = A[k,j] - L[k,0:k-1] * U[0:k-1,j]
# for i in range(k+1,n):
# L[i,k] = (A[i,k]-L[i,0:k-1] * U[0:k-1,k])/U[k,k]#分解#U为上三角元素 k=1~n-1行 j=k~n-1列 r=0~k-2行 i=k+1~n-1行for k in range(1,n): for j in range(k,n):delta = 0for r in range(0,k):delta += L[k,r] * U[r,j]U[k,j] = A[k,j] - deltafor i in range(k+1,n):theta = 0for r in range(0,k):theta += L[i,r] * U[r,k]L[i,k] = (A[i,k] - theta)/U[k,k]#求解yy = np.zeros(b.shape[0])#忘了初始化……y[0] = b[0]for i in range(1,n):alpha = 0for j in range(0,i):alpha += L[i,j]*y[j].Ty[i] = b[i] - alpha#求解xx = np.zeros(b.shape[0])x[n-1] = y[n-1]/U[n-1,n-1]for i in range(n-2,-1,-1):gama = 0 for j in range(i+1,n):gama += U[i,j]*x[j].Tx[i] = (y[i] - gama )/U[i,i]return (x)
结果截图
结果总结
方法 | 结果 |
---|---|
高斯迭代法 | [-6.03391825e-10, -1.00000000e+00, 1.00000000e+00, 1.00000000e+00] |
列主元素高斯 | [ 2.66453526e-16, -1.00000000e+00, 1.00000000e+00, 1.00000000e+00] |
LU分解 | [-6.03391825e-10, -1.00000000e+00, 1.00000000e+00, 1.00000000e+00] |
【计算方法】实验二:python实现高斯消去、列主元高斯消去,LU分解分别求解线性方程组相关推荐
- python语言基础实验_实验二Python语言基础函数包练习.doc
实验二Python语言基础函数包练习 实验 Python语言基础函数包练习:1208 学号: 实验目的 1.Python语言包,如math.NumPySciPy和Matplotlib等函数包的使用实验 ...
- 实验二 Python流程控制
一.实验目的 1.掌握分支条件语句的使用. 2.掌握分支嵌套语句的使用. 3. 掌握for.while循环语句及break,continue的使用 4. 掌握带else字句的循环语句的使用 5. 掌握 ...
- 实验二.Python 运算符与内置函数
一.实验目的 1.熟练运用python运算符: 2.熟练运用Python内置函数. 二.实验环境 多媒体计算机 Windows 操作系统 Python3.7 三.实验内容及要求 (一).编写程 ...
- 合肥工业大学宣城校区计算方法 实验二
1实验目的和要求 实验目的: (1)熟悉复化梯形方法.复化Simpson方法.梯形递推算法.龙贝格算法: (2)能编程实现复化梯形方法.复化Simpson方法.梯形递推算法.龙贝格算法: (3)理解并 ...
- 高斯-赛德尔(Gauss-Seidel)迭代法求解线性方程组matlab程序设计
算法步骤 例题 程序代码 function x=GaussSeidel(A,b,x0,eps,N) n=length(b); if nargin<5N=500; end if nargin< ...
- [笔记]搜索引擎-实验报告-实验二
实验目的 掌握文本处理和分析的内容: 掌握文本预处理的基本技术 掌握倒排文档的实现 掌握向量空间模型的实现 掌握文本分类模型的实现 链接分析的内容: 掌握 PageRank 算法的原理和实现 实验步骤 ...
- 用列主元高斯(Gauss)消元法求n阶线性方程组的解(python)
(一)目的 通过设计.编制.调试2~3个求n阶线性方程组数值解的程序,加深对其数值计算方法及有关的基础理论知识的理解. (二)要求 用编程语言实现用高斯(Gauss)消元法求n阶线性方程组的解.用列主 ...
- 高斯消去、列主元消去、Lu分解、追赶法(matlab)
文章目录 一.高斯消去法 二.高斯列主元消去法 三.Lu分解 四.追赶法 一.高斯消去法 比如对与上面的这个方程组,用消去法解方程组的基本思想是用逐次消 去未知数的方法把原方程组 Ax = b 化为与 ...
- 实验二:用python实现SVM支持向量机并对鸢尾花数据集分类
实验二:SVM支持向量机 1. 实验内容: (1)用你熟知的语言(尽量使用python)实现支持向量机的算法,并在给定的数据集上训练. (2)在测试集上用训练好的支持向量机进行测试,并将预测结果以cs ...
最新文章
- 为什么 JavaScript 的私有属性使用 # 符号
- 追番必备,动漫角色也可以用人脸识别了
- 科学解释超级计算机,超级计算机:彻底“改变”科学
- qt 在移动的两点之间连线_几种移动端跨平台技术区别
- [转]autoid文件上传
- 剑指Offer_编程题_22
- MongoDB创建索引
- OpenGL RGTC Compressor压缩实例
- 【批处理】shift用法举例
- HDU 3449 Consumer
- Qt翻译文件(.ts)的使用
- python获取淘宝服务器时间的代码
- vnc-4.0-winsrc版本之winvnc工程分析_源码研究
- 安装mysql驱动报错_java.sql.SQLException: org.gjt.mm.mysql.Driver 报错【解决办法】
- 中文标点符号unicode码
- /proc/sysrq-trigger说明
- MDF和DHF、DMR、DHR三者差异?注册与备案文件?
- 罚单不断,长文揭秘第三方支付!
- 黑客是如何攻破一个网站的?
- torchtext使用-- 单标签多分类任务TREC
热门文章
- Hank的无线802.11学习笔记--part 3
- 量子力学的诡异现象—朱清时教授
- 【数据分析】指标体系
- ubuntu18.04使用xrdp远程连接
- 没有要使用本计算机 用户必须输入密码,要使用本计算机,用户必须输入用户名和密码选项不见了怎么办...
- Pandas中describe()函数
- 迄今为止最全的技术文档汇总,编程语言,操作系统,数据结构,设计模式等赶紧收藏起来。
- 【工作向】docker镜像构建方法与命令
- 简单的python画图小实例
- 云知声AI开放平台之语音合成技术:让AI人工智能照亮智慧生活