MATLAB 实现列主元消去法
基于自己对列主元Gauss消元法算法的理解
写了一段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)));
欢迎大家批评指正交流~