对于矩阵A而言(A必须是方阵),假设A可以被分解成两个矩阵L和U的乘积,则有:
其中L为下三角矩阵(除了主对角线上的元素和主对角线以下的元素之外,其他元素都是0的矩阵),U为上三角矩阵(除了主对角线上的元素和主对角线以上的元素之外,其他元素都是0的矩阵)。以4x4矩阵为例,假设我们令下三角矩阵L和上三角矩阵U分别为:
则LU分解可被表示为如下形式,其中L和U中的元素均为未知数(除0外),矩阵A中的元素为已知数:
下面按照矩阵乘法的规律逐一写出矩阵A中每一个元素的等式。
对矩阵A中的第一行元素有:
(1)
(2)
(3)
(4)
对矩阵A中的第二行元素有:
(5)
(6)
(7)
(8)
对矩阵A中的第三行元素有:
(9)
(10)
(11)
(12)
对矩阵A中的第四行元素有:
(13)
(14)
(15)
(16)
如果矩阵A的尺寸为NxN,则共有NxN个方程和(N+1)xN个未知数。就本例而言,N=4,则共有16个方程和20个未知数。未知数的个数大于方程的个数,则方程组的解不确定。但如果我们暂时只考虑没有行交换的高斯消元过程的话,则最终得到的L矩阵的对角线上一定是1。
这样一来,我们就令都为1,得到:
,,,
共16个方程,16个未知数。
后续我们还会知道,因为crout method得算法是一种“in place transform”,也就是会破坏原矩阵A,并把最终结果保存到矩阵A中。因此,我们这里可以暂时忽略矩阵L中的0和对角线上的1,同样也忽略矩阵U中的0。得到如下矩阵:
求解过程:
首先:对于第一列未知数。
(1)
(2)
(3)
(4)
要想知道需要先知道,但唯独式(1)可以求出。把代入(1),可得:
注意:这一步分别用到了和(Input用红色方框表示),求出(output用绿色方框表示),我们在图中标出。
然后再把代入(2)(3)(4),分别求出,得到(同样,标出每一步所用到的数据和每一步的输出):
至此,第一列中的和都计算完毕,且是先求出了,然后才能求。
对于第二列未知数:
Tips:在求第二列之前,第一列的值都已经知道了。
(5)
(6)
(7)
(8)
先观察(5)(6)(7)(8)式,除了第一列中已经算出来的未知数,求解(6)(7)(8)式都要用到和。
首先,已知,代入(5)可求出:
有了再加上和第一列中已经算出的未知数,代入(6)可求出:
继而,能够分别求出和:
至此,第二列中的和都计算完毕,同样也是先求出了,然后才求的。
对于第三列未知数:
Tips:在求第三列之前,第一列和第二列的值都已经知道了。
(9)
(10)
(11)
(12)
观察(9)(10)(11)(12)可知,欲求要先知道,和。而欲求又要先知道和,以此类推,可得我们最终的求解顺序应为,,和。
已知,代入(9)可求出:
继而根据(10)(11)算出,:
求得当前列所有所有后,最终才能求出:
至此,第三列中的和都计算完毕。
对于第四列未知数(也就是最后一列未知数):
Tips:至此,前三列的值都已经求出来了。
(13)
(14)
(15)
(16)
这一列没有,只需按序求出即可。再度把,代入(13)可求出:
继而才能根据(14)式求出():
依序,根据(15)式求出():
最后,根据(16)式求出():
至此,第四列中的都计算完毕。
规律:
1,在上述计算过程中,矩阵A中的所有元素都只调用了一次。与此同时,被计算出的相应位置的或替换。
2,对每一列而言,在计算之前需要先求出上面的全部。
3,在计算第j列时,只会用到j列的左边的值(1~j列),而不会用到j列右边的值(j+1~N列)。因此,必须要保证在第j列前,1~j列的值都已经计算完毕了。事实上,如果按照我们上面给出的,实际上也是自然而然得到的计算顺序,当你要计算第j列时,j列之前的1~j-1列的值都已经算好了。,
4,对于的计算而言,可发现如下规律:他需要用到的元素有第j列中之上的所有,和第i行上位于左边,从i=1开始到次对角线上的全部。如下图所示,要想求出"x"处的,需要上面红色长方形中的和左边红色长方形中的,的选取止于次对角线。(注意:都在矩阵的上三角中,包括主对角线)
例如:
5,同样,对于的计算而言,需要用到的元素有:第i行左边的所有元素,和第j列上面主对角线之上的所有。如下,要想求出"x"处的,需要上面次对角线上方红色长方形中的(包括对角线上的)和左边红色长方形中的。(注意:都在矩阵的下三角中,不包括主对角线)
例如:
6,对而言,所有的下标都满足i<=j。
7,对而言,所有的下标都满足i>j。
结合上面的一些规律,在编程时,主要考虑以下几大点:
1,对每一列而言,按照从上到下的顺序求解每一列,这就保证了对于每一列而言,先求出了,然后再求的。
2,对整个矩阵而言,按照从左到右的顺序进行逐列的求解。确保在计算第j列时,1~j-1中的未知数都已经得到了。
3,当i=j时,=1。
4,矩阵A中所有元素都只能使用一次。
也就是按照下图中a,b,c,d,e。。。的顺序去设计程序,其中a,c,e,g,i表示,b,d,f,h,j表示。
具体实现(A为NXN方阵):
从第一列(j=1)开始以此类推,对每一列(j=1~n)有:
(1), 按照i=1~j的顺序,依次求出当前列中主对角线上(包括主对角线)的。
(2), 随着i的增加,对于i=j+1~N的部分,依次求出当前列中对角线下的。
(3), 对下一列执行上述两步操作。
事实上,在实际实现的时候,有两点和上面不同,也是这个算法的一个亮点,需要单独说明。当i=j时,也就是(1)中的最后一次计算,实际上是放在(2)中进行的。而(2)又是分两步进行的,先是计算,然后再除。因为当i=j时,计算公式的前半部分和计算的部分是一样的。把公式前半部分的中间计算结果通通放在A中,并替换A。这样一来,就可以顺理成章的把的计算完成了,同时,也完成了对的替换。随后,对i=j+1~n的部分除以,得到。
早期笔记:(给我自己看的)
编程实现:
(全文完)
作者 --- 松下J27
参考文献(鸣谢):
【1】《Introduction to Linear Algebra》- Gilbert Strang
【2】《C数值算法(第2版)》,William.H.Press
【3】《Numerical Recipes in C》,William.H.Press
版权声明:所有的笔记,可能来自很多不同的网站和说明,在此没法一一列出,如有侵权,请告知,立即删除。欢迎大家转载,但是,如果有人引用或者COPY我的文章,必须在你的文章中注明你所使用的图片或者文字来自于我的文章,否则,侵权必究。 ----松下J27