jacobi.m
function tx=jacobi(A,b,imax,x0,tol) %利用jacobi
迭代法解线性方程组AX=b,迭
%代初值为x0,迭代次数由imax 提供,精确
%度由tol 提供
del=10^-10; %主对角的元素不能太小,必须大于del
tx=[x0] ; n=length(x0);
for i=1:n
dg=A(i,i);
if abs(dg)< del
disp(\'diagonal element is too small\');
return
end
end
for k = 1:imax %Jacobi 迭代法的运算循环体开始
for i = 1:n
sm=b(i) ;
for j = 1:n
if j~=i
sm = sm -A(i,j)*x0(j) ;
end
end %for j
x(i)=sm/A(i,i) ; %本次迭代得到的近似解
end
tx=[tx ;x] ; %将本次迭代得到的近似解存入变量tx 中
if norm(x-x0)
1 0.000000 0.000000
0.000000 0.000000
2 0.600000 2.272727
-1.100000 1.875000
3 1.047273 1.715909
-0.805227 0.810227
4 0.932636 2.073760
-1.056841 0.999972
5 1.018744 1.988716
-0.979154 0.848655
6 0.994702 2.044875
-1.020012 0.879494
7 1.008490 2.030564
-1.006504 0.856333
8 1.004357 2.039363
-1.013008 0.861664
9 1.006538 2.036941
-1.010769 0.858068
10 1.005848 2.038324 -1.011807
0.858984
11 1.006194 2.037917 -1.011439
0.858422
return
else
x0=x ;
end
end
test.m
A=[10 -1 2 0;-1 11 -1 3;2 -1 10 -1;1 3 -1 8];
b=[6 25 -11 15]\';
tol=1.0*10^-6 ;
imax =10;
x0= zeros(1,4);
tx=jacobi(A,b,imax,x0,tol) ;
for j=1:size(tx,1)
fprintf(\'M %f %f %f %f\n\', j,
tx(j,1),tx(j,2),tx(j,3),tx(j,4))
end
结果:
请发表评论