实验名称: 运用雅克比和高斯赛德尔公式求解方程组

实验目的:

  • a. 比较两种方法的收敛速度
  • b. 验证收敛条件的正确性

实验内容

1.比较两种方法的收敛速度

Jacobi公式原理

xi(k+1)=1aii(bi−∑j=1,j!=inaijxj(k)),i=1,2,3,...nx_{i}^{(k+1)}=\frac {1} {a_{ii}} (b_i-\sum _{j=1,j!=i}^na_{ij}x_j^{(k)}), i = 1,2,3,...n xi(k+1)​=aii​1​(bi​−j=1,j!=i∑n​aij​xj(k)​),i=1,2,3,...n

GS公式原理

xi(k+1)=1aii(bi−∑j=1i−1aijxj(k+1)−∑j=i+1naijxj(k)),i=1,2,3,...nx_{i}^{(k+1)}=\frac {1} {a_{ii}} (b_i-\sum _{j=1}^{i-1}a_{ij}x_j^{(k+1)}-\sum _{j=i+1}^na_{ij}x_j^{(k)}), i = 1,2,3,...n xi(k+1)​=aii​1​(bi​−j=1∑i−1​aij​xj(k+1)​−j=i+1∑n​aij​xj(k)​),i=1,2,3,...n

选用的问题1:
A=[10−1−2−110−2−1−15]y=[7.28.34.2]TA=\begin{bmatrix} 10 & -1 & -2 \\ -1 & 10 & -2 \\ -1 & -1 & 5 \end{bmatrix} \\ y = \begin {bmatrix} 7.2 & 8.3 & 4.2 \end{bmatrix}^T A=⎣⎡​10−1−1​−110−1​−2−25​⎦⎤​y=[7.2​8.3​4.2​]T
A为一个行对角占优矩阵,故其必然对Jacobi公式、GS公式收敛。

选用的问题2:
A=[1001−518−3032−811−227]y=[−7112317]TA=\begin{bmatrix} 10 & 0 & 1 & -5 \\ 1 & 8 & -3 & 0 \\ 3 & 2 & -8 & 1 \\ 1 & -2 & 2 & 7 \end{bmatrix} \\ y = \begin {bmatrix} -7 & 11 & 23 & 17 \end{bmatrix}^T A=⎣⎢⎢⎡​10131​082−2​1−3−82​−5017​⎦⎥⎥⎤​y=[−7​11​23​17​]T
处理结果:

问题1

设定精度10(−15)10^{(-15)}10(−15),Jacobi迭代了32

设定精度10(−15)10^{(-15)}10(−15),GS迭代了18

问题2

设定精度10(−15)10^{(-15)}10(−15),Jacobi迭代了47

设定精度10(−15)10^{(-15)}10(−15),GS迭代了28

结论: GS的收敛速度总是优于Jacobi

2.验证收敛条件的正确性

收敛定理:

对于迭代格式 x(k+1)=Gx(k)+dx^{(k+1)}=Gx^{(k)}+dx(k+1)=Gx(k)+d, 如果迭代矩阵GGG满足某一范数∣∣G∣∣<1||G||<1∣∣G∣∣<1, 那么该迭代格式对于任何初值x(0)x^{(0)}x(0)均收敛

因此,找出某一迭代矩阵的某一范数∣∣G∣∣>=1||G||>=1∣∣G∣∣>=1,该迭代格式则不收敛。

选用的矩阵:
C=[−2154−814−11]C=\begin{bmatrix} -2 & 1 & 5 \\ 4 & -8 & 1 \\ 4 & -1 & 1 \\ \end{bmatrix} C=⎣⎡​−244​1−8−1​511​⎦⎤​
Jacobi迭代为例:
G=−D−1(L+U)G=-D^{-1}(L+U) G=−D−1(L+U)
计算得:
G=[0−0.5−2.5−0.50−0.1254−10]G=\begin{bmatrix} 0 & -0.5 & -2.5 \\ -0.5 & 0 & -0.125 \\ 4 & -1 & 0 \\ \end{bmatrix} G=⎣⎡​0−0.54​−0.50−1​−2.5−0.1250​⎦⎤​
计算G的无穷范数得:
∣∣G∣∣=5.0||G||=5.0 ∣∣G∣∣=5.0
最终结果为经过10000次迭代都不能满足精度要求,发散。

