function x=LGauss(A,b) %高斯列主元消去法 %A:系数矩阵 %b:非齐次项 [n,m]=size(A); x=zeros(n,1); for k=1:n-1%选定列主元 max=0; for i=k:n if abs(A(i,k))>max max=abs(A(i,k)); r=i; end end if max<1e-10 return end if r>k%交换两行位置 for j=k:n z=A(k,j); A(k,j)=A(r,j); A(r,j)=z; end z=b(k); b(k)=b(r); b(r)=z; end %消元 for i=k+1:n m1=A(i,k)/A(k,k); for j=k+1:n A(i,j)=A(i,j)-m1*A(k,j); end b(i)=b(i)-m1*b(k); end end for k=n:-1:1 for j=k+1:n b(k)=b(k)-A(k,j)*x(j); end x(k)=b(k)/A(k,k); end end
function [X,det]=LGauss_new(A,b) %input %A:nxn非奇异系数矩阵,b是列向量 %output: %X:AX=b的解 %det:A的行列式 [n,n]=size(A); det=1; for k=1:n-1 %寻找列主元 [T,i]=max(abs(A(k:n,k)));ik=i+k-1; %判断矩阵的奇异性 if T<=1e-6 det=0; return; end if ik~=k lk=A(k,k:n); A(k,k:n)=A(ik,k:n); A(ik,k:n)=lk; m=b(k); b(k)=b(ik); b(ik)=m; det=-det; end %消元过程 for i=k+1:n A(i,k)=A(i,k)/A(k,k);%A(k,k)!=0 A(i,k+1:n)=A(i,k+1:n)-A(i,k)*A(k,k+1:n); b(i)=b(i)-A(i,k)*b(k); end det=A(k,k)*det; end %回代过程 if abs(A(n,n))<=1e-6 det=0; return; end b(n)=b(n)/A(n,n); for i=n-1:-1:1 b(i)=(b(i)-A(i,i+1:n)*b(i+1:n))/A(i,i); end det=A(n,n)*det; X=b; end
主函数:
%% 1)
clc;clear
A=[-1 2 -2;3 -1 4;2 -3 -2];
b=[-1;7;0];
disp('第一个函数得到的解:')
x=LGauss(A,b)
disp('第二个函数得到的解:')
x=LGauss_new(A,b)
%% 2)
clc;clear
x=[14.38,11.38,7.42,6.38,8.81]';
y=[3.94,2.79,3.07,5.11,2.59]';
k=ones(5,1);
for i=1:5
xx(i)=x(i)*x(i);
xy(i)=x(i)*y(i);
yy(i)=y(i)*y(i);
end
A=[xy' yy' x y k];
b=-xx';
coef=LGauss(A,b)
运行结果: