for k=1:n-1;
%%%是否进行主元选取
if abs(A(k,k)) yzhuyuan=1; else yzhuyuan=0; end if yzhuyuan; %%%%选主元 t=A(k,k); for r=k+1:n; if abs(A(r,k))>abs(t) p=r; else p=k; end end %%%交换元素 if p~=k; for q=k:n+1; s=A(k,q); A(k,q)=A(p,q); A(p,q)=s; end end end %%%判断系数矩阵是否奇异或病态非常严重 if abs(A(k,k))< yipusilong disp(‘矩阵奇异,解可能不正确’) end %%%%计算消元,得三角阵 for r=k+1:n; m=A(r,k)/A(k,k); for q=k:n+1; A(r,q)=A(r,q)-A(k,q)*m; end end end %%%%求解x x(n)=A(n,n+1)/A(n,n); for k=n-1:-1:1; s=0; for r=k+1:n; s=s+A(k,r)*x(r); end t=(A(k,n+1)-s) x(k)=(A(k,n+1)-s)/A(k,k) end 结果分析和讨论: 例:求解方程。其中为一小数,当时,分别采用列主元和不列主元的Gauss消去法求解,并比较结果。 记Emax为求出的解代入方程后的最大误差,按要求,计算结果如下: 当时,不选主元和选主元的计算结果如下,其中前一列为不选主元结果,后一列为选主元结果,下同。 0. 91 0. 51 2. 72 2. 63 2. 51 2. 21 Emax= 9. 624e-010,0 此时,由于不是很小,机器误差就不是很大,由Emax可以看出不选主元的计算结果精度还可以,因此此时可以考虑不选主元以减少计算量。 当时,不选主元和选主元的计算结果如下 1. 77 0. 48 1. 07 2. 74 3. 31 2. 09 Emax= 2. 668e-005,0 此时由Emax可以看出不选主元的计算精度就不好了,误差开始增大。 当时,不选主元和选主元的计算结果如下 1. 20 1. 00 1. 66 2. 00 3. 11 000 Emax= 0. 03,0 此时由Emax可以看出,不选主元的结果应该可以说是不正确了,这是由机器误差引起的。 当时,不选主元和选主元的计算结果如下 NaN 1 NaN 2 NaN 3 Emax=NaN, 0 不选主元时,程序报错:Warning: Divide by zero.。这是因为机 器计算的最小精度为10-15,所以此时的就认为是0,故出现了错误现象。而选主元时则没有这种现象,而且由Emax可以看出选主元时的结果应该是精确解。 结论: 采用Gauss消去法时,如果在消元时对角线上的元素始终较大(假如大于10-5),那么本方法不需要进行列主元计算,计算结果一般就可以达到要求,否则必须进行列主元这一步,以减少机器误差带来的影响,使方法得出的结果正确。