1 算法组织
1.1 Jacobi迭代算法组织
本算法用Jacobi迭代求方程组的解,Jacobi (A, b, m, Nmax, ε, ,x),初始向量必须给于中,结果在x中。
其具体算法如下:
1.2 Gauss-Seidel迭代法的算法组织
本算法用Gauss -Seidel迭代解方程组,GS(A, b, n, Nmax, ε, x),要求给出的初始向量放于x中,结果也放于x中。
其具体算法如下:
2 源程序
2.1 用Jacobi迭代解方程组
%start_jacobi
a = [ 28 -3 0 0 0;
-3 38 -10 0 -5;
0 -10 25 -15 0;
0 0 -15 45 0;
0 -5 0 0 30];
b = [ 10;
0;
0;
0;
0];
n = 5;
x = zeros(1,n);
e = 0.001;
N_max = 100;
for count = 1 : N_max
m = x;
for i = 1 : n
x(i) = ( b(i) - (m*a(i,:)' - m(i)*a(i,i)) )/a(i,i);
end
m = m-x;
e1 = max(abs(m));
if e1-e < 0
break;
end
end
if 100 == count
disp('不收敛');
else
disp('由jacobi迭代计算可得线性方程组的解为:')
x = x'
end
disp('jacobi迭代次数是:')
count
%end_jacobi
2.2 用Gauss-Seidel迭代解方程组
%start_Gauss
a = [ 28 -3 0 0 0;
-3 38 -10 0 -5;
0 -10 25 -15 0;
0 0 -15 45 0;
0 -5 0 0 30];
b = [ 10;
0;
0;
0;
0];
n = 5;
x = zeros(1,n);
N_max = 100;
e = 0.001;
for count = 1: N_max
m = x;
for i = 1: n
x(i)=( b(i)-(x*a(i,:)'-x(i)*a(i,i)) )/a(i,i);
end
m = m - x;
e1 = max(abs(m));
if e1<e
break;
end
end
if 100 == count
disp('不收敛');
else
disp('由Gauss迭代计算可得线性方程组的解为:')
x = x'
end
disp('Gauss迭代次数是:')
count
%end_Gauss
3. 运算结果
3.1 用Jacobi迭代解方程组
输入:
a=[28 -3 0 0 0;-3 38 -10 0 -5;0 -10 25 -15 0;0 0 -15 45 0;0 -5 0 0 30];
b=[10;0;0;0;0];
运行结果:
3.2 用Gauss-Seidel迭代解方程组
输入:
a=[28 -3 0 0 0; -3 38 -10 0 -5; 0 -10 25 -15 0; 0 0 -15 45 0;0 -5 0 0 30];
b=[10;0;0;0;0];
运行结果:
1.4 算法分析
如图,经过对工作区的监视分析,求解此方程组Jacobi迭代了8次,而Gauss-Seidel迭代了4次;结果均符合精度要求,得到预期结果。
定性比较: