function x=zongti(A,b)
% 用总体选主元素消去法求线性方程组的解
% A为系数矩阵(要求解惟一,则必须为满秩方阵 n*n),b为右值 n*1
% x为所求的根 n*1
% 作者:野渡无人
% 最后修改日期:2008.3.27
% 如:
% A=[2 4 -2 -2;1 2 4 -3;-3 -3 8 -2;-1 1 6 -3],b=[-4 5 7 7]'
% x=zongti(A,b)
% 结果为:
% AA =
%
% 2 4 -2 -2 -4
% 1 2 4 -3 5
% -3 -3 8 -2 7
% -1 1 6 -3 7
% AA =
%
% 8.0000 -3.0000 -3.0000 -2.0000 7.0000
% 0 3.5000 2.5000 -2.0000 1.5000
% 0 0 -1.0714 -0.6429 -3.6429
% 0 0 0 1.0000 4.0000
% x =
%
% 1
% 2
% 3
% 4
[m,n]=size(A);
if m~=n
error('请输入方阵!');
end
rankA=rank(A);
if rankA~=m
error('输入的矩阵不是满秩矩阵,请重新输入!');
end
AA=[A,b]
I=eye(m); %单位矩阵,在选取总体最大元素中,要进行列变换时将用到
n=n+1;
for i=1:m-1
% 在系数矩阵中选取绝对值最大的元素以及相应的下标号(flag1,flag2)
max=abs(AA(i,i));
flag1=i;
flag2=i;
for j=i+1:m
for k=i+1:m
if max < abs(AA(j,k))
flag1=j;
flag2=k;
max=abs(AA(j,k));
end
end
end
if max==0
error('本列主元素已为零,不能继续!');
end
% 交换第i行与第flag1行的元素
if flag1~=i
temp=AA(i,:);
AA(i,:)=AA(flag1,:);
AA(flag1,:)=temp;
end
% 交换第i列与第flag2列的元素
if flag2~=i
temp=AA(:,i);
AA(:,i)=AA(:,flag2);
AA(:,flag2)=temp;
% 由于有列变换,所以所求的根x向量也应有相应的列变换,使得与用户预期结果的一致
% 解决方法是左乘以相应的初等矩阵
Itemp=I(:,i);
I(:,i)=I(:,flag2);
I(:,flag2)=Itemp;
end
% 以下的算法类同Guass-Jordan 法
for k=i+1:m
AA(k,i:n)=AA(k,i:n)-(AA(k,i)/AA(i,i))*AA(i,i:n);
end
end
disp(AA);
% 求根
x=zeros(m,1);
x(m)=AA(m,n)/AA(m,m);
for i=m-1:-1:1
x(i)=(AA(i,n)-AA(i,i+1:m)*x(i+1:m,1))/AA(i,i);
end
% 纠正最后结果
x=I*x;