第八课 线性联立方程的雅可比迭代

迭代方法

在前面几节中,已经描述了线性代数方程组的“直接”解法。我们所说的“直接”是指求解方法是通过固定次数的运算得到答案。由于存在舍入误差,解决方案在计算机硬件允许的范围内是“精确的”。用户没有机会在解决过程中进行干预。相比之下,本节讨论的是迭代或者是“间接”求解方法。这些都是需要用户首先猜测一个答案,然后一次又一次地进行修正来求解的。下面将描述几种方法,这些方法在校正的技术上有所不同,并且会发现具有对真实解的不同收敛速度。是否会实现收敛的问题将不在我的分享的讨论范围之内。一般来说,具有“对角优势矩阵”的方程很可能有收敛的迭代解。这个明聪的粗略定义为,任何一行中的对角线项都大于非对角线项的总和。正如我们之前看到的,在许多工程应用中,这种对角优势是广泛存在的。
由于用户的初始猜测不太可能是准确的,所以解决方案通常会逐渐变得越来越接近真正的值,这给用户提供了再次选择的机会,因为选择“足够接近”期望的值的尝试是可能的。例如,如果解决方案在某种意义上与之前的迭代相比几乎没有变化,则可以终止该过程。因此,一般而言,在这些方法种,事先是不知道一个方程的解的。

迭代过程

假设我们刚开始去尝试一个解决方程的迭代办法,对下面这个方程:

迭代方法的主要特点是要把未知数放在方程的两边,所以上面方程可以变化为:

这种最简单的方法叫做‘雅可比迭代’,我们假设初始值都为1,然后代入右手边,
等式变成:

所以猜测是错误的。然后,如果这个迭代过程会收敛,我们可以看出上面的值比初始值更接近正确值,再把上面的值代入右手边,结果为

进程继续的话,接下来的值总结在表中

对于上面这个例子,可以从表中看出当x1=1.0,x2=2.0的时候,是收敛的。
这类方程,在开始的时候,修改了[A]{x} = {b}的初始方程,将[A]的每一行和{b}向量除以[A]的相应对角线,使得修改后的系数矩阵的主对角线项为1,因此

假设矩阵[A]和右侧向量{b}保持如上所述通过对角线分割后获得的修正系数,则系数矩阵可以被划分为下面的形式

其中[I]为单位矩阵,

需要注意的是,这里的[L]和[U]和因式分解中的[L]和[U]没有关系。通过这样的定义,矩阵形式可以写成
变化之后未知数就出现在方程的两边,迭代求解的方案为:

具体例子

通过迭代解这个方程

将每个方程除以系数矩阵的主对角项,得到

因此
代入猜测值:

得到

然后

对于这个例子,收敛非常慢。为了在计算机上运行这个方案,我们需要的只是一个计算[[L]+[U]]{ x]的矩阵向量乘法、之后再加上[b]的向量加法,和一些检查收敛性的方法。
代码如下:
其中一个主程序和一个子程序,子程序为检查是否收敛的程序checkit

#使用天际线储存的乔列斯基LLT分解,使用'罚'方法的规定解
import numpy as np
import math
import B
n=3
converged=np.array([False])
xnew=np.zeros((n,1))
a=np.array([[16,4,8],[4,5,-4],[8,-4,22]],dtype=np.float)
b=np.array([[4],[2],[5]],dtype=np.float)
x=np.array([[1],[1],[1]],dtype=np.float)
tol=1.0e-5
limit=100
print('系数矩阵')
print(a[:,0])
print('右手边向量',b[:,0])
print('初始猜测值',x[:,0])
for i in range(1,n+1):diag=a[i-1,i-1]a[i-1,:]=a[i-1,:]/diagb[i-1,0]=b[i-1,0]/diag
a[:]=-a[:]
for i in range(1,n+1):a[i-1,i-1]=0
print('第一次迭代')
iters=0
while(True):iters=iters+1xnew[:]=b[:]+np.dot(a,x)if iters<5:print(x[:,0])B.checkit(xnew,x,tol,converged)if converged==True or iters==limit:breakx[:,0]=xnew[:,0]
print('到收敛需要迭代次数',iters)
print('解向量',x[:,0])
checkit
def checkit(loads,oldlds,tol,converged):
#检查前后两个量的收敛性neq=loads.shape[0]big=0.0 converged[:]=Truefor i in range(1,neq+1):if abs(loads[i-1,0])>big:big=abs(loads[i-1,0])for i in range(1,neq+1):if abs(loads[i-1,0]-oldlds[i-1,0])/big>tol:converged[:]=False

终端输出结果:

程序结果与计算值相同。

