《数值分析与科学计算》的第二章即是讲求解线性方程组,权当对学了一个暑假的线代的总结。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分解。