雅克比迭代法和高斯-赛德尔迭代法是数值线性代数中求解线性方程组的两种常用方法,特别是在大型稀疏矩阵的情况下。这两种方法都是基于迭代的思想,通过逐步逼近来求解线性方程组的解。
雅克比迭代法的原理是将线性方程组写成矩阵形式Ax=b,其中A是对称正定或至少是严格对角占优的矩阵。在雅克比迭代法中,我们构建一个迭代矩阵B,它是A的对角分量的倒数与A的其余部分之差的矩阵,即B=inv(D)*(D-A),其中D是对角矩阵,对角元素取自A。初始解x0通常取为零向量,然后进行迭代计算x1=B*x0+f,其中f是b与D的乘积。如果迭代过程中解的变化量小于预设的误差限eps,迭代停止,输出当前解作为近似解。否则,如果达到最大迭代次数N而仍未满足精度要求,系统会提示“迭代超限”。
MATLAB中的雅克比迭代法实现如下:
```matlab
A=[7,1,2;1,8,2;2,2,9];
b=[10;8;6];
if(any(diag(A))==0)
error('error,pause')
end
eps=input('误差限 eps='); N=input('迭代次数 N=');
D=diag(diag(A)); B=inv(D)*(D-A); f=inv(D)*b;
K=0; x0=zeros(size(b));
while 1
x1=B*x0+f;
K=K+1;
fprintf('第-%d次迭代的近似解为',K) disp(x1');
if norm(x1-x0,inf)<eps
fprintf('满足精度要求的解为\n') disp(x1');
break
end
if K>N
fprintf('迭代超限')
end
x0=x1;
end
```
接下来是高斯-赛德尔迭代法,它是在雅克比迭代法基础上的一种改进。在每次迭代时,高斯-赛德尔法会逐个更新各个未知数,而不是一次性更新所有未知数。这样,每次迭代时,新值是利用最新计算的结果而不是前一次迭代的值。在MATLAB中,高斯-赛德尔迭代法的实现如下:
```matlab
A=[7,1,2;1,8,2;2,2,9];
b=[10;8;6];
if(all(diag(A))==0)
error('error,pause')
end
eps=input('误差限 eps='); N=input('迭代次数 N=');
D=diag(diag(A)); B=inv(D)*(D-A); f=inv(D)*b;
K=0; x0=zeros(size(b)); x00=x0;
while 1
x11=B*x0+f; x00(1,1)=x11(1,1);
x12=B*x00+f; x00(2,1)=x12(2,1);
x13=B*x00+f; x00(3,1)=x13(3,1);
x1=x00;
K=K+1;
fprintf('第-%d次迭代的近似解为',K) disp(x1');
if norm(x1-x0,inf)<eps
fprintf('满足精度要求的解为\n') disp(x1');
break
end
if K>N
fprintf('迭代超限')
end
x0=x1;
end
```
这两种方法都依赖于矩阵的性质,如对角占优、正定等,以保证收敛性。在实际应用中,高斯-赛德尔迭代法通常比雅克比迭代法更快地收敛,因为它利用了最新的信息。然而,当矩阵不是严格对角占优时,雅克比法可能会失去收敛性,而高斯-赛德尔法在某些情况下仍能保持收敛。因此,选择哪种方法取决于具体问题和矩阵的特性。