设有线性方程组Ax=b, 其中
A=
10.9 1.2 2.1 0.9
1.2 11.2 1.5 2.5
2.1 1.5 9.8 1.3
0.9 2.5 1.3 12.3
B=
-7
5.3
10.3
24.6
(1) 选取适当的松弛因子和初始向量,分别用 Jacobi 迭代,Gauss-Seidel 迭代和松弛迭代法(SOR)求解方程组Ax=b 使误差小于
0.2*10^(-10)(写出详细求解过程);
(2)说明如何确保每种方法的误差在控制范围内;
(3)使用上述三种方法求解该线性方程组时,给出求得误差在控制范
围内的迭代步数.
% 设置矩阵 A 和向量 b
A = [10.9 1.2 2.1 0.9; 1.2 11.2 1.5 2.5; 2.1 1.5 9.8 1.3; 0.9 2.5 1.3 12.3];
b = [-7; 5.3; 10.3; 24.6];
% 设置误差限
epsilon = 0.2 * 1e-10;
% Jacobi 迭代法
% 选取初始解
x = zeros(size(b));
% 初始化迭代步数
k = 0;
% 迭代求解
while true
% 计算新的解
for i = 1:length(b)
x_new(i) = (b(i) - A(i, 1:i-1)*x(1:i-1) - A(i, i+1:end)*x(i+1:end)) / A(i,i);
end
% 更新解
x = x_new;
% 计算残差向量和残差模长
r = b - A*x;
res = norm(r);
% 检查是否满足误差限
if res < epsilon
break;
end
% 更新迭代步数
k = k + 1;
end
% 输出迭代步数
fprintf('Jacobi 迭代法:迭代 %d 次\n', k);
% Gauss-Seidel 迭代法
% 选取初始解
x = zeros(size(b));
% 初始化迭代步数
k = 0;
% 迭代求解
while true
% 计算新的解
for i = 1:length(b)
x_new(i) = (b(i) - A(i, 1:i-1)*x_new(1:i-1) - A(i, i+1:end)*x(i+1:end)) / A(i,i);
end
% 更新解
x = x_new;
% 计算残差向量和残差模长
r = b - A*x;
res = norm(r);
% 检查是否满足误差限
if res < epsilon
break;
end
% 更新迭代步数
k = k + 1;
end
% 输出迭代步数
fprintf('Gauss-Seidel 迭代法:迭代 %d 次\n', k);
松弛迭代法
% 选取松弛因子
omega = 1.5;
% 选取初始解
x = zeros(size(b));
% 初始化迭代步数
k = 0;
% 迭代求解
while true
% 计算新的解
for i = 1:length(b)
x_new(i) = (1-omega)*x(i) + omega * (b(i) - A(i, 1:i-1)*x_new(1:i-1) - A(i, i+1:end)*x(i+1:end)) / A(i,i);
end
% 更新解
x = x_new;
% 计算残差向量和残差模长
r = b - A*x;
res = norm(r);
% 检查是否满足误差限
if res < epsilon
break;
end
% 更新迭代步数
k = k + 1;
end
% 输出迭代步数
fprintf('松弛迭代法(omega = %f):迭代 %d 次\n', omega, k);