基本方法
设有线性方程组
A x = b \ Ax=b A x = b
当 d e t A ≠ 0 \ det A \neq 0 d e t A = 0 时,方程组解存在且唯一,对增广矩阵 ( A , b ) = ( A ( 1 ) , b ( 1 ) ) \ (A,b)=(A^{(1)},b^{(1)}) ( A , b ) = ( A ( 1 ) , b ( 1 ) ) 作行初等变换,化 A ( 1 ) \ A^{(1)} A ( 1 ) 为上三角矩阵 A ( n ) \ A^{(n)} A ( n ) ,同时 b ( 1 ) 化 为 b ( n ) \ b^{(1)}化为b^{(n)} b ( 1 ) 化 为 b ( n ) ,这时与增广矩阵 ( A ( n ) , b ( n ) ) \ (A^{(n)},b^{(n)}) ( A ( n ) , b ( n ) ) 相应的线性方程组为上三角形方程组
A ( x ) x = b ( n ) \ A^{(x)}x=b^{(n)} A ( x ) x = b ( n )
记上标为矩阵的行数,下标为(行,列)坐标,设 a i i ( i ) ≠ 0 ( i = 1 , 2 , ⋯ , n ) \ a_{ii}^{(i)} \neq 0(i=1,2,\cdots,n) a i i ( i ) = 0 ( i = 1 , 2 , ⋯ , n ) ,则上式的解为
{ x n = b n ( n ) a n n ( n ) , x i = − ∑ j = i + 1 n a i j ( i ) x j + b i ( i ) a i i ( i ) ( i = n − 1 , n − 2 , ⋯ , 2 , 1 ) \ \begin{cases} x_n = \frac{b_n^{(n)}}{a_{nn}^{(n)}}, \\ \\ x_i = \frac{-\sum_{j=i+1}^{n}a_{ij}^{(i)}x_j+b_i^{(i)}}{a_{ii}^{(i)}} (i=n-1,n-2,\cdots, 2,1) \end{cases} ⎩ ⎪ ⎪ ⎪ ⎨ ⎪ ⎪ ⎪ ⎧ x n = a n n ( n ) b n ( n ) , x i = a i i ( i ) − ∑ j = i + 1 n a i j ( i ) x j + b i ( i ) ( i = n − 1 , n − 2 , ⋯ , 2 , 1 )
它便是原方程组的解,实现上述求解过程的方法称为Gauss消元法
Gauss列主元素消去法
为避免小主元做除数,在第k步 k = ( 1 , ⋯ , n − 1 ) \ k=(1,\cdots,n-1) k = ( 1 , ⋯ , n − 1 ) 消元时,在 A ( k ) \ A^{(k)} A ( k ) 的第k列主对角元以下(含主对角元)的元素中挑选绝对值最大者,记对应行的行数为idx,则先交换第k行和第idx行后再进行消元计算,每一步都按列选主元的Gauss消元法称为Gauss列主元素消去法。
Matlab实现
求解系数矩阵为上三角或下三角的函数
function X = linear_solve(A,b)
%LINEAR_SOLVE 求解线性方程组 AX=b
% A只能是上三角或者下三角矩阵
if istriu(A)
%如果A是上三角
s = size(A);
r = s(1, 1); % 获取行数
c = s(1, 2); % 获取列数
X=zeros(1, c);% 初始化X
for rn=r:-1:1
a = A(rn, :);
mask_a = ones(1, c);
mask_a(rn) = 0;
x = (b(rn) - sum(mask_a .* a .* X)) / a(rn);
X(rn) = x;
end
elseif istril(A)
%如果A是下三角
s = size(A);
r = s(1, 1); % 获取行数
c = s(1, 2); % 获取列数
X=zeros(1, c);% 初始化X
for rn=1:r
a = A(rn, :);
mask_a = ones(1, c);
mask_a(rn) = 0;
x = (b(rn) - sum(mask_a .* a .* X)) / a(rn);
X(rn) = x;
end
else
error('A需要为上三角或者下三角');
end
end
Gauss消去法解线性方程组
function X = Gauss_solve(A, b, pri)
%GAUSS_SOLVE 利用高斯消去法解线性方程组
% inputs:
% A, b为系数
% pri:是否选主元,1为选主元,0为不选住院
% outputs:
% X:解的矩阵
%
b = reshape(b, [length(b), 1]); % 确保b是列矩阵
Ab = [A b]; %将A和b列合并
s = size(Ab);
if pri
% 选主元
for r=2:s(1)
[m, idx_m] = max(abs(Ab(r-1:end, r-1))); % 获取要消去的当前列的主元索引
idx_m = idx_m + r - 2;
% 将主元行与当前行做交换
temp = Ab(r-1, 1:end);
Ab(r-1, 1:end) = Ab(idx_m, 1:end);
Ab(idx_m, 1:end) = temp;
% 进行消去
ratio = Ab(r:end, r-1) / Ab(r-1, r-1);
Ab(r:end, 1:end) = Ab(r:end, 1:end) - ratio * Ab(r-1, 1:end);
end
else
% 不选主元
for r=2:s(1)
ratio = Ab(r:end, r-1) / Ab(r-1, r-1);
Ab(r:end, 1:end) = Ab(r:end, 1:end) - ratio * Ab(r-1, 1:end);
end
end
A = Ab(1:end, 1:end-1);
b = Ab(1:end, s(2));
X = linear_solve(A, b);
end