0%

计算方法实验/实验二

实验二

解线性方程组的迭代法

【作业内容】:应用雅可比迭代和高斯-塞德尔迭代算法解线性方程组:

【作业要求】:

  1. 用Matlab语言编写雅可比(Jacobi)迭代法程序,如若使误差不超过0.0001,应该迭代多少次?按照所预测的迭代次数进行计算,观察输出结果(要求显示每次迭代的中间结果);

  2. 用Matlab语言编写高斯-塞德尔(Gauss-Seidel)迭代法程序,如若使误差不超过0.0001,应该迭代多少次?按照所预测的迭代次数进行计算。观察输出结果(要求显示每次迭代的中间结果)。

雅可比(Jacobi)迭代法

本题的系数矩阵为:

分解矩阵:$A = D - L -U$

$B = D^{-1}(L+U)$

利用matlab求解:

1
2
3
4
5
6
A = [8,-3,2,1;4,11,-1,2;7,1,12,2;1,3,-5,15];
D = diag(diag(A)); % 获取对角矩阵
L = - tril(A,-1); % 获取下三角矩阵
U = - triu(A,1); % 获取上三角矩阵
B = inv(D)*(L+U); % 计算Jacobi矩阵
norm(B,2); % 计算2-范数

求得 $q = norm(B,2)=0.7462$

取 $x^{(0)}=\{0,0,0,0\}’$,计算得: $x^{(1)}=\{1,\frac{16}{11},\frac{11}{6},\frac{14}{15} \}’$

利用matlab求得:$norm((x^{(1)}-x^{0}),2) = 2.7107$

所以有:

如若使误差不超过0.0001,即:

解得:

所以应该迭代40次

matlab代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
% Jacobi.m
% Jacobi迭代法求解作业二
% A为方程组的增广矩阵
format long;
A = [8,-3,2,1;4,11,-1,2;7,1,12,2;1,3,-5,15];
b = [8,16,22,14]';
A = [A,b]; % 构造增广矩阵
% A=[10 -2 -1 3;-2 10 -1 15;-1 -2 5 10];
MAXTIME=40;%最多进行40次迭代
eps=1e-5;%迭代误差
[n,m]=size(A);
x=zeros(n,1); %迭代初值,从全零开始迭代
y=zeros(n,1);
k=0;
% 进入迭代计算
disp('迭代过程X的值情况如下:')
disp('X=');
while k <= MAXTIME
disp(x');
for i=1:1:n
s=0.0;
for j=1:1:n
if j~=i
s=s+A(i,j)*x(j);
end
y(i)=(A(i,n+1)-s)/A(i,i);
end
end
x = y;
y = zeros(n,1);
k=k+1;
end
format short;

高斯-塞德尔(Gauss-Seidel)迭代法

本题的系数矩阵为:

分解矩阵:$A = D - L -U$

$G = (D-L)^{-1}*U$

利用matlab求解

1
2
3
4
5
6
A = [8,-3,2,1;4,11,-1,2;7,1,12,2;1,3,-5,15];
D = diag(diag(A)); % 获取对角矩阵
L = - tril(A,-1); % 获取下三角矩阵
U = - triu(A,1); % 获取上三角矩阵
G = inv(D-L)*(U); % 计算Gauss_Seidel矩阵
norm(G,inf) % 计算无穷范数

算得norm(G,inf) = 0.75

取 $x^{(0)}=\{0,0,0,0\}’$,计算得: $x^{(1)}=\{1,\frac{12}{11},\frac{51}{44},\frac{683}{660} \}’$

利用matlab求得:$norm((x^{(1)}-x^{0}),2) = 2.1458$

所以有:

如若使误差不超过0.0001,即:

解得:

所以应该迭代40次

matlab代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
% Gauss_Seidel.m
% A为方程组的增广矩阵
format long;
A = [8,-3,2,1;4,11,-1,2;7,1,12,2;1,3,-5,15];
b = [8,16,22,14]';
A = [A,b]; % 构造增广矩阵
% A=[10 -2 -1 3;-2 10 -1 15;-1 -2 5 10]
[n,m]=size(A);
% 最多进行50次迭代
Maxtime=40;
%控制误差
Eps=10E-5;
% 初始迭代值,均为0
x=zeros(1,n);
disp('x=');
% 迭代次数小于最大迭代次数,进入迭代
for k=1:Maxtime
disp(x);
for i=1:n
s=0.0;
for j=1:n
if i~=j
s=s+A(i,j)*x(j);%计算和
end
end
x(i)=(A(i,n+1)-s)/A(i,i);%求出此时迭代的值
end
end
X=x;
disp('迭代结果:');
X
format short;