线性联立方程的雅可比迭代解(jacobi Iteration).(python,数值积分)相关推荐

  1. 线性联立方程的高斯赛德尔迭代(Gauss-Seidel iteration)(python,数值积分)

    第九课 线性联立方程的高斯赛德尔迭代 在雅可比迭代中,{x}k+1(在上一课中被称为xnew)的所有分量都是使用{x}k(在上一课中为x)的分量推出的.因此,新的向量值完全是根据旧的向量值获得的. 然 ...

  2. 预处理共轭梯度(PCG)解线性联立方程(python,数值积分)

    第十四课 线性联立方程的预处理共轭梯度(PCG) 系数矩阵病态 百度解释:求解方程组时如果对数据进行较小的扰动,则得出的结果具有很大波动,这样的矩阵称为病态矩阵 在直接求解的诸多方法中,线性方程可能无 ...

  3. python英语字典程序修改_详解如何修改python中字典的键和值

    我们知道python中字典是无序的,它们都是通过hash去对应的.一般的如果我们需要修改字典的值,只需要直接覆盖即可,而修改字典的键,则需要使用字典自带的pop函数,示例如下: t = {} t['a ...

  4. c语言线性表库函数大全,数据结构(C语言版)-线性表习题详解

    <数据结构(C语言版)-线性表习题详解>由会员分享,可在线阅读,更多相关<数据结构(C语言版)-线性表习题详解(23页珍藏版)>请在人人文库网上搜索. 1.数 据 结 构 ,线 ...

  5. python java混合编程_详解java调用python的几种用法(看这篇就够了)

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...

  6. centos7安装python3_详解Centos7升级python 2.7至Python 3.7

    详解Centos7升级python 2.7至Python 3.7 龙行 个人随笔 2019-6-6 3451 0评论 centos7版本默认安装的是python2.7,对于强迫症的我来说,忍受不了啊. ...

  7. 解线性方程组的python实现(1)——高斯主元消去法

    解线性方程组的python实现1--高斯主元消去法 1. 高斯(顺序)主元消去法 1.1 消去过程 1.2 回代过程求解 实现代码 2 列主元消去法 实现代码 3 高斯-约旦(Gauss-Jordan ...

  8. 【机器学习】【隐马尔可夫模型-3】后向算法:算法详解+示例讲解+Python实现

    0.前排提示 csdn有些数学公式编辑不出来,所以本博用容易书写的表达式来表示专业数学公式,如: (1)  在本博客中用α<T>(i)来表示 (2)在本博客中用[i=1, N]∑来表示 注 ...

  9. python字典修改键所对应值_详解如何修改python中字典的键和值

    我们知道python中字典是无序的,它们都是通过hash去对应的.一般的如果我们需要修改字典的值,只需要直接覆盖即可,而修改字典的键,则需要使用字典自带的pop函数,示例如下: t = {} t['a ...

最新文章

  1. Redux 入门教程(三):React-Redux 的用法
  2. 解决 WIn7 启动时“你有等待写入光盘的文件”
  3. 电话订票每日开始时间(几点放票) - 北京本地宝
  4. NDK 与 JNI 的关系
  5. python错误怎么处理_python报的错误怎么处理
  6. PPT到底是天使还是魔鬼?
  7. python算法与程序设计基础(第二版)第八章实训答案_Python算法与程序设计基础(第2版)...
  8. leetcode116. 填充每个节点的下一个右侧节点指针
  9. 利用Jackson的JsonFilter来实现动态过滤数据列(数据列权限控制)
  10. nacos 本地测试_Nacos入门
  11. 《华林科纳-半导体工艺》PVA 刷擦洗
  12. 北京市城八区廉租住房和经济适用住房保障家庭收入、住房、资产标准已确定
  13. 离散LQR与iLQR的推导思路
  14. js设计模式之命令模式
  15. eterm显示未连接服务器,eterm一直显示未链接服务器
  16. 谈一下我对OOP的了解
  17. Failed opening .rdb for saving: Permission denied
  18. Java使用JavaMail收发Email电子邮件
  19. C语言将UTC时间转为时区时间的方法参考
  20. 个人对*xx与**xx的理解

热门文章

  1. 软件测试(黑盒/白盒测试/集成测试)
  2. U-Boot(TFTP下载,NFS挂载调试)
  3. 异步电机无速度传感器矢量控制学习二更
  4. 《白话机器学习的数学》正则化实现代码
  5. 什么是Axios ?
  6. python读取json格式文件大量数据,以及python字典和列表嵌套用法详解
  7. Latex- Texlive+Texstudio 安装和使用
  8. GitHub自学系列之二「加入 GitHub」
  9. 我与我的职业梦想 – 成为一名优秀的软件工程师
  10. Python使用py2exe打包exe程序