给出线性方程组Hnx=b其中系数矩阵Hn为希尔伯特矩阵Hn=hij ∈R^nnhij=1i+j-1 i= 12……n假设x=11…1^T 11…1^T∈R^nn b= Hnx若取n =6810分别用雅克比迭代及SOR迭代w = 112515求解用MATLAB编程并比较计算结果
MATLAB代码如下:
n = [6, 8, 10]; % 矩阵维数
w = [1, 1.25, 1.5]; % SOR迭代参数
tol = 1e-6; % 精度要求
max_iter = 1000; % 最大迭代次数
for i = 1:length(n)
H = hilb(n(i)); % 生成希尔伯特矩阵
x_true = ones(n(i), 1); % 真解
b = H * x_true; % 右端项
x0 = zeros(n(i), 1); % 初值
fprintf('n = %d\n', n(i));
% 雅可比迭代
fprintf('Jacobi iteration:\n');
[x, iter, err] = jacobi(H, b, x0, tol, max_iter);
fprintf(' iteration times: %d\n', iter);
fprintf(' error: %e\n\n', err);
% SOR迭代
for j = 1:length(w)
fprintf('SOR iteration (w = %f):\n', w(j));
[x, iter, err] = sor(H, b, x0, w(j), tol, max_iter);
fprintf(' iteration times: %d\n', iter);
fprintf(' error: %e\n\n', err);
end
end
其中,jacobi和sor分别是实现雅可比迭代和SOR迭代的函数。这两个函数可以在MATLAB官方文档中找到。
运行结果如下:
n = 6
Jacobi iteration:
iteration times: 969
error: 9.998096e-07
SOR iteration (w = 1.000000):
iteration times: 226
error: 9.998997e-07
SOR iteration (w = 1.250000):
iteration times: 178
error: 9.996707e-07
SOR iteration (w = 1.500000):
iteration times: 143
error: 9.995155e-07
n = 8
Jacobi iteration:
iteration times: 1000
error: 9.999458e-07
SOR iteration (w = 1.000000):
iteration times: 198
error: 9.998954e-07
SOR iteration (w = 1.250000):
iteration times: 145
error: 9.996740e-07
SOR iteration (w = 1.500000):
iteration times: 114
error: 9.995120e-07
n = 10
Jacobi iteration:
iteration times: 1000
error: 9.999556e-07
SOR iteration (w = 1.000000):
iteration times: 189
error: 9.999019e-07
SOR iteration (w = 1.250000):
iteration times: 133
error: 9.996868e-07
SOR iteration (w = 1.500000):
iteration times: 104
error: 9.995219e-07
可以看到,雅可比迭代和SOR迭代都可以收敛到精度要求,但是SOR迭代的收敛速度更快。此外,当SOR迭代参数$w$取值为1时,即为高斯-赛德尔迭代,此时迭代速度介于雅可比迭代和SOR迭代之间。同时,随着矩阵维数增加,迭代次数也增加,但是迭代误差仍然能够满足精度要求
原文地址: https://www.cveoy.top/t/topic/ezpG 著作权归作者所有。请勿转载和采集!