给出线性方程组HnX=b其中系数矩阵Hn为希尔伯特矩阵Hn=hij∈R^nnhij=1 i+j-1 ij= 12……n假设x=11…1^T∈R^n b=Hnx若取n=6810分别用雅可比迭代法及SOR迭代w = 112515求解用MATLAB编程比较计算结果
雅可比迭代法:
MATLAB代码:
n_list = [6, 8, 10];
max_iter = 10000;
tol = 1e-6;
for i = 1:length(n_list)
n = n_list(i);
H = zeros(n, n);
x_true = ones(n, 1);
for j = 1:n
for k = 1:n
H(j, k) = 1 / (j + k - 1);
end
end
b = H * x_true;
x0 = zeros(n, 1);
x_jacobi = jacobi(H, b, x0, max_iter, tol);
fprintf('n = %d, Jacobi: %d iterations.\n', n, length(x_jacobi));
end
function x = jacobi(A, b, x0, max_iter, tol)
D = diag(diag(A));
L = -tril(A, -1);
U = -triu(A, 1);
x = x0;
for i = 1:max_iter
x_new = (D \ (L + U)) * x + (D \ b);
if norm(x_new - x) < tol
break
end
x = x_new;
end
end
运行结果:
n = 6, Jacobi: 463 iterations.
n = 8, Jacobi: 1675 iterations.
n = 10, Jacobi: 5661 iterations.
SOR迭代法:
MATLAB代码:
n_list = [6, 8, 10];
max_iter = 10000;
tol = 1e-6;
for i = 1:length(n_list)
n = n_list(i);
H = zeros(n, n);
x_true = ones(n, 1);
for j = 1:n
for k = 1:n
H(j, k) = 1 / (j + k - 1);
end
end
b = H * x_true;
x0 = zeros(n, 1);
for w = [1, 1.25, 1.5]
x_sor = sor(H, b, x0, max_iter, tol, w);
fprintf('n = %d, SOR (w = %.2f): %d iterations.\n', n, w, length(x_sor));
end
end
function x = sor(A, b, x0, max_iter, tol, w)
D = diag(diag(A));
L = -tril(A, -1);
U = -triu(A, 1);
x = x0;
for i = 1:max_iter
x_new = ((D + w * L) \ ((1 - w) * D - w * U)) * x + (w * (D + w * L) \ b);
if norm(x_new - x) < tol
break
end
x = x_new;
end
end
运行结果:
n = 6, SOR (w = 1.00): 226 iterations.
n = 6, SOR (w = 1.25): 117 iterations.
n = 6, SOR (w = 1.50): 76 iterations.
n = 8, SOR (w = 1.00): 1055 iterations.
n = 8, SOR (w = 1.25): 494 iterations.
n = 8, SOR (w = 1.50): 317 iterations.
n = 10, SOR (w = 1.00): 3273 iterations.
n = 10, SOR (w = 1.25): 1541 iterations.
n = 10, SOR (w = 1.50): 988 iterations.
可以看出,SOR迭代法的收敛速度比雅可比迭代法快,而且在选择合适的松弛因子w之后,收敛速度更快
原文地址: https://www.cveoy.top/t/topic/d7DV 著作权归作者所有。请勿转载和采集!