6
?12?2??x1??6????????111??x2???6??221????11? ???3???(1) 用分量形式进行 Jacobi 迭代 (2) 用矩阵形式进行 Jacobi 迭代
(3) 用分量形式进行 Gauss-Seidel 迭代 (4) 用矩阵形式进行 Gauss-Seidel 迭代
实验代码:
(1) 用分量形式进行 Jacobi 迭代:
function x=chap3_3 clear;
fprintf('Jacobi迭代法') x1_(1)=0; x2_(1)=0; x3_(1)=0; for i =1:10
x1_(i+1)=6-2*x2_(i)+2*x3_(i); x2_(i+1)=6-x1_(i)-x3_(i);
x3_(i+1)=11-2*x1_(i)-2*x2_(i); end
x=[x1_',x2_',x3_'] chap3_3
Jacobi迭代法 x =
0 0 0 6 6 11 16 -11 -13 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1
实验结果 ans =
6
7
0 0 0 6 6 11 16 -11 -13 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1
(2) 用矩阵形式进行 Jacobi 迭代
function x=Jacobi(A,b,x0,eps) D=diag(diag(A)); D=inv(D); L=triu(A,-1); U=triu(A,1); B=-D*(L+U); f=D*b; k=0; x0=x0; x=B*x0+f;
fprintf('k x1_(k) x2_(k) x3_(k)\\n')
fprintf('- %4.0f %4.0f %4.0f\\n',k,x0) while norm(x-x0)>=eps x0=x;
x=B*x0+f; k=k+1;
fprintf('- %4.0f %4.0f %4.0f\\n',k,x0) end
实验结果
A=[1,2,-2;1,1,1;2,2,1]; >> b=[6;6;11]; >> x0=[0;0;0]; >> eps=1e-3;
>> x=Jacobi(A,b,x0,eps); k x1_(k) x2_(k) x3_(k) 0 0 0 0 1 6 6 11 2 20 -28 -12 3 50 38 79
(3) 用分量形式进行 Gauss-Seidel 迭代
7
function x=chap3_4 clear;
fprintf('Gauss-Seidel迭代法:') x1_(1)=0; x2_(1)=0; x3_(1)=0; for i =1:10
x1_(i+1)=6-2*x2_(i)+2*x3_(i); x2_(i+1)=6-x1_(i)-x3_(i);
x3_(i+1)=11-2*x1_(i)-2*x2_(i); end
x=[x1_',x2_',x3_]
实验结果
Gauss-Seidel迭代法: x =
0 0 0 6 6 11 16 -11 -13 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 ans =
0 0 0 6 6 11 16 -11 -13 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 GaussSidel矩阵迭代形式
8
8
9
function x=GaussSidel(A,b,x0) D=diag(diag(A)); L=triu(A,-1); C=inv(D+L); U=triu(A,1); B=-C*U; f=C*b; i=0; x0=x0; x=B*x0+f;
fprintf('k x1_(k) x2_(k) x3_(k)\\n')
fprintf('- .4f .4f .4f\\n',i,x0) for i=1:10 x0=x;
x=B*x0+f;
fprintf('- .4f .4f .4f\\n',i,x0) end
实验结果
A=[1,2,-2;1,1,1;2,2,1]; b=[6;6;11]; x0=[0;0;0];
x=GaussSeidel(A,b,x0); k x1_(k) x2_(k) x3_(k)
0 0.0000 0.0000 0.0000 1 -7.5000 8.0000 -2.5000 2 8.0000 -5.0000 10.5000 3 -44.0000 34.0000 -28.5000 4 112.0000 -83.0000 88.5000 5 -356.0000 268.0000 -262.5000 6 1048.0000 -785.0000 790.5000 7 -3164.0000 2374.0000 -2368.5000 8 9472.0000 -7103.0000 7108.5000 9 -28436.0000 21328.0000 -21322.5000 10 85288.0000 -63965.0000 63970.5000
(4) 用矩阵形式进行 Gauss-Seidel 迭代
clear
fprintf('增广矩阵')
A=[0.729,0.81,0.9,0.6867;1,1,1,0.8338;1.331,1.21,1.1,1.000] %输入增广矩阵
%第一次选主元,第三行和第一行交换 fprintf('第一次选主元后的增广矩阵')
tempo=A(3,:);A(3,:)=A(1,:);A(1,:)=tempo;A %第一次消元
fprintf('第一次消元后的增广矩阵')
9
10
A(2,:)=A(2,:)-A(1,:)*A(2,1)/A(1,1); A(3,:)=A(3,:)-A(1,:)*A(3,1)/A(1,1);A %第二次选主元,第三行和第二行交换 fprintf('第二次选主元后的增广矩阵') tempo=A(3,:);A(3,:)=A(2,:);A(2,:)=tempo %第二次消元
fprintf('第二次消元后的增广矩阵') A(3,:)=A(3,:)-A(2,:)*A(3,2)/A(2,2);A %回代求解
fprintf('回代求解') x(3)=A(3,4)/A(3,3);
x(2)=(A(2,4)-A(2,3)*x(3))/A(2,2)
x(1)=(A(1,4)-A(1,2:3)*x(2:3)')/A(1,1); x
运行结果: 增广矩阵 A =
0.7290 0.8100 0.9000 0.6867 1.0000 1.0000 1.0000 0.8338 1.3310 1.2100 1.1000 1.0000
第一次选主元后的增广矩阵 A =
1.3310 1.2100 1.1000 1.0000 1.0000 1.0000 1.0000 0.8338 0.7290 0.8100 0.9000 0.6867
第一次消元后的增广矩阵 A =
1.3310 1.2100 1.1000 1.0000 0 0.0909 0.1736 0.0825 0 0.1473 0.2975 0.1390
第二次选主元后的增广矩阵 A =
1.3310 1.2100 1.1000 1.0000 0 0.1473 0.2975 0.1390 0 0.0909 0.1736 0.0825
第二次消元后的增广矩阵
10

