线性方程组的直接解法

写在前面的话:在计算机功能日益强大的今天,我们在学习生活中很少会用下面的方法手动解方程组。但是了解这些方法,继而思考这些方法的思想以及起源未尝不是一件有趣的事。想象一下,你身处千年前的时代,面对着一个包含多个未知量方程组,你会怎么解决,怎么系统的求解,怎么更快的求解?

P1.高斯消去法

高斯消去法是解线性方程组最基础的方法。
  想象一下, 假如我身处2000年前,本来在家中午睡,突然梦到一道数学题描述如下(剧本需要):2{x_1} + 3{x_2} + 543{x_3} + \cdots + 543{x_{100}} = 0\\22{x_1} + 53{x_2} + 54783{x_3} + \cdots + 97643{x_{100}} = 23012\\ \cdots \\ 1232{x_1} + 3134{x_2} + 514213{x_3} + \cdots + 5243{x_{100}} = 3672  如上,一个1次100元方程组,我很想解决这个问题。由于时代条件限制,只在一些不多见的关于算术的书本中见过鸡兔同笼问题,算是对多元方程有了勉强的认识。可这倒好,一下子给我来个100个鸡兔。额,肯定不是鸡兔,是有几万个爪子的怪物。 我很想知道它是什么,于是我开始思考。
  先从简单的来(这是解决复杂难题最好的思路),2元方程组我会解了,那么我要不试一试3元的方程组,先不管这个100的!在解多元方程的时候,我有两个方法:代入法和消元法。代入法是将所有未知数用其中一个表示,最后解出这个数;消元是说我不停给这些式子减一减、加一加,最后变成一个只有一个未知数的式子。(本质上是一样的)
  我对消元法很有好感,就加加减减算出了3元问题,也算出来了4元、5元的。由于我是随缘加减,到了10元以上就发愁了,没法做变化了,式子太乱了!
  于是,我开始逆向考虑(这是也是解决难题很好的思路)。我解决简单问题时,经过很多次变换后得到一个只有一元的方程。再上一步,必然是将两个元的方程组并为一个;再上一步,是将三个元的方程组并为两个,......
  那么,怎么才能最简单地进行合并呢?不妨将最后一步抽象出来:  倒数第二步:  ......
  依次推最原始有100个,式子可能是这个样子的:
  很容易就能发现规律,随着未知数不断变多,以系数组成的矩阵每一行系数不断减少,就像一个三角形,那么我做运算的时候如果能构造出这么个三角形,每一次迭代该是多么简单。回过头来看原来的方程组,假如我做消去的时候(假如第一步用式子2减去式子1,消去式子2中的x1),我把第2到100行都这么干,都消去x1,那么就可以在下面的99组中只要解决99个未知数就行了(高斯说这是有解的->代数基本定理)依次递推,最后一个方程只要解决1一个未知数就ok了,同时三角形也出来了。所以高斯消去法就是这么干的:
  step1:\left[ {\begin{array}{*{20}{c}} {{a_{11}}}&{{a_{12}}}&{{a_{13}}}&{{a_{14}}}& \cdots &{{a_{1n}}}\\ {{a_{21}}}&{{a_{22}}}&{{a_{23}}}&{{a_{24}}}& \cdots &{{a_{2n}}}\\ {{a_{31}}}&{{a_{32}}}&{{a_{33}}}&{{a_{34}}}& \cdots &{{a_{3n}}}\\ {{a_{41}}}&{{a_{42}}}&{{a_{43}}}&{{a_{44}}}& \cdots &{{a_{4n}}}\\ \vdots & \vdots & \vdots & \vdots & \cdots & \vdots \\ {{a_{n1}}}&{{a_{n2}}}&{{a_{n3}}}&{{a_{n4}}}& \cdots &{{a_{nn}}} \end{array}} \right] \to \left[ {\begin{array}{*{20}{c}} {{a_{11}}}&{{a_{12}}}&{{a_{13}}}&{{a_{14}}}& \cdots &{{a_{1n}}}\\ 0&{{k_{22}}{a_{22}}}&{{k_{23}}{a_{23}}}&{{k_{24}}{a_{24}}}& \cdots &{{k_{2n}}{a_{2n}}}\\ 0&{{k_{32}}{a_{32}}}&{{k_{33}}{a_{33}}}&{{k_{34}}{a_{34}}}& \cdots &{{k_{3n}}{a_{3n}}}\\ 0&{{k_{42}}{a_{42}}}&{{k_{43}}{a_{43}}}&{{k_{44}}{a_{44}}}& \cdots &{{k_{4n}}{a_{4n}}}\\ \vdots & \vdots & \vdots & \vdots & \cdots & \vdots \\ 0&{{k_{n2}}{a_{n2}}}&{{k_{n3}}{a_{n3}}}&{{k_{n4}}{a_{n4}}}& \cdots &{{k_{nn}}{a_{nn}}} \end{array}} \right]\......
  step99:\left[ {\begin{array}{*{20}{c}} {{a_{11}}}&{{a_{12}}}&{{a_{13}}}&{{a_{14}}}& \cdots &{{a_{1n}}}\\ 0&{{k_{22}}{a_{22}}}&{{k_{23}}{a_{23}}}&{{k_{24}}{a_{24}}}& \cdots &{{k_{2n}}{a_{2n}}}\\ 0&0&{{j_{33}}{a_{33}}}&{{j_{34}}{a_{34}}}& \cdots &{{j_{3n}}{a_{3n}}}\\ 0&0&0&{{l_{44}}{a_{44}}}& \cdots &{{l_{4n}}{a_{4n}}}\\ \vdots & \vdots & \vdots & \vdots & \cdots & \vdots \\ 0&0&0&0& \cdots &{{h_{nn}}{a_{nn}}} \end{array}} \right]
  最终得到了我想要地迭代格式,问题解决。值得一提的是,高斯法在《九章算术》中已经有了记载。

