写在章前:求解线性方程组的数值方法大体上可分为直接法和迭代法两大类.。
直接法是指在没有舍入误差的情况下经过有限次运算可求得方程组的精确解法,又称为精确法;迭代法则是采取逐次逼近的方法,亦即从一个初始向量出发,按照一定的计算格式,构造一个向量的无穷序列,其极限才是方程组的精确解,只经过有限次运算往往得不到精确解。
在这一章,我们将主要介绍解线性方程组的一些基本的直接法。
1、三角形方程组的解法
①下三角方程组解法
考虑
这种方法叫前代法。
for
运算加减乘除次数为:
②上三角方程组解法
同样的考虑上三角方程组
for
对于一般线性方程组
(1) 用前代法解
(2) 用回代法解
所以对于求解一般的线性方程组来说,关键是如何将 A 分解为一个下三角阵 L 与一个
上三角阵 U 的乘积,这正是我们本节的目标。
2、高斯变换
欲把一个给定的矩阵 A 分解为一个下三角阵 L 与一个上三角阵 U 的乘积,最自然的做法便是通过一系列的初等变化,逐步将 A 约化为一个上三角阵,而又能保证这些变换的乘积是一个下三角矩阵。
①算法思路:
我们先回顾一下初等矩阵:
图源水印矩阵左乘表示行变换,右乘表示列变换。
我们这样分步考虑,首先找到一个下三角矩阵能把第一个列向量化到正确的形式。
这很简单。从左乘表示行变换来看,我们横着读矩阵
从变换结果来看,我们需要变换后除第一个分量外都为0。
综合起来就是,用前
很自然也很简单的方法是,只用第一个元素消掉后面的所有元素。(按理说应该有很多种组合方法。但是为了复合矩阵容易求,我们希望变换矩阵非零元素最好集中在一列,这样在求多个下三角矩阵的乘积时能保证不做非零重叠位置的加法。)
用
我们只需看剩下的n-1阶的部分,同上可用
以此类推。写出过程中的初等变换矩阵:
我们要求的是
初等矩阵的逆和复合十分好求:
得到
②算法的实现:
首先考虑存储。由于每次消元都要先计算消元的系数,这时需要给这个数分配内存。考虑到消元法矩阵的下矩阵都将被消为0,无用,我们可以利用这些位置存储系数。
举个栗子:
分解
算法代码:
for
③适用情况
通常称 Gauss 消去过程中,当前的
定理1:主元素均不为零的充分必要条件是 A 的前 k 阶顺序主子阵都是非奇异的。
证明:k=1时显然成立;
设用归纳法,设k-1时成立,则k阶时,k阶顺序主子式具有这样的形式
即
(主要证明思路就是进行的这种初等行变换不改变行列式的值,且是下三角,对角线元素均不为0和行列式不为0是充要条件)
将这个定理与前面的讨论相结合,就得到了下面的矩阵三角分解存在的充分条件.。
定理2:若的顺序主子阵均非奇异,则存在唯一的单位下三角阵和上三角阵使得
④算法比较:
cramer:
n+1个矩阵的行列式与n次除法。每个行列式有n!个元素,每个元素参与n-1次乘法
Gauss:
3、其他的三角分解
简单介绍:
其实三角分解分为两种。如果存在单位上三角阵L和下三角阵 U使得
在大型稀疏方程组中,最常见的是带状方程组,其系数矩阵是带状矩阵,非零元素仅集中在对角线附近的带状区域内。
矩阵A是带状矩阵,上半带宽为3,下半带宽为2,总带宽为6特别的,当上下带宽相等时我们A称方程组为等带宽方程组。总带宽为3的等带宽方程组我们又叫三对角方程组。
算法优化思想:
1、矩阵的存储
带状矩阵的压缩存储:带方程组的系数矩阵是压缩矩阵,应压缩存储。可把对角线转为行或列存储。
①对角线转为行,列标不变的压缩存储:把红色部分向中间靠,直到对角元对齐
压缩前后矩阵的下标的对应关系:
②对角线转为列,行标不变的压缩存储:把蓝色部分向右压齐
压缩前后矩阵的下标的对应关系:
2、以三对角矩阵为例介绍一次算法具体改进(追赶法):
宏观理解:如果对带状矩阵进行三角分解,所得两个三角矩阵保持带状结构,我们就可以对算法进行优化。
保带状结构定理 : 设为上半带宽为,下半带宽为的带状矩阵。其阶顺序主子式均不为零。则有唯一的三角分解式,其中为下半带宽为的单位下三角阵,为上半带宽为的上三角阵。
根据此定理,三角分解带宽以外的元素都为0,不必再参与计算。
在数值计算中,如三次样条插值或用差分方法解常微分方程边值问题,常常会遇到求解三对角方程组。我们改进算法得到追赶法。
追赶法的基本思想与Gauss消去法及三角分解法相同,只是由于系数中出现了大量的零,计算中可将它们撇开,从而使得计算公式简化,也大大地减少计算量。
数学思维:一图读懂三对角分解(Doolittle):
由于A只需消去ai变为上三角,所以只需用对角元消掉对角元下面的一个元素,L与U都保持带状结构当
原方程组转化为:
算法实现:存储时位置互不冲突,在A原位置存储即可。
代码就是还没写!在网上先荡了一个hhh
%追赶法解三对角线性方程组
大家知道,对于方程组来说,只要非奇异,方程组就存在唯一的解.。然而,非奇异并不能保证其顺序主子阵均非奇异.。因此,非奇异并不能保证 Gauss 消去过程能够进行到底。这样,我们的问题自然便是,怎样修改算法才能使其适应于非奇异矩阵呢?此外,在算法中计算时,位于分母上的主元虽不为零但很小时,由一章绪论我们知道,较小数作为分母,舍入误差会增大。如何解决这些问题呢?
解决方法是:如果出现小的主元,我们就选择一个合适的元素,交换 A 的行和列,将此元素换到主元位置上。选主元的方法有:列主元消去法,全主元消去法等。
①列主元消去法:
宏观理解:即首先
数学思维:整个过程中,A的变化为
其中,L为单位上三角矩阵,P为行置换矩阵,U是上三角矩阵
令
此为矩阵A的列三角分解。可用归纳法证明L是一个单位下三角矩阵,是Doolittle分解。
算法实现:
attention:记录行交换的一种方法——用向量
function
②全主元消去法:
宏观理解:即首先
数学思维:整个过程中,A的变化为
其中,L为单位上三角矩阵,P为行置换矩阵,U是上三角矩阵
(因为行列置换只在k行k列之后进行,所以这里列置换矩阵Q只是把单位矩阵k行和j(j>k)行交换了一下,是单位下三角矩阵。
令
此为矩阵A的全三角分解。
定理:若
算法实现:
function
平方根法与改进的平方根法不仅计算量仅是Gauss消去法的一半,其数值稳定性良好,是求解中小型稠密对称正定线性方程组的好办法。
①一般的平方根法
这种算法的优势在于,当需要针对同一个A解相对不同b的不同x的时候,新增的部分都可以以
cholesky分解定理:A为是对称正定矩阵,存在非奇异下三角矩阵L,使,其中的对角线元素均大于0。称为矩阵A的cholesky分解或平方根分解,矩阵L称为A的cholesky因子或平方根因子。
计算步骤:解方程整个过程如下
分解的数学推导:
把
这个过程其实也说明了Cholesky分解的唯一性。
②改进的平方根法
平方根法用到开方运算,为避免开方,我们可以进行如下的分解:
计算步骤:
分解的数学推导:
在介绍LDL分解之前首先介绍LDU分解:
在LU的基础上, 如果我们再进一步,引入对角矩阵D, 那么LU分解就变成了LDU分解。
这里仔细想想对角矩阵的作用,正着想,单位矩阵首先左乘了U,相当于对U的行做了倍数不同的乘法。所以逆过来想,用对角矩阵提出行的特定倍数(以对角元为单位提出倍数),可以把U变成单位上三角矩阵。
图源水印既然有了LDU分解, 那么结合LL分解,LDL分解就比较好理解了。其实LDL分解也能看成LL分解:
数学推导:
(观察公式发现有重复的计算:令
算法代码:
attention:在编程实现算法时,应考虑节省存储量,可将L的严格下三角元素存储在A的对角线位置上。
代码再补俺先赶进度掌握一下整体结构再抠细节(主要是也没搜到代码)
嗷嗷嗷老师已经咧到第8章了