只要一杯秋天的奶茶,就能学会Python数值分析(2)

上节(https://www.jianshu.com/p/671a94ce586b)说到高斯消元法,今天从高斯列主元消元法开始,拓展到线性方程组的两种迭代方法:雅可比迭代法和高斯-赛德尔迭代法。同样,能力有限,希望读者指出我的问题,用代码和公式和我深入交流。

2.列主元消去法

参考的教材是《数值分析》(李庆扬等)的第148页到151页。

列主元消去法是使用于主元为0或很小的情况,思路是选取这一列中绝对值最大的值所在的行与当前行进行替换,具体可以参考教材。再写代码方面,有了第一节的东西,写列主元消去法就很简单了,只要在高斯消去法之前加上换行就行。代码如下:

def pivotTriangularMatrix(matA):

'''

先找主元,找到后跟高斯顺序消元操作一样

'''

numRows = matA.shape[0]

for row in np.arange(0,numRows-1):

Index = np.argmax(abs(matA[:,row]))

matA[[row,Index],:] = matA[[Index,row],:] # 交换。也可以用np.copy来做交换

# 交换行结束,开始消元

for k in range(row+1,numRows): # 在第row行的情况下,遍历剩下的行

if matA[k,row] != 0:

#第k(k小于row)行的新值等于该行减去第row行的值乘于一个系数。这个系数存在目的就是消元

matA[k,:]=matA[k,:]-(matA[k,row]/matA[row,row])*matA[row,:]

return matA # 此时输入的矩阵也被改变

用教材148页的例题4来测试一下这个代码。

test_mat3 = np.array([[0.001,2.0,3.0,1.0],[-1.0,3.712,4.623,2.0],[-2.0,1.072,5.643,3.0]],dtype=float)

result = Gauss_solve(pivotTriangularMatrix(test_mat3)) # Gauss_solve函数是上一节的函数

# 得出结果

result = array([[-0.49039646],

[-0.05103518],

[ 0.36752025]])

得出的结果和书中给出的答案是吻合的。暂时没有找其它算例测试。

3.今日加餐

今天舍友问我下面这个代码。刚好今天没去旁听。主要问这里面提到的独特的索引方式是什么。其实就是一组布尔值。这里举个例子,具体解释在代码里面。

i,n = 1,3

idx1 = np.arange(i,n+i)

'''

假设i=1,n=3

idx1 = array([1, 2, 3])

'''

idx1>n-1

'''

输出为 array([False, False, True]),这样就拿到了True所在的索引2

那么idx1[idx1>n-1]在这里就相当于idx1[2],这个值等于3

'''

# 举例

test_mat1 = np.array([[2,0,6],[1,4,3],[3,2,1]],dtype=float)

test_mat[idx0,idx1]

'''

测试矩阵为:

test_mat1 = array([[2., 0., 6.],

[1., 4., 3.],

[3., 2., 1.]])

输出值为 array([0., 3., 3.]) 。实现了上图中取斜对角的操作

'''

二、线性方程组的迭代求解法

1.雅可比迭代法

该处参考的是《数值分析》(李庆扬等)第6章的6.1.1和6.2.1。书上关于雅可比迭代的内容有更多细节。这里我按照我对Gradient Descent的理解来编写该处代码。

这是一个迭代的计算方法,从我的理解来看,这类方法与线性方程组直接求解法有2个较大区别:1.对于解,会有一个初始值,会从这个初始值开始按照迭代公式运算下去。2.迭代法都要有迭代结束条件,要么是迭代解与真实解之间的差小于人为设定的一个阈值,要么是达到人为设定的最大迭代次数。

以下是我的代码,参考的是《数值分析》(李庆扬等)188页2.3这个公式,这个公式是一个展开的公式,我代码里写成矩阵运算的形式,这样可以减少使用for循环。

def Jocobi(A,b,initial,delta,maxTimes):

'''

输入:A是系数矩阵,N阶方阵

b是N*1列向量

initial是解的初始值,N*1大小

delta是人为设置的一个阈值,指到后期两次迭代之间解之间的差距已经很小了,用作迭代结束条件

maxTimes指人为设定的最大迭代次数

教材6.2.1将矩阵A分解成D,L,U,这里与之对应

输出:迭代后的解析解

'''

D = np.diag(np.diag(A)) # 获得D矩阵

L = np.tril(A,-1) # 获得L矩阵

U = np.triu(A,1) # 获得U矩阵

d = np.linalg.inv(D) # 对D矩阵求逆

G = -np.dot(d,L+U) # D的逆矩阵乘于(L+U)矩阵

f = np.dot(d,b) # D的逆矩阵b向量

X = np.dot(G,initial)+f # 初次的解

for i in range(maxTimes):

if np.linalg.norm(X - initial) > delta:

initial = X

X = np.dot(G,initial) + f

return X

利用第180页的例题1来对这个函数进行验证。解的初始值设为0解。

import numpy as np

A = np.array([[8,-3,2],[4,11,-1],[6,3,12]],dtype=float)

b = np.array([[20],[33],[36]],dtype=float)

initial = np.zeros((3,1))

'''

A = array([[ 8., -3., 2.],

[ 4., 11., -1.],

[ 6., 3., 12.]])

b = array([[20.],

[33.],

[36.]])

initial = array([[0.],

[0.],

[0.]])

'''

# 迭代求解

X = Jocobi(A,b,initial,0.001,10)

'''

X = array([[3.00028157],

[1.99991182],

[0.99974048]])

'''

进过10次迭代后解出的结果与书上181页的结果一致。

2.高斯-赛德尔迭代法

有了雅可比迭代的代码,写高斯赛德尔迭代代码就非常简单,你可能会惊讶,这两个代码怎么是一样的。看下图可以看到这两的区别。参考教材的6.2.2节。

以下是我的代码:

def Seidel(A,b,initial,delta,maxTimes):

'''

输入:A是系数矩阵,N阶方阵

b是N*1列向量

initial是解的初始值,N*1大小

delta是人为设置的一个阈值,指到后期两次迭代之间解之间的差距已经很小了,用作迭代结束条件

maxTimes指人为设定的最大迭代次数

教材6.2.1将矩阵A分解成D,L,U,这里与之对应

输出:迭代后的解析解

'''

# 先分解

D = np.diag(np.diag(A))

L = np.tril(A,-1)

U = np.triu(A,1)

d = np.linalg.inv( D + L ) # 这里是和雅克比不同的地方

G = -np.dot(d,U)

f = np.dot(d,b)

X = np.dot( G ,initial ) + f

for i in range(maxTimes):

if np.linalg.norm( X - initial ) > delta:

initial = X

X = np.dot( G,initial )+f

return X

同样用前面雅可比的算例来测试一下。

X = Seidel(A,b,initial,0.0001,10)

'''

X = array([[3.00000201],

[1.9999987 ],

[0.99999932]])

'''

同样的例题,在同样迭代10次的情况下,与前面雅可比迭代的结果有一点点偏差,但这都在正常范围之内。与书上的结果基本吻合。

今日小结

今天可太忙了,从早到晚。时间全靠课间挤,关于迭代法也没有考虑收敛条件的问题。这个系列对我来说还挺好玩,打算有始有终做下去。原来,写东西(还不用负责)这件事情能这么快乐。

今晚毕,明天继续。。。。。

python数值分析算例_只要一杯秋天的奶茶,就能学会Python数值分析(2)相关推荐

  1. python怎么算反三角函数_用Python计算三角函数之atan()方法的使用

    Python 这篇文章主要介绍了python中使用xlrd.xlwt操作excel表格详解,python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写exce ...

  2. 青少年编程python一级真题_青少年编程能力等级测评试卷二及答案 Python编程(一级)...

    青少年编程能力等级测评试卷 Python编程(一级) (考试时间90分钟,满分100分) 一.单项选择题(共20题,每题2.5分,共50分) 1. 运行下方代码段,输出是6,则输入的可能是( C ). ...

  3. python可以修图吗_会照片处理的不只是ps,还有Python!

    女朋友老是吵着要修图,作为程序员,只会敲代码,不会ps啊,真是令人头大. 程序员是这么容易被难到的吗?肯定不会!最近发现了程序员的p图神器--python. python也可以修图吗?是滴!下面就带你 ...

  4. python大型项目经验_经验丰富程序员才知道的8种高级Python技巧

    全文共2330字,预计学习时长11分钟 图源:unsplash 本文将介绍8个简洁的Python技巧,若非经验十足的程序员,你肯定有些从未见过.向着更简洁更高效,出发吧! 1.通过多个键值将对象进行排 ...

  5. 调用python接口并画图_【PySpark源码解析】教你用Python调用高效Scala接口

    点击 机器学习算法与Python学习 ,选择加星标 精彩内容不迷路 机器之心专栏 作者:汇量科技-陈绪 众所周知,Spark 框架主要是由 Scala 语言实现,同时也包含少量 Java 代码.Spa ...

  6. python dict批量选择_这一定是你见过最全面的python重点

    由于总结了太多的东西,所以篇幅有点长,这也是我"缝缝补补"总结了好久的东西. Py2 VS Py3 print成为了函数,python2是关键字 不再有unicode对象,默认st ...

  7. python批量检索文献_快解锁新姿势,教你如何用Python搞定文献搜索和科研图片!...

    相比实验论文,发表SCI应该更让科研狗们重视和焦虑. 起初看到读博的同学发表SCI论文,心里面就已经酸了,后来「本科生发数篇 SCI」的新闻屡见不鲜,现在甚至连小学生都跑出来分一杯羹-- 前段时间,B ...

  8. 打地鼠c语言代码_女白领在家玩打地鼠游戏,无意间学会python编程,还有教程有源码...

    玩打地鼠的游戏,因为有BUG,需要优化,于是无意间竟然学到了很多python的基础内容. 女白领说:在家玩了一个用python做的打地鼠小游戏,本来也不知道是python,因为不懂编程,只是因为这个打 ...

  9. python画爱心原理_程序员式优雅表白,教你用python代码画爱心

    还能用python代码画爱心?还有这种操作?这是什么原理? 不相信python代码可以画爱心?先来一张效果图来看看效果吧!PyCharm pro Mac-PyCharm pro for Mac( Py ...

最新文章

  1. log4j2配置实例[按小时记录日志文件]
  2. Flash存储控制器组成!(flash)
  3. C++语法细节注意集锦
  4. 【人脸对齐-Landmarks】人脸对齐算法常用评价标准
  5. JS:1.3,函数(function)
  6. 正则不等于一个字符串_乳饮料不等于酸奶,记住一个关键词,花最少的钱买到真正的好酸奶...
  7. table tr th td
  8. CAS单点登录配置[3]:服务器端配置
  9. 计算机中记录的意思,电脑日志看不懂,怎么才能知道日志记录的是什么意思啊?...
  10. mybatis mysql 配置文件_mybatis简单应用(基于配置文件)_MySQL
  11. 网络生活催生新式词汇
  12. 操作系统 多线程之优先级翻转
  13. php 405,php Restler 405 Method Not Allowed 问题解决啦,restlerallowed_PHP教程
  14. mysql删除重复记录只保留一条
  15. C++ 从入门到入土(English Version)Section 9 : Computer Graphics and Command Prompt
  16. WPS简历模板的图标怎么修改_最新8000套设计师面试作品集:模板+插画+海报+图标+简历...
  17. 工作经验分享:为什么我们要写Unti Test
  18. linux用户的目录结构,Linux下用户管理、目录结构
  19. 杰里之AC695N/AC696N 蓝牙耳机PCB LAYOUT 说明【篇3】
  20. 渗透测试工具(一) CS

热门文章

  1. 2022-2028全球及中国加工海鲜和海鲜加工设备行业研究及十四五规划分析报告
  2. 通过 Desktop 学 Docker 也太简单了
  3. DBCO-Sulfo-NHS Ester,磺化二苯基环辛炔-琥珀酰亚胺酯,1400191-52-7,DBCO-Sulfo-SE
  4. 使用Zuul构建微服务网关(路由)
  5. linux分区表导出与恢复,Linux下的硬盘数据恢复与分区表恢复
  6. HTML5+jQuery温馨浪漫爱心表白动画特效
  7. 阿里云OSS图片上传
  8. ChatGPT + MindShow 三分钟搞定PPT制作
  9. 树莓派(四)——3.5寸LCD触控屏驱动安装
  10. 近70套电商详情设计模板合集,店铺装修能省不少