本文使用 Zhihu On VSCode 创作并发布

逐次超松弛(SOR)迭代法概述

一、方法背景

​ 逐次超松弛迭代法是高斯-塞德尔迭代法的一种变种,是为了解决线性方程组的一种迭代方法。由David M. Young, Jr. 和Stanley P. Frankel于1950年提出,主要为了实现在计算机上求解线性方程组。逐次超松弛迭代法从高斯-塞德尔迭代出发,加入了

作为松弛因子,加快了迭代的收敛速度。

​ 高斯-塞德尔迭代:

​ 逐次超松弛迭代:

二、数学推导

1. 基础迭代法

​ 对于

​ ​假定A有如下分解

,其中M是非奇异方阵。

​ 有

,其中

​ 建立迭代公式:

​ 若

收敛于确定的向量
,则
,即
即为方程组
的解。

​​ 令

,其中

2. 迭代形式

​ 考虑高斯-塞德尔迭代法

​ 令

为第
次迭代时
的改变量

​ 因此

​ 在改变量r

前加一个因子

​ 合并

得到

3. 矩阵形式

​ 由高斯-塞德尔迭代的矩阵形式:

​ 故

​ 记

​ 则SOR迭代为

​ 两边同时左乘D,可得

​ 即

​ 令

​ 则

为SOR迭代的矩阵形式,
为SOR迭代法的迭代矩阵

三、收敛分析与误差分析

1. 收敛条件的判定

  • 收敛的充要条件是

  • 收敛的必要条件是
  • 若系数矩阵A对称正定,则
    时SOR迭代收敛
  • 若系数矩阵A为严格对角占优矩阵,则
    时SOR迭代收敛

2. 收敛速度分析

​ 假设

,Jacobi迭代矩阵
只有实特征值,Jacobi迭代收敛
,方程组存在唯一解即

​ 收敛速度可以如下表示

​ 最佳松弛参数

3. 误差分析

​ 给定初值

是真解,若
,则有如下估计

四、理论分析

​ 对于线性方程组,可以通过高斯消去、LU分解等直接法进行求解,但是直接法对于系数矩阵要求高,且程序复杂,对于求解大型线性方程组有较多限制。而像SOR迭代法的基础迭代法,只需按照迭代格式进行迭代,便于编程求解,可以迭代到任意精度,节省计算量和空间。

​ SOR迭代法由高斯-塞德尔迭代法改进而来,通过加入了松弛因子

,调整每次迭代的增量,在设定合适的
时,SOR迭代速度明显快于高斯-塞德尔迭代。

​​ 编程时常使用SOR迭代法的矩阵形式,当对角矩阵D中对角线上元素有0时,下三角矩阵

对角线上元素为0,此时无法求逆,进而无法进行迭代。故在编程实现时,进行线性方程组的预处理。由SOR收敛条件可知,当系数矩阵
对称正定且
时,SOR迭代收敛,对于非奇异方针
对阵正定,故若将求解
的线性方程组转化为求解
,新的系数矩阵为
,此时使用SOR迭代的矩阵形式可以避免无法求逆的情况出现。

五、MATLAB实现与实验

function [x,iter] = sor(A,b,x0,omega,tol)
if det(A) == 0error('无解或无唯一解');
end%方程组预处理
b=A'*b;
A=A'*A;D = diag(diag(A));
L = D-tril(A);
U = D-triu(A);
x=x0;
for iter=1:500B = (D-L*omega)((1-omega)*D+omega*U);f = (D-L*omega)b*omega;x = B*x+f;eerror = norm( b-A*x ) / norm(b);if ( eerror < tol )break;end
end

不同松弛因子的迭代速度对比
不同迭代方式的迭代速度对比

六、总结

​​ 逐次超松弛(SOR)迭代法从高斯-塞德尔迭代法出发,通过加入松弛因子

来加快收敛速度,对编程实现友好,常用于求解大型线性方程组。SOR迭代提出的目的是为在计算机上进行线性方程组的求解,通过SOR迭代的矩阵形式,可以很简洁地实现程序编写,并能通过简单地线性方程组预处理解决可能出现的无法求逆的情况。从实验中能够看出,SOR迭代的速度比高斯-塞德尔迭代快,但需要基于合适的松弛因子

七、参考资料

[1] https://en.wikipedia.org/wiki/Successive_over-relaxation

[2] https://zhuanlan.zhihu.com/p/31066592

[3] https://www.jianshu.com/p/e14d9e910984

