線性方程組(一) LU分解

《數值分析與科學計算》的第二章即是講求解線性方程組,權當對學了一個暑假的線代的總結。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分解。

相關文章
相關標籤/搜索