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