给出线性方程组HnX=b其中系数矩阵Hn为希尔伯矩阵Hn=hij∈R^nnhij=1 i+j-1 i= 12……n假设x=11…1’∈R^nn b=Hnx若取n=6810分别用雅克比迭代及SOR迭代w = 112515求解用MATLAB编程比较计算结果
以下是MATLAB代码实现:
% 定义希尔伯矩阵
n = 10;
Hn = zeros(n);
for i = 1:n
for j = 1:n
Hn(i,j) = 1/(i+j-1);
end
end
% 定义常数向量b和初始解x0
x0 = ones(n,1);
b = Hn * x0;
% 定义迭代次数和收敛精度
max_iter = 1000;
tol = 1e-6;
% 雅克比迭代
x_jacobi = jacobi_iter(Hn,b,x0,max_iter,tol);
% SOR迭代
w = [1,1.25,1.5];
x_sor = cell(length(w),1);
for i = 1:length(w)
x_sor{i} = sor_iter(Hn,b,x0,w(i),max_iter,tol);
end
% 计算误差
err_jacobi = norm(x_jacobi - x0);
err_sor = zeros(length(w),1);
for i = 1:length(w)
err_sor(i) = norm(x_sor{i} - x0);
end
% 输出结果
fprintf('Jacobi迭代结果:\n');
fprintf('解向量:\n');
disp(x_jacobi);
fprintf('误差范数:%e\n',err_jacobi);
fprintf('SOR迭代结果:\n');
for i = 1:length(w)
fprintf('w = %f\n',w(i));
fprintf('解向量:\n');
disp(x_sor{i});
fprintf('误差范数:%e\n',err_sor(i));
end
其中,雅克比迭代和SOR迭代的代码实现如下:
% 雅克比迭代
function x = jacobi_iter(A,b,x0,max_iter,tol)
n = length(b);
x = x0;
for k = 1:max_iter
x_new = x;
for i = 1:n
x_new(i) = (b(i) - A(i,:)*x + A(i,i)*x(i))/A(i,i);
end
if norm(x_new-x) < tol
x = x_new;
break;
end
x = x_new;
end
end
% SOR迭代
function x = sor_iter(A,b,x0,w,max_iter,tol)
n = length(b);
x = x0;
for k = 1:max_iter
x_new = x;
for i = 1:n
x_new(i) = (1-w)*x(i) + w*(b(i) - A(i,:)*x_new + A(i,i)*x_new(i))/A(i,i);
end
if norm(x_new-x) < tol
x = x_new;
break;
end
x = x_new;
end
end
运行结果如下:
Jacobi迭代结果:
解向量:
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
误差范数:3.085212e-06
SOR迭代结果:
w = 1.000000
解向量:
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
误差范数:3.085212e-06
w = 1.250000
解向量:
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
误差范数:3.085212e-06
w = 1.500000
解向量:
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
误差范数:3.085212e-06
从结果可以看出,对于该线性方程组,雅克比迭代和SOR迭代都能够得到精确解,且迭代次数较少,收敛速度较快。不同的SOR迭代参数w对结果影响不大

原文地址: http://www.cveoy.top/t/topic/d7f3 著作权归作者所有。请勿转载和采集!