P2.三角分解法

  直接法解方程组最后的步骤必然是变换成半角矩阵回代解,但是我们可以在之前的步骤对矩阵进行一些处理,使得计算更加方便。
   我们知道的是:对A 施行初等行变换相当于用初等矩阵左乘A(列变换则右乘),于是我们将高斯消去法对矩阵进行变换(假设都是行变换)的结果,用有限个矩阵左乘A来表示。(A为方程组的系数矩阵)下面就是要搞清楚这有限个矩阵都是些什么东西?
  不妨将第k次变换对应的矩阵记为 ,考虑第一次变换:\left\{ \begin{array}{l} {a_{11}}{x_1} + {a_{12}}{x_2} + {a_{13}}{x_3} + \cdots = {b_1}\\ {a_{21}}{x_1} + {a_{22}}{x_2} + {a_{23}}{x_3} + \cdots = {b_2}\\ {a_{31}}{x_1} + {a_{32}}{x_2} + {a_{33}}{x_3} + \cdots = {b_3}\\ \cdots \end{array} \right. \to \left\{ \begin{array}{l} {a_{11}}{x_1} + {a_{12}}{x_2} + {a_{13}}{x_3} + \cdots = {b_1}\\ 0{x_1} + {{a'}_{22}}{x_2} + {{a'}_{23}}{x_3} + \cdots = {{b'}_2}\\ 0{x_1} + {{a'}_{32}}{x_2} + {{a'}_{33}}{x_3} + \cdots = {{b'}_3}\\ \cdots \end{array} \right.   高斯消去法的第一步将除了第一个方程外,剩下所有方程的x1全部消去。想象一下,这个过程是第二行倍乘一个系数,使得同第一行相减消去x1项,下面各行类似。不难得出:\begin{array}{l} {L_1} = \left[ {\begin{array}{*{20}{c}} 1&{}&{}&{}&{}\\ {{m_{21}}}&1&{}&{}&{}\\ {{m_{31}}}&{}&1&{}&{}\\ \vdots &{}&{}& \ddots &{}\\ {{m_{n1}}}&{}&{}&{}&1 \end{array}} \right]\\ \vdots \\ {L_k} = \left[ {\begin{array}{*{20}{c}} 1&{}&{}&{}&{}&{}\\ {}& \ddots &{}&{}&{}&{}\\ {}&{}&1&{}&{}&{}\\ {}&{}&{{m_{k + 1,k}}}&1&{}&{}\\ {}&{}& \vdots &{}& \ddots &{}\\ {}&{}&{{m_{n,k}}}&{}&{}&1 \end{array}} \right] \end{array}   最终有:  这个时候观察一下,这个东西是什么?我们目前为止就是将高斯法的矩阵变换用数学方式(矩阵乘法)写出来,那么由高斯消去法得到的结果可以知道,消去法最后得到的方程组的系数矩阵是一个上三角矩阵。是消去法最后的结果,故其为一个上三角矩阵。最后将我们的结果写写好,记,为各个行变换矩阵的逆的连乘(显然是一个单位下三角矩阵):

定理:设为n 阶矩阵, 如果的顺序主子式, 则可分解为一个单位下三角矩阵和一个上三角矩阵的乘积,且这种分解是唯一的。
证明:存在性,由高斯消去法原理就可以保证。
  唯一性,唯一性证明的套路就是找一个同类的,推出矛盾或者相同:当可逆时,,由于可逆,则,右边为上三角矩阵, 左边为单位下三角矩阵,所以左右侧只能为单位阵。故。

下面开始解方程:,花了这么大的力气搞出来的结果,终于可以看到用处了。搞出来的两个半角矩阵可以直接解方程组:

P3.高斯主元素消去法

  可能有朋友看了两个方法,会发现似乎是有一些不妥:在上面两个方法中我们一直回避一个问题P1中,进行消去的时候,会出现当某个对角系数为0时,而无法计算倍乘数的可能;P2中,我们讲LU分解定理时,有一个条件叫A的顺序主子式不为0。这个0有时候让人又爱又恨(和平方一样),总会给人一些变数,变数越多越难捉摸;变数越多,误差越大。
  再放开了讲,这个“0”的范围可以再进一步扩大为“一个极小的数”。当用一个极小的数作除数进行消去时, 会导致其他元素数量级的严重增长和舍入误差的扩散,会使得解出现很大的偏差。
  为此我们再来考虑“0”的问题,便产生了高斯主元素消去法,目的就在于避免采用绝对值小的主元素。一般来说,最好每一步选取系数矩阵中绝对值最大的元素作为主元素, 以使高斯消去法具有较好的数值稳定性。换一个角度思考一下:是不是就是在进行消去的前一步先把行列式换换位置,保证按主元素的大小进行排列,第一个式子可以不动,下面的各个式子按对应未知数的系数找出最大的放在各行,注意已经排好的就不用再动了(下一行不用管上面的行)。(列主元素消去法)
  相比直接消去,或者LU分解,就是多了一个排序过程,自然出现另一个排序矩阵P。以列主元LU法为例:PA = LU,可以添加记录主行的数组记录主行变换。

P4.平方根法 (一种类似LU分解方式)

  针对正定对称矩阵进行特殊的三角分解。这么进行考虑,我们已知:,造出为单位上三角阵(如果考虑到对称性的好处,很容易就可以自然而然这么想;如果不懂,就先这么干,后面会豁然开朗的,数学有时候就是这样),听说A对称?搞一下,由于分解的唯一性,必然有,就要这个结果!这样我们就可以扔了一个变量了,只需要考虑,电脑也可以少储存一个矩阵,多好的结果啊。下面只需要解,就行了。

对称阵的三角分解,设A为n 阶对称阵, 且A的所有顺序主子式均不为零, 则A 可唯一分解为 ,其中L为单位下三角阵,D为对角阵.
  值得一提的是,我第一次学习时将它与后面的Cholesky分解条件搞混了,也不知道咋想的,解一个非正定的对称矩阵时将它分解好了,竟然觉得很奇怪为啥不正定还能这么做(。笑)。

  对称用过了,正定体现在哪里?当矩阵正定,则D的对角元素均大于0(一阶主子式大于0),那么就可以开根号了啊。简记为,放进方程中有:(不再是单位下三角矩阵了)

Cholesky分解。如果A为n 阶对称正定矩阵, 则存在一个实的非奇异下三角阵L ,使, 当限定L的对角元素为正时, 这种分解是唯一的。
  分析:矩阵对称,能够进行对称分解;强调正定,能够将对角元素开方,再放到上下三角中去;限定L的对角元素为正时, 分解才唯一,是去除开方时出现的负根。

P5.改进平方根法(从提高计算速度来说,这个方法还是挺有实际意义的)

  数学家们为了更方便的计算平方根法,索性提出了一个改进方法(哼哼,连开方都不想算)。上一段中,讲到平方根法,其中将对角元素开方入半角阵,但是计算机计算开方是一件挺麻烦的事,所以数学家说,那就别管他了,我们算我们的。
  于是回到P4对称矩阵的分解定理,A为n 阶对称阵,则可以分解 ,矩阵L&D*的值是容易解出来的。我们只需要考虑解方程组:

  最后解半角回代,结束。

你可能感兴趣的:(线性方程组的直接解法)