在初高中学习过了二元、多元方程组的基础解法,但是都是依赖我们手工变换方程组,然后进行大量计算,求解出各个未知量。这里要学习的是,多元方程组的通用解法,并且这些解法都是可以按照公式编制出计算机程序的。
首先,一个有n个未知量的n个方程构成的方程组:
{ a 11 x 1 + a 12 x 2 + ⋯ + a 1 n x n = b 1 a 21 x 1 + a 22 x 2 + ⋯ + a 2 n x n = b 2 ⋮ a n 1 x 1 + a n 2 x 2 + ⋯ + a n n x n = b n \left\{\begin{array}{l}{a_{11} x_{1}+a_{12} x_{2}+\cdots+a_{1 n} x_{n}=b_{1}} \\ {a_{21} x_{1}+a_{22} x_{2}+\cdots+a_{2 n} x_{n}=b_{2}} \\ {\vdots} \\ {a_{n 1} x_{1}+a_{n 2} x_{2}+\cdots+a_{n n} x_{n}=b_{n}}\end{array}\right. ⎩⎪⎪⎪⎨⎪⎪⎪⎧a11x1+a12x2+⋯+a1nxn=b1a21x1+a22x2+⋯+a2nxn=b2⋮an1x1+an2x2+⋯+annxn=bn
其中 a i j a_{ij} aij称为方程组的系数。则他们可以写成矩阵的形式:
A x = b Ax = b Ax=b
则 A A A称为系数矩阵,若系数矩阵非奇异,那么这个方程组就有唯一解。 x = ( x 1 , x 2 , . . . , x n ) T x=(x_1,x_2,...,x_n)^T x=(x1,x2,...,xn)T
A = [ a 11 , a 12 , . . . , a 1 n a 21 , a 22 , . . . , a 2 n ⋮ , ⋮ , ⋮ , ⋮ , ⋮ , ⋮ , . . . , ⋮ a n 1 , a n 2 , . . . , a n n ] , x = [ x 1 x 2 ⋮ x n ] , b = [ b 1 b 2 ⋮ b n ] A=\left[ \begin{array}{c}{a_{11},a_{12},...,a_{1n}} \\ {a_{21},a_{22},...,a_{2n}} \\ {\vdots,\vdots,\vdots,\vdots,\vdots,\vdots,...,\vdots} \\ {a_{n1},a_{n2},...,a_{nn}}\end{array}\right] , x = \left[ \begin{array}{c}{x_{1}} \\ {x_{2}} \\ {\vdots} \\ {x_{n}}\end{array}\right], b=\left[ \begin{array}{c}{b_{1}} \\ {b_{2}} \\ {\vdots} \\ {b_{n}}\end{array}\right] A=⎣⎢⎢⎢⎡a11,a12,...,a1na21,a22,...,a2n⋮,⋮,⋮,⋮,⋮,⋮,...,⋮an1,an2,...,ann⎦⎥⎥⎥⎤,x=⎣⎢⎢⎢⎡x1x2⋮xn⎦⎥⎥⎥⎤,b=⎣⎢⎢⎢⎡b1b2⋮bn⎦⎥⎥⎥⎤
最基础的方法就是使用**克莱姆(Cramer)**法则,前面方程的解:
x j = D j D x_j = \frac{D_j}{D} xj=DDj
其中 D D D为 A A A行列式, D j D_j Dj是把 D D D第 j j j列用向量 b b b替换得到的行列式。
但是克莱姆法则算法的时间复杂度 O ( ( n 2 − 1 ) n ! ) O((n^2-1)n!) O((n2−1)n!),也就是说其运算时间随着未知数的数量增多,会急剧增加,以至于我们现在的计算力根本无法计算出结果。
由于上面的问题,又诞生了许多求解线性方程组的方法,他们可以分为两类:直接方法、迭代方法。本文说的就是直接方法。
高斯消去法,实际上类似于我们手工求解方程组的方法,通过逐次消元把 A A A转化成上三角矩阵。
在方程组中实际上就是,第一个方程原封不动,用第一个方程* − a 21 a 11 -\frac{a_{21}}{a_{11}} −a11a21加到第二个方程上,消去第二个方程的第一个未知数 x 1 x_1 x1(因为其系数为0);并用类似的方法,利用已经消元的第二个方程对第三个方程消元,最终最后一个方程就是这样的形式: x n = b n x_n=b_n xn=bn
这样就求解出来了 x n x_n xn的值,将其带入倒数第二个方程可以求得 x n − 1 x_{n-1} xn−1的值,进一步就可以得到所有的未知量的值。
上面两段介绍的就是顺序高斯消去法的内容,因为他是按照原始方程组顺序进行计算的,所以叫做顺序高斯消去。
上面说的顺序高斯消去的过程,使用到的 a k k ( k ) a_{kk}^{(k)} akk(k)称为主元素(上标的 k k k表示这是第k次消元后得到的结果),称为主元素,那么根据上面顺序高斯消去法的计算,我们知道如果主元素太小误差就会放大,如果主元素为0那么顺序高斯消去法根本就无法计算。
列主元高斯消去法,就是在第k次消元计算之前,将行编号大于等于k的所有行按照第k列进行绝对值排序。通过这个排序操作,让我们高斯消去过程中的主元素尽量保持在较大的值,可以有效减小误差和减少无法计算的情况出现。(**当然,对系数矩阵 A A A某行排序交换顺序的时候, b b b中的顺序也要随之改变)
要学习矩阵方式的方法,那么我们就先了解一个直接法的矩阵形式以帮助理解。
由高斯消去法可知,每一次消元操作,都可以看做是在 A A A的左边乘了一个矩阵,这个矩阵可以将某一行乘一个数并加到另一行。所以高斯消去法可以看成是下面的形式:
A = L 1 − 1 L 2 − 1 . . . L n − 1 − 1 A ( n ) = L U A = L_1^{-1}L_2^{-1}...L_{n-1}^{-1}A^{(n)} = LU A=L1−1L2−1...Ln−1−1A(n)=LU
因为第k次消元时,第k个方程不会变,编号大于k的方程才会变,所以所有 L i ( − 1 ) L_i^{(-1)} Li(−1)的乘积 L L L是一个单位下三角矩阵。矩阵 U U U就是我们高斯消去法最终得到的系数矩阵,所以 U U U是一个上三角矩阵。
直接三角分解法又称为杜立特(Doolittle)分解,其内容如下
设 n n n阶方阵 A A A的各阶顺序主子式均不为0,则存在唯一的单位下三角矩阵 L L L和上三角矩阵 U U U使 A = L U A=LU A=LU
如果某阶顺序主子式为0,那么消去计算就无法进行,所以不能为0。
平方根法的分解又称为对称正定矩阵的乔列斯基(Cholesky)分解。
由前面的杜立特分解可知,所有顺序主子式大于零的矩阵可分解为 A = L U A=LU A=LU,令矩阵 D D D为对角矩阵,其对角线上的值等于 U U U中对角线上的值。令矩阵 M = D − 1 ) U M=D^{-1)}U M=D−1)U,则 M M M为单位上三角矩阵。故,原方程可分解为:
A = L D M A=LDM A=LDM
如果 A A A是对称矩阵,那么可知 M = L T M=L^T M=LT,所以有分解式:
A = L D L T A = LDL^T A=LDLT
令 G = L D 1 2 G=LD^{\frac{1}{2}} G=LD21,则可以得到 A = G G T A=GG^T A=GGT。故可以得出下面分解方法。
设有对称正定矩阵 A A A,那么他具有如下分解: A = G G T A=GG^T A=GGT
追赶法专门用于三对角方程组。
平方根法 A = L D M A=LDM A=LDM,令 T = L D T=LD T=LD,则 T T T为下三角矩阵,所以可以得到克劳特(Crout)分解,其内容如下:
对于一个对称正定矩阵 A A A,他可以分解成如下形式:
A = T M A = TM A=TM