Gauss 消元法

算法过程

高代已经讲过,我们在此略过 Gauss 消元法的实际操作流程. 直接说明过程当中的概念.

首先我们要研究的线性方程组是

以及 ,Gauss 消元法第一步就是将第一列除对角部分都消去为 ,那么就是等价于给 左乘如下的矩阵

从而

依次进行下去有 等等.

消元运算分析

整个消元过程中,第 列消元时,有

  • 个乘除法
  • 个减法

那么整个消元过程中,有

个乘除法. 我们将其展开有

因此计算的复杂度为 .

LU 分解

三角分解

我们接下来讨论矩阵的 LU 分解及其在线性方程组的应用,LU 分解即

的矩阵分解方式,其中 是单位下三角矩阵, 是上三角矩阵,容易知道

LU 分解有相当多的变种:

  • Doolittle 分解: 是单位下三角阵, 是上三角阵.
  • Crout 分解: 是下三角阵, 是单位上三角阵.
  • LDU 分解: 是单位下三角阵, 是单位上三角阵, 是对角阵. 这个实际上就是 Doolittle 分解或 Crout 分解的简单推论.
  • 是对称正定的,那么有 Cholesky 分解 为下三角阵. 若要避免开根号,则有 ,其中 是单位下三角阵, 是对角阵.
  • 是三对角阵时,对应的解法称为追赶法.

前代法

我们考虑通过

来进行求解,其中求解 的部分称为前代法,也就是解下三角线性方程组的问题.

是一个下三角矩阵,那么我们根据矩阵乘法逐个往下:

于是我们得到如下的表达式:

因此,根据如上的计算过程,有如下的代码:

for j=1:n-1
	b(j) = b(j)/L(j,j)
	b(j+1:n) = b(j+1:n) - b(j) * L(j+1:n,j)
end
b(n) = b(n)/L(n,n)

注意

上述的代码是教材附的,但是伪代码的思路实际上和讲的思路有差异,代码是直接对 进行操作使得它变为 . 后面的回代法也是一样的.

回代法

同理,对于

求解 可以使用回代法,也就是上三角的情形.

我们直接给出如下的计算公式:

有如下代码:

for j=n:-1:2
	y(j) = y(j)/U(j,j)
	y(1:j-1) = y(1:j-1) - y(j) * U(1:j-1,j)
end
y(1) = y(1)/U(1,1)

LU 分解的导出

LU 分解实际上是从 Gauss 消元法导出的,我们考虑每步消元的 ,那么第 步消元后得到的矩阵实际上就是

那么依次到 步后有

,从而

其中 是单位下三角矩阵,这是由于每个 都是单位下三角矩阵,此外 是上三角矩阵,显然这是因为 Gauss 消元法每步消元之后都还是上三角的.

有如下的算法伪代码:

for k=1:n-1
	A(k+1:n,k) = A(k+1:n,k)/A(k,k)
	A(k+1:n,k+1:n) = A(k+1:n,k+1:n) - A(k+1:n,k) * A(k,k+1:n)
end