心得体会

1.从收敛速度的角度出发,GS总是优于Jacobi,因为它用到了使用已经计算的“新值”替代“旧值"的思想。

2.在计算效率方面,Jacobi非常适合并行计算,因为每次迭代中的变量都不会改变,直到迭代完成。相反,只要有新的更新可用,GS就可以替换每个变量。

3.总之,Jacobi逐渐靠近正确解;GS需要消耗大量内存以达到更快的收敛速度。

附录

Jacobi、GS的Python实现

def Jacobi(A,y,n=100,c=1e-15):if len(A) == len(y):   #保证维度正确all_x = []#迭代初值 初始化为单行全0矩阵x = [] for i in range(len(y)):x.append([0])count = 0 #迭代次数计数while count < n:nx = [] #保存单次迭代后的值的集合for i in range(len(x)):nxi = y[i][0]for j in range(len(A[i])):if j!=i:nxi = nxi+(-A[i][j])*x[j][0]nxi = nxi / A[i][i]nx.append([nxi]) #迭代计算得到的下一个xi值lc = [] #存储两次迭代结果之间的误差的集合for i in range(len(x)):lc.append(abs(x[i][0]-nx[i][0]))if max(lc) < c:print("迭代了{}次".format(count))print("结果的精度是{}".format(c))return nx,all_x #当误差满足要求时 返回计算结果x = nxall_x.append(x)count = count + 1print("经过{}次迭代未达到精度要求!".format(count))return False #若达到设定的迭代结果仍不满足精度要求 则方程无解else:return False
def GS(A,y,n=100,c=1e-15):if len(A) == len(y):   #保证维度正确all_x = []#迭代初值 初始化为单行全0矩阵x = [] for i in range(len(y)):x.append([0])count = 0 #迭代次数计数while count < n:nx = [] #保存单次迭代后的值的集合for i in range(len(x)):nxi = y[i][0]for j in range(len(A[i])):if j < i:                           #j:1~i-1用新值nxi = nxi - A[i][j] * nx[j][0]elif j != i and j > i:             #j:i+1~n用旧值nxi = nxi - A[i][j] * x[j][0]nxi = nxi / A[i][i]nx.append([nxi]) #迭代计算得到的下一个xi值lc = [] #存储两次迭代结果之间的误差的集合for i in range(len(x)):lc.append(abs(x[i][0]-nx[i][0]))if max(lc) < c:print("迭代了{}次".format(count))print("结果的精度是{}".format(c))return nx,all_x #当误差满足要求时 返回计算结果x = nxall_x.append(x)count = count + 1print("经过{}次迭代未达到精度要求!".format(count))return False #若达到设定的迭代结果仍不满足精度要求 则方程无解else:return False

求矩阵的无穷范数

#矩阵的无穷范数
norm = 0
for i in range(len(G)):res = 0for j in range(len(G[i])):res += abs(G[i][j])if res > norm:norm = res
norm

