关于线性方程组的数值解法一般有两类: 直接法和 迭代法
1. 直接法:直接法就是经过有限步算术运算,可求得线性方程组精确解的方法(若计算过程中没有舍入误差)。常用于求解低阶稠密矩阵方程组及某些大型稀疏矩阵方程组(如大型带状方程组)。
2. 迭代法:迭代法就是用某种极限过程去逐步逼近线性方程组精确解的方法。 优点:存储单元少、程序设计简单、原始系数矩阵在计算过程始终不变等; 缺点:存在收敛性及收敛速度问题。常用于求解大型稀疏矩阵方程组(尤其是由微分方程离散后得到的大型方程组)。
本文主要讲直接方法。
1 高斯消去法
高斯消去法也称为逐次消去法,是一个古老的求解线性方程组的方法,特别是由其改进而得到的选主元素消去法、三角分解法仍然是目前计算机上常用的有效方法。
高斯消去法的过程写成定理即为:
设,其中。
1. 如果,则可通过高斯消去法将约化为等价的三角形线性方程组(图1),且计算公式为:
(1)消元计算
(2)回代计算
2. 如果为非奇异矩阵,则可通过高斯消去法(及交换两行的初等变换)将方程组约化为方程组(图1)。
上述消元和回代过程总的乘除法次数为
,加减法次数为
。
高斯消去法写成MATLAB代码为:
function [x,t] = GaussEli(A,b)
% 高斯消去法
% A: 系数矩阵
% b: 载荷矩阵
% x: 解矩阵
% t: 时间
tic
[row,col] = size(A);
x = zeros(row,1);
% 消元过程
for k = 1:row-1
if A(k,k) == 0
print('主对角元不能为0!');
else
for i = k+1:row
m_ik = A(i,k)/A(k,k);
for j = k+1:col
A(i,j) = A(i,j) - m_ik*A(k,j);
end
b(i) = b(i) - m_ik*b(k);
end
end
end
% 回代过程
x(end) = b(end)/A(end,end);
for k = row-1:-1:1
sum = 0;
for j = k+1:col
sum = sum + A(k,j)*x(j);
end
x(k) = (b(k)-sum)/A(k,k);
end
t = toc;
end
但是,由算法可知,高斯消去法对于某些简单的矩阵可能会失败,例如
2 列主元消去法
由高斯消去法可知,在消元过程中可能出现
的情况,这时消去法将无法进行;而且即使满足主元素
但很小时,用其作除数,会导致其他元素数量级的严重增长和舍入误差的扩散,使得最后得到的计算结果不可靠。这也就是小主元带来的麻烦,所以还应该避免采用绝对值小的主元素
。
由此来看,对于一般矩阵来说,最好每一步选取系数矩阵(或消元后的低阶矩阵)中绝对值最大的元素作为主元素,以使得高斯消去法具有较好的数值稳定性。这就是全主元素消去法的思想,不足之处在于其在选主元时要花费较多机器时间,目前主要使用的是列主元消去法。
列主元消去法总体过程与高斯消去法基本一致,唯一不同之处在于在选主元之前增加了一步按列选主元,其过程直接写成MATLAB代码为:
function [x,t] = MainColGaussEli(A,b)
% 列主元素高斯消去法
% A: 系数矩阵
% b: 载荷矩阵
% x: 解矩阵
% t: 时间
tic
[row,col] = size(A);
x = zeros(row,1);
% 消元过程
for k = 1:row-1
% 按列选主元
max&