写了一段matlab语言的列主元Gauss消去法
列主元消去法是对Gauss消去法的优化版本
由于计算机存在舍入误差
所以主元元素在做分母时不能太小
否则在有些求解的时候会引起较大的误差
因此需要将最大的主元选出
话不多说直接上代码(将代码存为.m脚本)
%功能是列主元Gauss消去法解方程组 %A为数入矩阵系数,b为方程组右端系数 %方程组的解保存在解向量x中 A=input('请输入方程组系数矩阵A:'); b=input('请输入方程组系数b:'); b=b'; [m,n]=size(A); %A的行数和列数(A的大小) if m~=n error('矩阵A的行数和列数必须相同!'); return; end if m~=size(b) error('b的大小必须和A的行数和列数相同'); return; end if rank(A)~=rank([A,b]) error('A的矩阵的秩和增广矩阵的秩不相同,方程不存在唯一的解'); return; end c=n+1; A(:,c)=b; %将A变换成线性方程组的增广矩阵 x=zeros(length(b),1); C=zeros(1,c); %选取主元并将矩阵化为阶梯型矩阵 for i=1:n-1 a=abs(A(i,i)); %令a为第i次消元时主元元素的绝对值 [u,j]=max(abs(A(i:m,i))); %选出第i列中最大的元素,将最大值返回给u,最大值所在的行标返回给j j1=j+i-1; if j1~=i C=A(i,:); A(i,:)=A(j1,:); A(j1,:)=C; end %消元过程 for k=i+1:n A(k,:)=A(k,:)-(A(k,i)/A(i,i))*A(i,:); end end %回代求解过程 x(n)=A(n,c)/A(n,n); for m=n-1:-1:1 x(m)=(A(m,c)-A(m,m+1:n)*x(m+1:n))/A(m,m); end %显示计算结果 disp('选主元并初等变换后的系数矩阵A='); disp(A(:,1:n)); disp('初等变换后的右端向量b='); disp(A(:,c)); disp('解向量x='); disp(x); disp('A的行列式的值为:'); disp(det(A(:,1:n)));欢迎大家批评指正交流~