线性方程组的J-迭代,GS-迭代,SOR-迭代,SSOR-迭代方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

西京学院数学软件实验任务书
课程名称数学软件实验班级数0901学号0912020119姓名王震
实验课题雅克比迭代、高斯—赛德尔迭代、超松弛迭代
实验目的熟悉雅克比迭代、高斯—赛德尔迭代、超松弛迭代
实验要求运用Matlab/C/C++/Java/Maple/Mathematica等其中一种语
言完成
实验内容
雅克比迭代法
高斯—赛德尔迭代法、超松弛迭代法
成绩教师
【实验课题】
雅克比迭代、高斯—赛德尔迭代、超松弛迭代【实验目的】
学习和掌握线性代数方程组的雅克比迭代、高斯—赛德尔迭代、超松弛迭代法,并且能够熟练运用这些迭代法对线性方程组进行求解。

【实验内容】1、问题重述:
对于线性方程组,即:
A b X = (1),1111221n 12112222n 2
1122nn n n n n n n
a x a x a x
b a x a x a x b a x a x a x b +++=⎧⎪+++=⎪⎨

⎪+++=⎩ 其中,
111212122111 0 - - 0 - 0 0 () - - - 0 n ij n n
n n nn nn a a a a a a a a a a ⨯--⎡⎤⎡⎤⎢⎥⎢⎥⎢
⎥⎢⎥A ==--⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣
⎦ 0n D L U ⎡⎤
⎢⎥
⎢⎥≡--⎢⎥⎢
⎥⎣⎦()
1,n b b b T
= 如何运用雅克比迭代、高斯—赛德尔迭代、超松弛迭代法对线性方程组进行求解。

2、方法原理:2.1雅克比迭代
迭代思想:首先通过构造形如的等式,然后给定一个初值
A b X =()x f x =,再通过进行迭代。

(0)(0)(0)(0)
12(,,)n x x x X = (1)()()k k f +X =X step1 :对(1)相应第行中的用其它元素表示为:
i i x
11111121111122,122
11111()()
11()()
11
()()
n n
j j j j j j n n
i i ij j i j j j i j i j ii n n
n n nj j n n nj j j j nn nn x b a x x b a x a a x b a x x b a x a a x b a x x b a x a a ===≠=-==⎧
=-=+-⎪⎪
⎪⎪⎨
=-=+-⎪⎪
⎪=-=+-⎪⎩
∑∑∑∑∑∑ 即:()D b L U X =-+X
Step 2 :进行迭代
,,(0)(0)(0)(0)
12(1)11()
(,,)
()n k k x x x D b D L U +--⎧X =⎨X =-+X ⎩
0,1,2k = 取它的判断条件为小于一个确定的误差值,跳出循环。

其()(1)k k -X -X A A ε中,为循环次数,则为所求的近视解。

(参考程序)k ()k X 2.2、高斯—赛德尔迭代
迭代思想:以雅克比迭代法为基础,假定每一次迭代得到的数据都优(1)k +X 越于,即中的每一个分量都优越于中对应的分量。

由于在求解
()k X (1)k +X ()k X 第个分量的过程中,前个分量已经求出,所以可以直接调用所求
()k X i ()k i x 1i -出来的前个分量。

1i -考虑雅克比迭代: ,
(1)()k k J x B x f +=+(0,1,2,)k = 即:(1)1()1()k k x D L U x D b +--=++所以,(1)()()k k k Dx Lx Ux b
+=++当可逆时,由于在求解第个分量的过程中,前个分量已D L -()k X i ()k i x 1i -经求出,将上式改写为:(1)(1)()k k k Dx Lx Ux b
++=++即:(1)()()k k D L x Ux b +-=+所以,(1)1()1()()k k x D L Ux D L b
+--=-+-设,,上式改写为:
11(),()G G B D L U f D L b --=-=-,(1)()k k G G x B x f +=+0,1,2k =
迭代算法:
(1)()111211111
(1)
(1)
()11
1(1)(1)1
1111111n k k j j j i n
k k k i
ij j
ij j i j j i ii
ii
ii n k k n
nj j
n j nn
nn
x a x b a a x a x
a x
b a a a x a x b a a +=-++==+-++=⎧=-+⎪⎪⎪⎪
⎨=--+
⎪⎪⎪=-+
⎪⎩
∑∑∑

