本篇文章有两个目标。第一是解释实际问题中大型线性方程组 Ax=b 的一种解法,事实是,工程或经济学中大型和现实的问题能够引导我们更深入理解这些知识。但是有一个很重要应用却不需要大量的准备工作。
另一个目标是说明系数矩阵具有的一些特殊性质,为了方便我们用同一个应用进行讲解。大型矩阵几乎总是有一个清晰的模式-对称和很多零元素。因为一个稀疏矩阵包含的信息远小于 n2 个,所以计算应该更快。我们将观察带状矩阵,看看集中在对角线附近是如何加快消元的,为此我们将看到一个特殊的三对角矩阵。
看方程(6)中的矩阵,它是通过将微分方程变化为矩阵方程得到的。这是对每个
x
求
这是关于位置函数
u(x)
的线性方程,可以在解中加上任何组合
C+Dx
依然满足要求,因为
C+Dx
的二阶导为零,不影响结果。对于两个任意常数
C,D
的不确定性,通过在区间的两端添加一个边界条件就能够移除:
记住,我们的目标是产生一个离散的问题-换句话说,一个线性代数中的问题。为此我们只可以接受
f(x)
有限的信息,描述在
n
个相等的区间点
第一个问题是:我们如何替换导数
d2u/dx2
?一阶导数可以近似表示为有限步长内停止的
Δu/Δx
并且不允许
h(orΔx)
趋近于零,
Δu
可以是前面的,后面的或中间的:
最后一个关于
x
对称,它是最精确的。对于二阶导数,只是利用
它也有关于
x
对称的优点。重复一遍:当
对每个点
第一个和最后一个(
j=1,j=n
)包含
u0=0,un+1=0
,他们是已知的边界条件,如果这些值非零的话,他们就转化成右边的值。这
n
个方程(5)的结构可以更矩阵形式来更好的可视化,我们选择
现在,我们将求解方程(6),它的系数矩阵非常有规律,有许多特殊的性质,其中有三个是非常基本的:
- 矩阵
A
是三对角的。所有非零元素位于主对角线以及附近的两条对角线上,这条窄带以外的
aij=0 ,这些零大大简化了高斯消元过程。 - 矩阵是对称的。每个元素
aij
等于它的镜像
aji
,使得
AT=A
。上三角矩阵
U
将是下三角矩阵
L 的转置, A=LDLT 。 A 的对称性反映了d2u/dx2 的对称性,奇导数像 du/dx,d3u/dx3 将破坏对称性。 - 矩阵是正定的。这个额外的性质说明主元是正的,在理论和实践中不需要行变换。这和本文末尾要将的矩阵 B (非正定的)正好相反,在没有行变换的情况下,它将对舍入非常敏感。另外关于正定的概念我会在以后的文章中详细介绍!
我们返回到
跟一般的 5×5 矩阵相比,这一步主要有两个简化:
- 在主元下面只有一个非零元素
- 主元所在的行非常短
乘数因子是 ℓ=−12 ,新的主元是 32 。更进一步,三对角模式保留着:每步消元都允许这两个简化。
最终结果是
LDU=LDLT
,注意主元!
三对角矩阵的
L,U
分解因子是二对角矩阵,三个因子和矩阵
A
一样对角线有同样的带状结构,注意
稀疏因子
带状矩阵就是在
当
w
趋近
图1:带状矩阵 A 和它的因子
这是我们最终得到的操作次数,我们强调一点,像 A 那样的有限差分矩阵有逆,在求解
我们希望本例增强读者对消元的理解,它是实践中遇到的一个大型线性方程实例,接下来对于
n
个未知量的
舍入误差
理论上非奇异情况有完整的主元(考虑行变换),实践中,需要更多的行交换否则计算的解可能变得毫无价值。接下来我们重点来讲如何使消元更加稳定-为什么需要它以及如何做。
对于中等大小的系统,比如说
那么所有这些误差是如何影响 Ax=b 的最终误差的呢?
这不是一个简单的问题。而这个问题被约翰 ⋅ 冯 ⋅ 诺依曼碰到了,在计算机使得100万步操作成为可能的时候,是他引领了数学。事实上高斯和冯 ⋅ 诺依曼的结合给出了简单的消元算法,虽然冯诺依曼高估了最后的舍入误差。威尔金森(Wilkinson)找到这个问题的正确方法,并且他的书到现在依然是经典。
我们将给出两个简单的例子来说明舍入误差的重要性:
A
几乎是奇异的而
第一个解是 u=2,v=0 ,而第二个解是 u=v=1 。 b 中第五位数的改变放大到解中第一位数的改变,没有任何数值方法可以避免它对小扰动这种敏感,病态条件能够从一个地方转到另一个地方,但是无法移除。真实解都如此敏感更别说计算解了。
第二点如下:
15、即便是一个
我们很遗憾的说:对于矩阵
四舍五入将得到
−10000v=−10000
或者
v=1
。首先我们用正确值
v=.999
(保留三位小数)回代将得到
u=1
:
但是如果接受
v=1
,我们将得到
u=0
:
计算结果完全不对,
B
是well-conditioned但是消元明显不稳定,
小主元.0001带来了不稳定,补救方法很明显-换行
16、一个小主元迫使消元中发生变化。通常我们比较同一列所有可能的主元,将最大主元换到当前的位置
对于
B
来讲,.0001将和下面的1比较,立马进行行交换,从矩阵的角度来讲就是乘以一个置换矩阵
C
的主元是1和.9999,比
还有一种策略就是与其余所有列中最大主元进行交换,这时候可能不仅是行,也会有列交换。(这时候置换矩阵乘在右边)这么做的代价太高,上面的方法其实已经够了。
我们说完了数值线性代数的基本算法:带有行变换的消元法。一些进一步的完善,比如看整行或列,都是有可能的,但本质上读者现在知道了一台电脑如何解线性方程组,相比“理论”描述-找到 A−1 并相乘 A−1b -我们的描述已花费了大量时间和耐心,我希望能够用更简单的方法来解释 x <script type="math/tex" id="MathJax-Element-7260">x</script>是如何发现的,但是我认为我还没有找到。(博主心声:期待大家能有更好的方法提出来)