《數值分析與科學計算》的第二章即是講求解線性方程組,權當對學了一個暑假的線代的總結。spa
一、LU分解code
其映射簡而言之即是這樣:blog
用公式表示則是class
Ly = b
Ux = y
如下以matlab介紹LU分解循環
1 >> A = [8 8 4; 4 2 -1; 2 2 2] 2 A = 3 4 8 8 4 5 4 2 -1 6 2 2 2 7 8 >> [L,U]= lu(A) 9 L = 10 11 1.0000 0 0 12 0.5000 1.0000 0 13 0.2500 0 1.0000 14 15 U = 16 17 8 8 4 18 0 -2 -3 19 0 0 1 20 21 >> M = lu(A) 22 M = 23 24 8.0000 8.0000 4.0000 25 0.5000 -2.0000 -3.0000 26 0.2500 0 1.0000
line8 ~line 19表示爲A的LU分解的原位形式;im
line21 ~line26表示爲A的LU分解的緊湊形式。總結
1 >> M = lu(A) 2 M = 3 4 8.0000 8.0000 4.0000 5 0.5000 -2.0000 -3.0000 6 0.2500 0 1.0000 7 8 9 >> u1 = triu(M) 10 u1 = 11 12 8 8 4 13 0 -2 -3 14 0 0 1 15 16 17 >> l1 = tril(M) 18 l1 = 19 20 8.0000 0 0 21 0.5000 -2.0000 0 22 0.2500 0 1.0000 23 24 25 >> for i=1: size(l1,1); l1(i,i)=1;end 26 >> l1 27 l1 = 28 29 1.0000 0 0 30 0.5000 1.0000 0 31 0.2500 0 1.0000
line9 ~line22 表示了從緊湊形式中提取U和L 。然而咱們發現了l1提取了整個M的下三角,這不是咱們想要的結果。img
能夠經過循環調整l1,得到咱們想要的形式(line 27~ line 31) 。di
使用循環並非最佳方案matlab
1 %way 1 2 >> l1 = tril(M) 3 l1 = 4 5 8.0000 0 0 6 0.5000 -2.0000 0 7 0.2500 0 1.0000 8 9 >> l1 = l1 - diag(diag(l1)) + eye(size(l1, 1)) 10 l1 = 11 12 1.0000 0 0 13 0.5000 1.0000 0 14 0.2500 0 1.0000 15 16 17 %way 2 18 >> l1 = tril(M, -1) + eye(size(l1, 1)) 19 l1 = 20 21 1.0000 0 0 22 0.5000 1.0000 0 23 0.2500 0 1.0000
有時候須要選主元再進行LU分解。
便須要左乘算子先進行行變換,再進行LU分解。