得出计算步骤:
,(0)(0)(0)1(1)(1)()()(1)()(0)211111(,,,)1
()1
()n k k k k i i k k T
i n i ij j ij j
i j j i ii i n i i ij j ij j j j i ii x x x x x b a x a x x x a x b a x a x a +++-==+-==⎧
⎪=⎪
⎪⎪=--=+∆⎨⎪
⎪∆=--⎪
⎪⎩
∑∑∑∑ (0,1,;1,2,)k i n == 由于再代入数据时尽可能采用最新数值,因此,高斯—赛德尔迭代法的收
敛速度大于雅克比迭代法。

2.3、逐次超松弛迭代法(SOR )
逐次超松弛迭代法是对高斯—赛德尔迭代的一种改进,在高斯—赛德尔迭代的基础上加入松弛因子,使得与的误差由控制。

ω(1)k x +()k x x ∆ω由高斯—赛德尔迭代公式:(1)
(1)()111
()k k k i i n
i ij j ij j j j i
ii x
b a x a x a ++-===--∑∑ 得出SOR 迭代算法:
(1)
()(1)
()(1)
()()
(1)
()
1
1
(1) ()()
k k k k k k k k k i
i i i i i i i n
i ij j
ij j j j i
ii
x x x
x x
x x b a x a x a ω
ωωω++++-===-+=+-=+
--∑∑ ,其中,为松弛因子。

迭代的控制条件为:
(1,2,,)i n = ω,
(1)()|| ||k k ε+X -X =<得出SOR 的计算公式为:
,(0)(0)(0)1(1)(1)()()(1)()(0)211111(,,,)1
()()n k k k k i i k k T
i n i ij j ij j
i j j i ii i n i i ij j ij j j j i ii x x x x x b a x a x x x a x b a x a x a ω
+++-==+-==⎧
⎪=⎪
⎪⎪=--=+∆⎨⎪
⎪∆=--⎪
⎪⎩
∑∑∑∑ (0,1,;1,2,)k i n == 则存在,(1)()(1)()() ( )
k k k k k Dx D x b Lx Ux D x ω++=+++-令,则,
1()((1))S B D L D U ωωω-=--+1()S f D L b ωω-=-(1)()k k S S
B f +X =X +2.4、对称超松弛迭代法
对称超松弛迭代法是对逐次超松弛迭代法的改进,在逐次超松弛迭代法的基础上,首先对线性方程组按照顺序方式依次求解,然后在此基,(1,2,)i x i n = 础上对线性方程组逆序求解,得出SSOR 迭代法。

求解步骤:
Step 1 顺序求解得出:
1
2()k x +1
2()()1
1
11()((1))
()k k x L x f L D L D U f D L b ωωωωωωω+--⎧=+⎪=--+⎨⎪=-⎩
Step 2 逆序求解由得出1
2()k x +(1)
k x +1
2()(1)2
1
12()((1))
()k k x U x f U D U D L f D U b ωωωωωωω++--⎧=+⎪=--+⎨⎪=-⎩
得出SSOR 公式:
(1)()11111(2)()()k k x S x f S U L f D D U D D L D b ωω
ωωωω
ωωωω+-----⎧=+⎪
=⎨
⎪=---⎩【实验总结】
由以上实验得出SSOR 在求解线性方程时最优。

当时,逐次超松弛迭代1ω=法(SOR )等价于高斯赛德尔迭代法。

