刚学了Gauss消去法,就用MATLAB实现一下,并对所耗时间进行测试,代码如下:
function [Solution_matrix]=GaussElimination(Augmented_matrix)
% 2020-2-21 臻orz
% inputs:
% Augmented_matrix:增广矩阵,为n*(n+1)维矩阵
% outputs:
% Solution_matrix:计算的解,为n*1维矩阵
%initialize
[row,col]=size(Augmented_matrix);
Solution_matrix=zeros(row,1);
%判定输入矩阵是否符合要求
if row~=col-1
disp('请输入n*(n+1)维矩阵');
else
for ii=1:row-1
%判定主元素是否为零,也可在开头用顺序主子式判定
if Augmented_matrix(ii,ii)==0
disp(['第',num2str(ii),'个主元素为零']);
return;
else
%若符合要求,继续消元
for jj=ii+1:row
Augmented_matrix(jj,:)=Augmented_matrix(jj,:)...
-Augmented_matrix(jj,ii)/Augmented_matrix(ii,ii)*Augmented_matrix(ii,:);
end
end
end
%消元完毕,开始回代
Solution_matrix(row)=Augmented_matrix(row,col)/Augmented_matrix(row,col-1);
for ii=row-1:-1:1
Solution_matrix(ii)=(Augmented_matrix(ii,col)...
-Augmented_matrix(ii,1:row)*Solution_matrix)/Augmented_matrix(ii,ii);
end
end
end
随后为了看看算法耗时怎样,未知量取100至1000,输入元素取1-100的整数,得到的测试结果如图
可以看到计算1000个未知量所耗时间也才不到3s, MATLAB进行矩阵运算还是很给力的。以下是记录耗时和绘图的代码:
t=[];
dimension=[];
for ii=100:100:1000
a=floor(100*randn(ii,ii+1)+1);
tic;
GaussElimination(a);
t=[t toc];
dimension=[dimension ii];
end
figure(1)
plot(dimension,t,'k-',dimension,t,'r*');hold on;
title('时间复杂度');xlabel('未知量个数');ylabel('时间/s');
hold off;