数值计算之第三期:直接法解线性方程组

上一期链接:https://blog.csdn.net/axehead/article/details/105626675

参考资料:
数值分析教程 刘长安 西北工业大学出版社
数值计算方法 黄云清 科学出版社
数值分析简明教程 王能超 高等教育出版社 第二版

高斯消元

高斯消元的思想其实 我们在中小学的时候就已经接触过,比如给出一个二元一次方程组,我们先将某一个方程乘以一个数,使得这个方程与剩下的方程相加后能消去某一个元,从而得解。
对于一般的方阵而言(我们下面只讨论方阵,对于其它类型的系数矩阵以后讨论),设有n阶方阵 A = ( a i j ) A=(a_{ij}) A=(aij),和n维列向量 b = ( b k ) , x = ( x k ) b=(b_{k}),x=(x_{k}) b=(bk),x=(xk)组成线性方程组 A x = b Ax=b Ax=b(x是未知量).下面进行消元,总共分为n-1个步骤,但每一步都是类似的,即第k( 1 ≤ k ≤ 1\le k\le 1k n-1)步就是将第k行的 − a j k k a k k \frac {-a_{jk}^{k}}{a_{kk}} akkajkk倍加到第j( k + 1 ≤ j ≤ n k+1\le j\le n k+1jn)行,其中 a j k k a_{jk}^{k} ajkk表示的是第k步消元之前系数矩阵A的 a ( k j ) a_(kj) a(kj)元素(之所以加一个上标是为了区分每一步中对应的矩阵,因为每步消元矩阵A中的元素都会变化,同时每一步消元后系数矩阵A对角线上元素除 a n n a_{nn} ann外均不为零).注意!向量b要和A做同步的处理.
这样一来,第k步消元之前的方程组就可以表示为如下形式:
a 11 1 x 1 + a 12 1 x 2 + . . . + a 1 n 1 x n = b 1 1 a_{11}^{1}x_1+a_{12}^{1}x_2+\qquad ...+a_{1n}^{1}x_n=b_1^{1} a111x1+a121x2+...+a1n1xn=b11
       a 22 2 x 2 + . . . + a 2 n 2 x n = b 2 2 \qquad\ \ \ \ \ \ a_{22}^{2}x_2+\qquad ...+a_{2n}^{2}x_n=b_2^{2}       a222x2+...+a2n2xn=b22
           ⋱ \qquad\ \ \ \ \ \ \ \ \ \ \ddots           
       a k k k x k + . . . + a k n k x n = b k k \qquad\ \ \ \ \ \ \qquad a_{kk}^{k}x_k+...+a_{kn}^{k}x_n=b_k^{k}       akkkxk+...+aknkxn=bkk
        . . . . . . \qquad\ \ \ \ \ \ \ \qquad ......        ......
       a n k k x k + . . . + a n n k x n = b n k \qquad\ \ \ \ \ \ \qquad a_{nk}^{k}x_k+...+a_{nn}^{k}x_n=b_n^{k}       ankkxk+...+annkxn=bnk
其中,
a i j k + 1 = a i j k − a j k k a k k × a k j k , b i k + 1 = b i k − a j k k a k k × b k k , i = k + 1 , . . . , n ; j = k , . . . , n a_{ij}^{k+1}=a_{ij}^{k}-\frac {a_{jk}^{k}}{a_{kk}}\times a_{kj}^{k},b_{i}^{k+1}=b_i^k-\frac {a_{jk}^{k}}{a_{kk}}\times b_k^k,i=k+1,...,n;j=k,...,n aijk+1=aijkakkajkk×akjk,bik+1=bikakkajkk×bkk,i=k+1,...,n;j=k,...,n
n-1步消元做完之后,原来的系数矩阵A就变成了一个上三角矩阵,然后从方程的第n行开始向上解方程,就能得到方程组的解了,回代过程就不详细进行说明.

列主元消去法

上面高斯消元的第k步中追加条件,
a k = max ⁡ k ≤ i ≤ n ∣ a i k k ∣ a_k=\max \limits_{k\le i\le n}|a_{ik}^k| ak=kinmaxaikk
记j为达到最大值 a k a_k ak的最小行标 j ≥ k j\geq k jk,若 j > k j>k j>k,则交换A和b中的第k行和第j行再进行消元,这样能防止有效数字大量丢失而产生误差的可能性.可以试着考虑一下如果两个相近的数做减法,得到的结果的相对误差是怎么样的,两相差很大的数(比如1和 1 0 20 10^{20} 1020)做完减法再去和其他数做乘除法又是怎么样的,这里只是稍微做一下思路引导,有兴趣的朋友可以探讨一下.

