超松弛迭代法方法的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CENTRAL SOUTH UNIVERSITY 数值分析实验报告
超松弛迭代法的应用
一、问题背景
在科学计算和工程设计中,经常会遇到求解线性方程组的问题,而快速精确求解一直是我们追求的目标,随着计算机技术的发展,我们可以借助计算机使用很多方法来帮助求解,如直接法等,但通常都只能适用于经过有限步运算能求得解的方程,对于方程数和未知数都很多的方程组,计算量往往相当大,因而人们在寻求其他求解方法的时候,发现了迭代法的巨大优点,从最初的Jacobi 迭代法到Gauss-Seidel 迭代法,计算过程变得快速简洁。在Guass-Seidel 迭代法的基础上,人们发现迭代—松弛—再迭代的方法,能更加减少计算步骤,极大地缩短计算时间,在此基础上,人们进一步发现超松弛迭代法的收敛速度最快,而且超松弛迭代法具有计算公式简单,编制程序容易等突出优点。通过选择合适恰当的松弛因子ω能直接控制算法的收敛性和收敛速度。
二、数学模型
一般而言,因Jacobi 迭代收敛速度不够快,所以在工程中用的不是太多。在 Jacobi 迭代手链速度很慢的情况下,通常Guass-Seidel 也不会很快。因此,可以对Guass-Seidel 做修改,提高收敛速度,这就是这里要介绍的超松弛迭代法。
三、算法及流程
在Guass-Seidel 中迭代格式为
()()()g U L k k +X +X =X ++11k
可以将迭代格式改写为
()()∆X +X =X +k 1k
其中
()()X •+X +X =∆X +g U L k 1k
如果在修正项上加上一个参数ω,便使得松弛迭代法公式
()()()()()()()
g U L k k k k +X +X +X -=∆X +X =X ++11k 1ωωω
上式可以改写为
()()
()[]()()L D U D L D k k ωωωωω-+X +--=X -+11
1
当1=ω时候,就退化为Guass-Seidel 迭代法;1>ω时,称为逐次超松弛迭代法;1<ω时,称为逐次低松弛迭代法。通常,统称为逐次松弛迭代法。 MATLAB 实现代码:
打开编辑器,输入以下语句并保存为Fsor.m 文件。 function [x,k]=Fsor(A,b,x0,w,tol)
max=300 ; if (w<=0||w >=2)
error; return ; end
D=diag(diag(A)); L=-tril(A,-1); U=-triu(A,1); B=inv(D-L*w)*((1-w)*D+w*U); f=w*inv((D-L*w))*b; x=B*x0+f;
k=1; while norm(x-x0)>=tol x0=x; x=B*x0+f; k=k+1; if (k>=max)
disp('迭代次数过多,SOR 方法可能不收敛'); return ; end [k,x'] end
四、计算结果及分析
用超松弛迭代法,求解方程组
34
108512104x 54321432143214321=+---=-+--=--+--=---x x x x x x x x x x x x x x x
要求计算精度为710-
打开编辑器输入以下命令并以文件名sor.m 保存文件。 a=[5 -1 -1 -1 -1 10 -1 -1 -1 -1 5 -1 -1 -1 -1 10]; b=[-4 12 8 34]'; x0=[1 1 1 1]';
[x,k]=Fsor1(a,b,x0,1.2,1e-7) 运行程序,在命令窗口输入 >>sor 运行得到: x =
1.000000009833877 1.999999995028638
3.000000000713360
4.000000002119737
k =
14
计算结果表明迭代到14次时,已经满足精度。为了进一步分析迭代过程中的收敛情况,下面给出的是每一步的迭代值:
ans =
Columns 1 through 4
2.000000000000000 1.020693606400000 2.052126035968000
3.240994000568320
Column 5
3.985238565152359
ans =
Columns 1 through 4
3.000000000000000 1.062667343125283 2.024242781867915 2.969116885521270
Column 5
4.009675528231265
ans =
Columns 1 through 4
4.000000000000000 0.988194978323851 1.991189930675583 3.003551127831114
Column 5
3.996017218773414
ans =
Columns 1 through 4
5.000000000000000 1.000142990882456 2.001727374363322 2.998782794598383
Column 5
4.000874935426618
ans =
Columns 1 through 4
6.000000000000000 1.000303826876706 1.999649911955541 3.000442322902451
Column 5
3.999872540322841
ans =
Columns 1 through 4
7.000000000000000 0.999930780668059 2.000099494876094 2.999888211227589
Column 5
4.000015710348041
ans =
Columns 1 through 4