(参考程序)
【程序】
%%%%%%%%%%%%%%%%%%%%%% 程序 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function maintest1(A,b)
N=input('请输入最大迭代次数N(足够大):');
esp=input('请输入近视解的误差限:');
X0=input('请输入初始值:');
if any(diag(A))==0
error('系数矩阵错误,迭代终止!')
end
D=diag(diag(A));
U=-triu(A);
L=-tril(A);
%%%%%%%%%%%%%%%jacobi%%%%%%
fJ=inv(D)*b;
BJ=inv(D)*(L+U);
PJ=max(abs(eig(BJ)));
fprintf('用雅克比求解的谱半径为:%2d\n',PJ)
%%%%%%%%%%%%%%%GS%%%%%%
fG=inv(D-L)*b;
BG=inv(D-L)*U;
PG=max(abs(eig(BG)));
fprintf('用GS求解的谱半径为:%2d\n ',PG)
%%%%%%%%%%%%% SOR %%%%%%%%%%
omega=1;
fS=omega*inv(D-omega*L)*b;
BS=inv(D-omega*L)*((1-omega)*D+omega*U);
PS=max(abs(eig(BS)));
fprintf('用SOR求解的谱半径为:%2d\n ',PS)
%%%%%%%%%%%% SSOR %%%%%%%%%%%%%%%
Lw=inv(D-omega*L)*((1-omega)*D+omega*U);
Uw=inv(D-omega*U)*((1-omega)*D+omega*L);
Sw=Uw*Lw;
fw=omega*(2-omega)*inv(D-omega*inv(D)*U)*inv(D-
omega*inv(D)*L)*inv(D)*b;
PSS=max(abs(eig(Sw)));
fprintf('用SSOR求解的谱半径为:%2d\n ',PSS)
%%%%%%%%%%%%%%% Jacobi %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fprintf(' Jacobi迭代法 \n')
t=1;
Y0=X0;
Y1=BJ*Y0+fJ;
fprintf('第%2d次迭代得:',t)
disp(Y1');
while t<=N & norm(Y1-Y0)>esp
t=t+1;
Y0=Y1;
Y1=BJ*Y0+fJ;
fprintf('第%2d次迭代得:',t)
disp(Y1');
end
fprintf('满足误差限的Jacobi迭代的近视解为:')
disp(Y1');
fprintf('Jacobi迭代次数为:\n',t) %%%%%%%%%%%%%%%%%%%%% GS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fprintf('GS \n')
t=1;
Y0=X0;
Y1=BG*Y0+fG;
fprintf('第%2d次迭代得:',t)
disp(Y1');
while t<=N & norm(Y1-Y0)>esp
t=t+1;
Y0=Y1;
Y1=BG*Y0+fG;
fprintf('第%2d次迭代得:',t)
disp(Y1');
end
fprintf('满足误差限的GS迭代的近视解为:')
disp(Y1');
fprintf(' GS迭代次数为:\n ',t) %%%%%%%%%%%%%%%%%%%%%%%%% SOR %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fprintf('SOR \n')
t=1;
Y0=X0;
Y1=BS*Y0+fS;
fprintf('第%2d次迭代得:',t)
disp(Y1');
while t<=N & norm(Y1-Y0)>esp
t=t+1;
Y0=Y1;
Y1=BS*Y0+fS;
fprintf('第%2d次迭代得:',t)
disp(Y1');
end
fprintf('满足误差限的SOR迭代的近视解为:')
disp(Y1');
fprintf(' SOR迭代次数为:\n ',t) %%%%%%%%%%%%%%%%%%%% SSOR %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fprintf('SSOR \n')
t=1;
Y0=X0;
Y1=Sw*Y0+fw;
fprintf('第%2d次迭代得:',t)
disp(Y1');
while t<=N & norm(Y1-Y0)>esp
t=t+1;
Y0=Y1;
Y1=Sw*Y0+fw;
fprintf('第%2d次迭代得:',t)
disp(Y1');
end
fprintf('满足误差限的SSOR迭代的近视解为:')
disp(Y1');
fprintf('SSOR迭代次数为:\n ',t)。

相关文档
最新文档