高斯赛德尔迭代c语言_逐次超松弛SOR迭代概述相关推荐

  1. matlab迭代算法实例sor,SOR迭代 - 程序语言 - MATLAB/Mathematica - 小木虫论坛-学术科研互动平台...

    方法一:建立了SOR.m的脚本文件,实现的是SOR迭代,程序语言如下: %SOR迭代 clear; clc; format long; i=1; n=6; H=hilb(n); X=ones(n,1) ...

  2. 雅可比迭代和高斯—赛德尔迭代法

    一.雅可比迭代法 对于线性方程组AX=b,我们首先将系数矩阵A分解为对角矩阵D.下三角矩阵L和上三角矩阵U: 1.1雅可比迭代法的matlab代码 在这里,我们求解下面的带状方程(以下程序均是以求解该 ...

  3. 三种迭代法解方程组(雅可比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 ...

  4. 用MATLAB实现雅克比迭代、高斯-赛德尔迭代以及超松弛迭代

    文章目录 前言 一.解线性方程组的方法 二.解线性方程组的迭代法及其代码实现 1. 迭代法的收敛性 2. 基本参数设置 3. 雅克比(Jacobi)迭代 4. 高斯-塞德尔(Gauss-Seidel) ...

  5. 2021-01-07 matlab数值分析 线性方程组的迭代解法 高斯-赛德尔迭代法

    matlab数值分析 线性方程组的迭代解法 高斯-赛德尔迭代法 Function [x,iter]=gs(A,b,tol) D=diag(diag(A)); L=D-tril(A); U=D-triu ...

  6. C语言实现高斯-赛德尔迭代gauss seidel(附完整源码)

    实现C语言高斯-赛德尔迭代gauss seidel 高斯-赛德尔迭代gauss seidel的完整源码(实现,main函数测试) 高斯-赛德尔迭代gauss seidel的完整源码(实现,main函数 ...

  7. python解二元一次方程组 迭代法_使用python实现高斯-赛德尔迭代法的简单运算

    今天传热学老师说到高斯-赛德尔迭代法,我就想拿python写一个小程序来计算. 在网上找例子,发现居然没有人拿python写,都是C / C++ / Matlab的.没有参考答案,真是写得我焦头烂额啊 ...

  8. 高斯赛尔德c语言算法,高斯-赛德尔迭代法的算法及程序设计.doc

    PAGE 题 目:高斯-赛德尔迭代法的算法及程序设计 摘要 本文通过理论与实例对线性方程组的解法.收敛性及误差分析进行了探讨.在对线性方程组数值解法的讨论下用到了高斯-赛德尔迭代法,进一步研究和总结了 ...

  9. 高斯-赛德尔迭代法简介

    高斯-赛德尔迭代法是解线性方程组的常用迭代法之一,设线性方程组为 高斯-赛德尔迭代法的迭代公式为 当然,此处假定 ,在很多情况下,它比简单迭代法收敛快,它和简单迭代法的不同点在于计算  时,利用了刚刚 ...

最新文章

  1. python 是什么类型的语言-Python什么意思是一门什么样的语言
  2. mysql 优惠卷表设计_这些年MySQL表设计踩过的坑!
  3. pandas(二) -- Dataframe创建及索引
  4. Hibernate sql查询
  5. 读《系统虚拟化-原理与实现》-第二章
  6. webgl限制帧率_从《长安十二时辰》到《Science Advances》:大帧数高帧率超表面动态全息显示新方法...
  7. pytorch梯度下降函数_Pytorch学习笔记6:激活函数/单层感知机/梯度下降求最小值实例...
  8. jenkins 控制台输出中文乱码
  9. 《使命召唤7:黑色行动》有什么简单办法进入僵尸模式
  10. seafile Windows MySQL_seafile4.3.1 + windows 2012 server +mysql 部署记录(3)
  11. autofs后 卸载_autofs自动挂载
  12. DevExpress DateEdit 5 常见问题解决方法
  13. WebService入门(二)wsimport的使用
  14. 微软员工和 GitHub 员工宣布支持 996.ICU 运动,来签个名呗?
  15. Spring Cloud 工具集
  16. 【最全】ISTQB- FL大纲(含重点)
  17. 今年应届的我面试37次,在16个offer上岸后总结了一些面试心得
  18. LC5454.统计全1子矩阵(矩阵统计)
  19. as 运行java 程序失败,为JBoss AS 7运行Java服务包装程序时出错
  20. java公众号上传素材及发送图文消息实现

热门文章

  1. python笔记基础-Python学习笔记(基础)
  2. python的用途-请问在python中的% 是什么意思, 起到什么作用?
  3. python使用del保留字定义一个函数-python中自定义函数的保留字是
  4. python小游戏编程实例-Python实现的弹球小游戏示例
  5. php和python写爬虫-为什么写爬虫都喜欢用python?
  6. python linux命令-Python执行Linux系统命令的4种方法
  7. 计算机专业名词术语raid,RAID中的9个专业术语详解
  8. UVa11292 - Dragon of Loowater(贪心)
  9. 数据库设计中的范式形式
  10. LeetCode Intersection of Two Linked Lists