function [x] = Gauss(A,b,n)
%%
% 高斯消元(顺序消元)法求解线性代数方程组 Ax = b的MATLAB实现
% A为待求解方程组的系数矩阵(要求A为非奇异系数矩阵)
% b为方程组右端常数项(列向量)
% n为计算过程中的有效数字长度(用vpa函数保留)
%%
% x为求解的结果
%%
fprintf('高斯消元法求解线性方程组 Ax = b');
[col,rol] = size(A); % 求方程组系数矩阵的行数和列数,这里col == rol
M = zeros(col,rol); % 用0初始化M矩阵
x = zeros(col,1); % 用0初始化x向量
%%
% 消元计算:对k = 1,2,…,n-1依次计算
for k = 1:col-1
if (vpa(A(k,k),n) == 0) % 如果出现除数为0的情况就不必再计算,跳出此函数
disp('行列式为0,停止计算');
return;
else
M(k+1:col,k) = vpa(vpa(A(k+1:col,k),n)/vpa(A(k,k),n),n);
A(k+1:col,k+1:col) = vpa(vpa(A(k+1:col,k+1:col),n) - vpa(M(k+1:col,k),n)*vpa(A(k,k+1:col),n),n);
b(k+1:col) = vpa(vpa(b(k+1:col),n)-vpa(M(k+1:col,k),n)*vpa(b(k),n),n);
end
end
%%
% 回代求解
if (vpa(A(col,rol),n)~=0) % 如果除数不为0,就计算最后一个未知数的根
x(col) = vpa(vpa(b(col),n)/vpa(A(col,rol),n),n);
end
for k = col-1:-1:1
if (vpa(A(k,k),n) == 0) % 除数为0就跳出函数
disp('行列式为0,停止计算');
return;
else
% 依次回代求解其余的根
x(k) = vpa(vpa(vpa(b(k),n) - vpa(A(k,k+1:col),n)*vpa(x(k+1:col),n),n)/vpa(A(k,k),n),n);
end
end
end
%%