运用雅可比(Jacobi)和高斯-赛德尔(GS公式)求解方程组相关推荐

  1. 三种迭代法解方程组(雅可比Jacobi、高斯-赛德尔Gaisi_saideer、逐次超松弛SOR)

    分析用下列迭代法解线性方程组 4 -1 0 -1 0 0       0 -1 4 -1 0 -1 0        5 0 -1 4 -1 0 -1        -2 -1 0 -1 4 -1 0 ...

  2. 高斯-赛德尔(Gauss-Seidel)解线性方程组的Matlab实现

    高斯-赛德尔(Gauss-Seidel)解线性方程组的Matlab实现 代码 运行 手算例题 迭代法解线性方程组的基本思想是构造一串收敛到解的序列,即建立一种从已有近似解计算新的近似解的规则,有不同的 ...

  3. 数值计算方法 线性方程组的数值解法(4)---向量和矩阵范数(norm) 高斯-赛德尔(Gauss-Seidel)迭代、共轭梯度(Conjugate Gradient)迭代

    (范数部分matlab有现成函数,若有需要直接参照matlab_norm) 向量范数 设x∈Rn\boldsymbol x\in \boldsymbol R^nx∈Rn则范数||x||满足:∣∣x∣∣ ...

  4. 高斯—赛德尔求解线性方程+C代码

    高斯-赛德尔迭代求矩阵特征值公式如下: 举例: 实现代码: #include "stdio.h" #include "stdlib.h" #include &q ...

  5. [计算机数值分析]高斯-塞德尔迭代公式解线性方程组

    在雅可比迭代公式的基础上,对于收敛的迭代过程,所求出的"新值"常比"老值"更准确些,因此可以用它替代老值作进一步的计算,这样的思想就是著名的高斯-塞德尔迭代公式 ...

  6. 雅可比(Jacobi)及高斯-塞德尔(Gauss_Seidel)迭代法求解线性方程组的matlab现实

    雅可比迭代法的实现代码: function X=Jacobi(A,B,P,delta,max1) %Input -A is a X*N nosingular matrix % -B is a N*1 ...

  7. 计算方法:列主元消去法,LU分解法, 雅可比迭代法,高斯塞德尔迭代法 解线性方程(C++)

    Matrix.h包括矩阵类Matrix的定义,Matrix.cpp包括该类成员函数的实现,LinearEqu.h包括线性方程类LinearEqu的定义,继承自Matrix类,其中solve()方法为列 ...

  8. 【深入浅出强化学习原理入门】高斯-赛德尔(Gauss-Seidel)迭代法

    基于模型的动态规划方法中,使用高斯-赛德尔迭代算法求解值函数. 这种迭代算法到底是怎么求解线性方程组的,文章迭代法求解线性方程组给出了非常详细的解释. 但理解该文还需要了解相关的基础知识: 1.范数 ...

  9. 高斯—赛德尔(Gauss - Seidel)迭代法解线性方程组(Matlab程序)

    %---高斯-赛德尔迭代法----- %---Gauss - Seidel iteration method clear;clc; % A=[10,-1,-2;-1,10,-2;-1,-1,5]; % ...

最新文章

  1. 2021 IDEA大会开启AI思想盛宴,用“创业精神”做科研
  2. Linux驱动中,probe函数何时被调用
  3. python数据库连接池_Python实现数据库连接池
  4. wirkshark过滤规则
  5. cmd更改分辨率_快速切换Mac电脑的屏幕分辨率
  6. 新手学易语言的请看这里!!
  7. 【高等数学】四.多元函数微分学和二重积分
  8. QT C++ Luhn算法验证银行卡号合法性
  9. 电脑桌面计算机文件打不开怎么办,电脑开机桌面文件都点不开的解决方法
  10. 互联网日报 | 6月20日 星期日 | 宁德时代否认强制员工购买特斯拉;小米618支付金额破190亿元;岚图FREE正式上市...
  11. UE4使用MixAmo中的角色与动画
  12. 【Eclipse报错】Faceted Project Problem:Target runtime Apache Tomcat v8.0 is not defined.
  13. 【Java】Java获取昨天日期的正确姿势
  14. oracle基础教学:如何设置外键
  15. 从零开始学Linux内核驱动--(二)简单内核模块驱动程序
  16. 使用百度定位无法初始化问题
  17. 人工智能可以阻止基于物联网的 DDoS 攻击——研究
  18. Spring 实战 第4版 读书笔记
  19. datepicker unity 下载_unity日历DatePicker for UnityUI 1.18(亲测可用)
  20. 陕西省各个地区高新技术企业申报奖励补助,做好高企申报工作

热门文章

  1. Qt笔记 倍速播放菜单
  2. 简单移动Android客户端,下厨房移动第一站–android客户端
  3. html5页面滚动视差效果特,34个网页视差滚动插件和视差特效教程分享
  4. SMART Goal
  5. 安卓效率微商_微商大片app下载_微商大片安卓版 v3.0.0 - Windows10系统之家
  6. 目标检测学习笔记——NMS、置信度、IOU
  7. 【今日早报|每日小型简短新闻12条】12月1日 星期二
  8. Solidworks钣金教程:solidworks草图知识要点
  9. 打豆豆、打豆豆、打豆豆、、、
  10. Linux 软件包简介