实验名称:
求解线性方程组的迭代法
实验目的:
1. 实现三种迭代法;
2. 比较三种迭代法的差异;
3. 分析方程组的好坏以及算
l=0;
for i=1:k
while norm(x1-x0)>=eps(i)
x0=x1;
x1=B*x0+f;
q=q+1;
end
fprintf('\n');
p(i)=q;
fprintf('jocibi 迭代法解得根:');
fprintf('\n')
x1
法的稳定性
实验内容:
求解方程组:
2
1
4
1
6
3
0
2
8
x
2
4
5
实验程序及数据
function yy=ddf(A,b,x0,eps)
w=1.2;
D=diag(diag(A));
L=-tril(A,-1);
U=-triu(A,1);
B=D\(L+U);
f=D\b;
x1=B*x0+f; %jacobi 迭代法
G=(D-L)\U;
f1=(D-L)\b;
x2=G*x0+f1; %Gauss-Seidel 迭代法
B1=(D-L*w)\((1-w)*D+w*U);
B2=w*((D-L*w)\b);
x =B1*x0+B2; %ssor 迭代法
k=length(eps);
p=zeros(1,k);
s=zeros(1,k);
n=zeros(1,k);
q=0;
t=0;
end
p
plot(eps,p,'r')
hold on
for i=1:k
while norm(x2-x0)>=eps(i)
x0=x2;
x2=G*x0+f1;
t=t+1;
end
fprintf('\n');
s(i)=t;
fprintf('Gauss-Seidel 迭代法解得根:');
fprintf('\n')
x2
end
s
plot(eps,s,'g')
hold on
for i=1:k
while norm(x-x0)>=eps(i)
x0=x;
x=B1*x0+B2;
l=l+1;
end
fprintf('\n');
n(i)=l;
fprintf('ssor 迭代法解得根:');
fprintf('\n')
x
end
n
plot(eps,n,'b')
title('相同精度条件下不同迭代法与所需迭
代次数关系图')
xlabel('精度');
ylabel('迭代次数');
实验结果
>> A=[2 -1 0;1 6 -2;4 -3 8];
>> b=[2;-4;5];
>> x0=[0;0;0];
>> eps=[10^(-10) 10^(-11) 10^(-12) 10^(-13)
10^(-14) 10^(-15)];
ddf(A,b,x0,eps)
jocibi 迭代法解得根:
x1 =
0.61999999998838
-0.75999999998893
0.02999999997998
jocibi 迭代法解得根:
x1 =
0.62000000000120
-0.76000000000112
0.03000000000208
jocibi 迭代法解得根:
x1 =
0.61999999999988
-0.75999999999989
0.02999999999978
jocibi 迭代法解得根:
x1 =
0.62000000000001
-0.76000000000001
0.03000000000002
jocibi 迭代法解得根:
x1 =
0.62000000000000
-0.76000000000000
0.03000000000000
jocibi 迭代法解得根:
x1 =
0.62000000000000
-0.76000000000000
0.03000000000000
p =
37
34
31
40
Gauss-Seidel 迭代法解得根:
x2 =
43
46
0.61999999998086
-0.75999999999349
0.03000000001201
Gauss-Seidel 迭代法解得根:
x2 =
0.62000000000173
-0.76000000000040
0.02999999999899
Gauss-Seidel 迭代法解得根:
x2 =
0.61999999999985
-0.75999999999998
0.03000000000008
Gauss-Seidel 迭代法解得根:
x2 =
0.62000000000001
-0.76000000000000
0.02999999999999
Gauss-Seidel 迭代法解得根:
x2 =
0.62000000000000
-0.76000000000000
0.03000000000000
Gauss-Seidel 迭代法解得根:
x2 =
0.62000000000000
-0.76000000000000
0.03000000000000
s =
25
27
29
21
19
23
ssor 迭代法解得根:
x =
0.62000000000462
-0.76000000001876
0.02999999999554
ssor 迭代法解得根:
x =
0.62000000000029
-0.76000000000214
0.02999999999969
相 同 精 度 条 件 下 不 同 迭 代 法 与 所 需 迭 代 次 数 关 系 图
jocibi迭 代 法
Gauss-Seidel迭 代 法
ssor迭 代 法
50
45
40
35
30
25
20
数
次
代
迭
15
0
0.1
0.2
0.3
0.4
0.5
精 度
0.6
0.7
0.8
0.9
1
x 10-10
Ax
,
RAb
*
nn
,
,
Rbx
n
。
如果解 x 关于问题的微小变化不
ssor 迭代法解得根:
x =
0.62000000000001
-0.76000000000024
0.02999999999999
ssor 迭代法解得根:
x =
0.61999999999998
-0.75999999999999
0.03000000000001
ssor 迭代法解得根:
x =
0.62000000000000
-0.76000000000000
0.03000000000000
ssor 迭代法解得根:
x =
0.62000000000000
-0.76000000000000
0.03000000000000
n =
33
36
39
43
46
49
结果分析:
敏感则问题就是好问题,反之就
1.我们可以用达到相同精度
是坏问题。对解上述方程组的算
三种方法所需迭代次数的多少来
法,如果关于问题的微小变化,
衡量方法的好坏。在相同精度的
算法求的解变化也很微小,则称
条件 Gauss-Seidel 迭代法达到
算法是稳定的,反之是不稳定的。
相同精度所需要的迭代次数比用
jacobi 迭代法所需的次数要少,
但是 ssor 迭代法所需要的迭代
次数受 w 的影响。
2.对于线性方程组