
一、实验目的
1、了解熟悉jacobi迭代法和seidel迭代法的解法
2、将原理与matlab语言结合起来,编程解决问题
3、分析实验结果
二、实验题目
设线性方程组为
考察用jacobi迭代法和seidel迭代法求解该线性方程组的收敛情况。如果收敛,给出误差满足的解。
三、实验原理
将A 作如下分解
这里
Jacobi迭代矩阵为
Seidel迭代矩阵为
它们的迭代格式都可化为
则迭代格式对任何初值都瘦脸的充要条件是迭代矩阵谱半径
Jacobi迭代矩阵的特征方程为
Seidel迭代矩阵的特征方程为
四、实验内容
用matlab编写计算jacobi迭代矩程序,建立m文件如下:
function[M]=BJ(A)
D=diag(diag(A));
L=tril(-A)+D;
U=triu(-A)+D;
M=inv(D)*(L+U);
输入:
>> A=[20 1 -3 -1;3 18 0 7;-1 2 40 -2;1 0 -1 5];
>> [M]=BJ(A)
M:
M =
0 -0.0500 0.1500 0.0500
-0.1667 0 0 -0.38
0.0250 -0.0500 0 0.0500
-0.2000 0 0.2000 0
则jacobi迭代矩阵为:
用matlab求jacobi迭代矩阵的特征根的算法如下:
>> A=[0 -0.05 0.15 -0.05;-0.67 0 0 -0.39;0.025 -0.05 0 0.05;-0.2 0 0.2 0];[V,D]=eig(A)
V =
-0.12 + 0.0450i -0.12 - 0.0450i -0.3812 -0.5005
-0.9467 -0.9467 0.8867 0.5461
-0.1528 - 0.1181i -0.1528 + 0.1181i -0.2099 -0.0466
-0.1056 + 0.1325i -0.1056 - 0.1325i 0.1561 0.6701
D =
-0.1774 + 0.08i 0 0 0
0 -0.1774 - 0.08i 0 0
0 0 0.2194 0
0 0 0 0.1355
则最大特征根为:0.2194 则,所以jacobi迭代法收敛
用matlab编程jacobi迭代法求根的算法:
function [n,x]=jacobi(A,b,X,nm,w)
%用雅克比迭代法求解方程组Ax=b
%输入:A为方程组的系数矩阵,b为方程组右端的列向量,X为迭代初值构成的列向量,nm为最大迭代次数,w为误差精度
%输出:x为求得的方程组的解构成的列向量,n为迭代次数
n=1;
m=length(A);
D令A=D-L-U,计算矩阵D
L令A=D-L-U,计算矩阵L
U令A=D-L-U,计算矩阵U
M计算迭代矩阵
g计算迭代格式中的常数项
%下面是迭代过程
while n<=nm
x=M*X+g; %用迭代格式进行迭代
if norm(x-X,2)  方程组的解为');x  上面:达到精度要求就结束程序,输出迭代次数和方程组的解 end %下面:如果达到最大迭代次数仍不收敛,输出警告语句及迭代的最终结果(并不是方程组的解) disp('在最大迭代次数内不收敛!'); 输入数据: >>  A=[20 1 -3 -1;3 18 0 7;-1 2 40 -2;1 0 -1 5]; b=[1;2;10;-1]; X=[0;0;0;0]; >> nm=100; >> w=1e-4; >> [n,x]=jacobi1(A,b,X,nm,w) 迭代次数为 n =      6 方程组的解为 x =     0.0687     0.15     0.2352    -0.1667 n =      6 x =     0.0687     0.15     0.2352    -0.1667 所以,满足精度的根为x = 0.0687  0.15  0.2352  -0.1667  迭代次数为6次 用matlab编程计算seidel迭代矩阵算法为: function[M]=BS(A) D=diag(diag(A));             L=tril(-A)+D;                U=triu(-A)+D;                M=inv(D-L)*U;                输入: >> A=[20 1 -3 -1;3 18 0 7;-1 2 40 -2;1 0 -1 5]; >> [M]=BS(A) M =          0   -0.0500    0.1500    0.0500          0    0.0083   -0.0250   -0.3972          0   -0.0017    0.0050    0.0711          0    0.0097   -0.0290    0.0042 则seidel迭代矩阵为: 用matlab编程求得seidel矩阵的算法为: >> A=[0 -0.05 0.15 0.05;0 0.0083 -0.025 -0.3972;0 -0.0017 0.005 0.0711;0 0.0097 -0.029 0.0042];[V,D]=eig(A) V =    1.0000            -0.1596 + 0.6750i  -0.1596 - 0.6750i  -0.9104                   0             0.6965             0.6965             0.3924                   0            -0.1250 + 0.0028i  -0.1250 - 0.0028i   0.1313                   0             0.0070 - 0.1348i   0.0070 + 0.1348i   0.0000           D =         0                  0                  0                  0                   0             0.0088 + 0.0768i        0                  0                   0                  0             0.0088 - 0.0768i        0                   0                  0                  0            -0.0001           则特征根为  0.008+0.0768i  0.0088-0.0768i  -0.0001 则,所以seidel迭代法收敛 用seidel迭代法求根的算法为: function [n,x]=gaussseidel(A,b,X,nm,w) %用高斯-赛德尔迭代法求解方程组Ax=b %输入:A为方程组的系数矩阵,b为方程组右端的列向量,X为迭代初值构成的列向量,nm为最大迭代次数,w为误差精度 %输出:x为求得的方程组的解构成的列向量,n为迭代次数 n=1; m=length(A); I生成m*m阶的单位矩阵 D令A=D-L-U,计算矩阵D L令A=D-L-U,计算矩阵L U令A=D-L-U,计算矩阵U M计算迭代矩阵 g=inv(I-inv(D)*L)*(inv(D)*b);  %计算迭代格式中的常数项 %下面是迭代过程 while n<=nm     x=M*X+g;              %用迭代格式进行迭代  迭代次数为');n  方程组的解为');x  上面:达到精度要求就结束程序,输出迭代次数和方程组的解 end %下面:如果达到最大迭代次数仍不收敛,输出警告语句及迭代的最终结果(并不是方程组的解) disp('在最大迭代次数内不收敛!'); disp('最大迭代次数后的结果为');x 输入数据: >> A=[20 1 -3 -1;3 18 0 7;-1 2 40 -2;1 0 -1 5]; b=[1;2;10;-1]; X=[0;0;0;0]; nm=100; w=1e-4; [n,x]=gaussseidel(A,b,X,nm,w) 迭代次数为 n =      5 方程组的解为 x =     0.0687     0.15     0.2352    -0.1667 n =      5 x =     0.0687     0.15     0.2352    -0.166 满足精度的根为x =0.0687   0.15  0.2352  -0.1667  迭代次数为5次 五、实验分析 从实验过程可以看到求出满足精度的根,seidel迭代要比jacobi迭代快,这是因为在jacobi迭代计算中,计算向量时是按分量的角标由小到大依次计算的。如果随着k的增大不断靠近解,可以期盼分量,于是seidel迭代法的收敛速度比jacobi迭代法的收敛速度快,所以迭代次数少。