全主元消去法

实质上就是列主元的升级版,原理类似,就是把第k步消元之前的矩阵拿来,在第k行到第n行中所有元素中检索出最大元然后与第k行第k列的元素交换(行交换和列交换)就可以.注意到这里是有列交换的,所以消元过程结束后必须把列恢复成原来的顺序.

矩阵的三角分解

LU分解

高斯消元的实质就是将矩阵分解成一个上三角矩阵 U = ( u i j ) U=(u_{ij}) U=(uij)和一个下三角矩阵 L = ( l ( i j ) ) L=(l(ij)) L=(l(ij))的乘积,然后求解.关于这个实质,我相信学过线代的朋友们肯定都懂得啦,毕竟矩阵的行列变换不过是在原矩阵左边或右边乘上若干个初等矩阵,这里不作详细解释了.
那么LU分解法解线性方程组就可以分为以下过程:
(1)将矩阵作LU分解
l i k = a i k a k k , j < i l_{ik}=\frac{a_{ik}}{a_{kk}},j\lt i lik=akkaik,j<i
u i j = a i j − a i k × a k j , i ≤ j u_{ij}=a_{ij}-a_{ik}\times a_{kj},i\le j uij=aijaik×akj,ij
其中, i , j = 1 , 2 , . . . , n i,j=1,2,...,n i,j=1,2,...,n
然后得到,
[ a 11 a 12 . . . a 1 n a 21 a 22 . . . a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 . . . a n n ] = \begin{bmatrix} a_{11} & a_{12} &...&a_{1n}\\ a_{21} & a_{22} &...&a_{2n}\\ \vdots&\vdots &\ddots&\vdots\\ a_{n1} & a_{n2} &...&a_{nn} \end{bmatrix}= a11a21an1a12a22an2.........a1na2nann=
[ 1 0 . . . 0 l 21 1 . . . 0 ⋮ ⋮ ⋱ ⋮ l n 1 l n 2 . . . 1 ] × [ u 11 u 12 . . . u 1 n 0 u 22 . . . u 2 n ⋮ ⋮ ⋱ ⋮ 0 0 . . . u n n ] \begin{bmatrix} 1& 0 &...&0\\ l_{21} & 1 &...&0\\ \vdots&\vdots &\ddots&\vdots\\ l_{n1} & l_{n2} &...&1 \end{bmatrix}\times\begin{bmatrix} u_{11} & u_{12} &...&u_{1n}\\ 0 & u_{22} &...&u_{2n}\\ \vdots&\vdots &\ddots&\vdots\\ 0 & 0 &...&u_{nn} \end{bmatrix} 1l21ln101ln2.........001×u1100u12u220.........u1nu2nunn
(2)求解线性方程组 U x = L − 1 b Ux=L^{-1}b Ux=L1b等价于求解下属方程组:
U x = y , L y = b Ux=y,Ly=b Ux=y,Ly=b
特别地,如果是求解矩阵A的逆,那么令 y = e i y=e_i y=ei其中 e i e_i ei是第i个元素为1其他为0的列向量,对应的向量x记为 x i x_i xi,则有 A − 1 = ( x 1 , x 2 , . . . x n ) A^{-1}=(x_{1},x_{2},...x_{n}) A1=(x1,x2,...xn)

特殊矩阵的三角分解

1.设A为正定矩阵,则A存在三角分解 A = L × L T A=L\times L^{T} A=L×LT,其中L为下三角阵
2.三对角矩阵的追赶法

说明

1.上一期讲完误差的相关概念,按照许多课本的设计这期应该要讲误差的传播及算法的数值稳定性,但是我觉得这东西跟其他算法啥的穿插地讲会更好一点,毕竟这样更直观,理解也会更深入。例如这期我们就提到了列主元消去法和全主元消去法比一般的高斯消元更有效.
2.本来安排的是高斯消元是串讲,LU分解是主讲的,但是实际写的时候觉得高斯消元的部分还是不要太简略的好,反倒是LU分解可以简略地说明一下即可.
3.LU分解的程序代码我不会放到文章当中(以后的文章当中也不会有代码段),但是我明天会放到我的资源中开放免费下载,仅供学习参考.

你可能感兴趣的:(数值分析)