低密度脂蛋白
厄米不定矩阵的块LDL分解
语法
L = ldl(A)
[L,D] = ldl(A)
[L,D,P] = ldl(A)
[L,D,p] = ldl(A,'vector')
[U,D,P] = ldl(A,'upper')
[U,D,p] = ldl(A,'upper','vector')
[L,D,P,S] = ldl(A)
[l, d, p, s] = ldl (a, thresh)
[U,D,p,S] = LDL(A,THRESH,'upper','vector')
描述
L = ldl(A)
只返回排列后的下三角矩阵l
与双输出形式一样。排列信息丢失了,块对角线因子也是如此D
.默认情况下,低密度脂蛋白
只参考对角线和下三角形一个
,并假设上三角形是下三角形的复共轭转置。因此[L,D,P] = ldl(TRIL(A))
而且[L,D,P] = ldl(A)
两者返回完全相同的因子。注意,此语法对于稀疏是无效的一个
.
[L,D] = ldl(A)
存储块对角矩阵D
和一个排列下三角矩阵l
这样A = l * d * l '
.块对角矩阵D
对角线上有1 × 1和2 × 2的方块。注意,此语法对于稀疏是无效的一个
.
[L,D,P] = ldl(A)
返回单位下三角矩阵l
,块对角线D
,和排列矩阵P
这样P'* a *P = l * d * l '
.这相当于[L,D,P] = ldl(A,'矩阵')
.
[L,D,p] = ldl(A,'vector')
以向量形式返回排列信息,p
,而不是矩阵。的p
输出是这样的行向量A(p,p) = L*D*L'
.
[U,D,P] = ldl(A,'upper')
的对角线和上三角形一个
假设下三角形是上三角形的复共轭转置。此语法返回一个单位上三角矩阵U
这样P'* a *P = u '* d * u
(假设一个
是厄米矩阵,而不仅仅是上三角)。同样的,[L,D,P] = ldl(A,'低')
给出默认行为。
[U,D,p] = ldl(A,'upper','vector')
以向量形式返回排列信息,p
,就像[L,D,p] = ldl(A,'low ','vector')
.一个
必须是一个完整的矩阵。
[L,D,P,S] = ldl(A)
返回单位下三角矩阵l
,块对角线D
,排列矩阵P
,和缩放矩阵年代
这样P'* s * a * s *P = l * d * l '
.此语法仅适用于实稀疏矩阵,且仅适用于的下三角形一个
引用。
[l, d, p, s] = ldl (a, thresh)
使用打
作为算法中的枢轴公差。打
一定是区间内的双标量[0, 0.5]
.的默认值打
是0.01
.使用较小的打
可能提供更快的分解时间和更少的输入,但也可能导致不稳定的分解。此语法仅适用于真正的稀疏矩阵。
[U,D,p,S] = LDL(A,THRESH,'upper','vector')
设置枢轴公差并返回上三角形U
和排列向量p
如上所述。
例子
的各种形式的用法低密度脂蛋白
函数,包括单输出、双输出和三输出形式,以及对向量
而且上
选项。涵盖的主题有:
在运行这些例子之前,你需要生成以下正定和不定厄米矩阵:
A = full(delsq(numgrid('L', 10)));B = gallery('uniformdata',10,0);M =[眼睛(10)B;B " 0 (10)];
的结构米
这在优化和流体流动问题中非常常见米
实际上是不确定的。注意这个正定矩阵一个
一定是满了吧低密度脂蛋白
不接受稀疏参数。
例1 -双输出形式的ldl
的双输出形式低密度脂蛋白
返回l
而且D
这样A - D (L * * L ')
很小,l
排列单位是下三角形,和D
是一个2乘2的对角线块。还要注意,因为一个
的对角线是正定的吗D
都是正面的:
[LA,DA] = ldl(A);流(1,…“分解误差||A - LA*DA*LA”|| is %g\n',…norm(A - LA*DA*LA'));neginds = find(diag(DA) < 0)
鉴于一个
b
,解决Ax = b
使用拉
,达
:
bA = sum(A,2);x = LA'\(DA\(LA\bA));流(…绝对误差范数||x - ones(size(bA))||为%g\n',…norm(x - ones(size(bA))));
例2 -三输出形式的ldl
三输出形式也返回排列矩阵,因此l
实际上是单位下三角形
[Lm, Dm, Pm] = ldl(M);流(1,…下午的错误标准| |“* M * Pm Lm * Dm * Lm”| | % g \ n”,…norm(Pm'*M*Pm - Lm*Dm*Lm'));流(1,…Lm和tril(Lm)的差值是%g\n',…范数(Lm - tril(Lm));
鉴于b
,解决Mx = b
使用Lm
,Dm
,点
:
bM = sum(M,2);x = Pm*(Lm'\(Dm\(Lm\(Pm'*bM))));流(…'绝对误差范数||x - ones(size(b))||是%g\n',…norm(x - ones(size(bM))));
例3 - D的结构
D
是一个1 × 1块和2 × 2块的块对角线矩阵。这使得它成为三对角矩阵的一种特殊情况。当输入矩阵是正定的,D
几乎都是对角线的(取决于矩阵有多确定)。当矩阵是不定的,D
可以是对角线,也可以表示块状结构。例如,用一个
如上所述,达
是斜的。但是如果你改变一个
只要一点点,你就会得到一个不定矩阵,然后你就可以计算a了D
它有块状结构。
图;间谍(DA);title(' ldl(A)的D结构');[Las, Das] = ldl(A - 4*眼睛(大小(A)));图;间谍(Das);title(' ldl的D结构(A - 4*眼(大小(A)))');
例4 -使用'vector'选项
就像陆
函数,低密度脂蛋白
接受一个参数,该参数确定函数返回的是排列向量还是排列矩阵。低密度脂蛋白
默认情况下返回后者。当你选择“向量”
,该函数执行得更快,使用的内存更少。因此,指定“向量”
建议为选项。另一件需要注意的事情是,对于这种操作,索引通常比乘法快:
[Lm, Dm, pm] = ldl(M, 'vector');流(1,错误规范| | M(点、点)- Lm * Dm * Lm”| | % g \ n’,……norm(M(pm,pm) - Lm*Dm*Lm');用这种因式分解解一个系统。。清楚x;x(pm,:) = Lm'\(Dm\(Lm\(bM(pm,:))));fprintf('绝对误差范数||x - ones(size(b))|| is %g\n',…norm(x - ones(size(bM))));
例5 -使用“upper”选项
就像胆固醇
函数,低密度脂蛋白
接受一个参数,该参数确定输入矩阵的哪个三角形被引用,以及是否被引用低密度脂蛋白
返回一个较低的(l
)或以上(L '
)三角因子。对于密集矩阵,使用上三角版本而不是下三角版本并没有真正的节省:
Ml = tril(M);[Lml, Dml, Pml] = ldl(Ml, '低');% 'lower'是默认行为。流(1,…' Lml与Lm的差值为%g\n',范数(Lml - Lm));(Umu Dmu, pmu) =低密度脂蛋白(triu (M),“上”,“矢量”);流(1,…“Umu与Lm”之差为%g\n′,范数(Umu - Lm′));用这个因式分解解一个系统。清楚x; x(pm,:) = Umu\(Dmu\(Umu'\(bM(pmu,:)))); fprintf(... 'The absolute error norm ||x - ones(size(b))|| is %g\n', ... norm(x - ones(size(bM))));
当同时指定“上”
而且“向量”
选项,“上”
必须先于“向量”
在参数列表中。
例6 - linsolve和厄米不定求解器
当使用linsolve
函数,通过利用系统具有对称矩阵的知识,您可能会体验到更好的性能。在上面的例子中使用的矩阵有点小,所以,对于这个例子,生成一个更大的矩阵。这里的矩阵是对称正定的,下面我们将看到,随着关于矩阵的每一点知识,都有相应的加速。也就是说,对称求解器比一般求解器快,而对称正定求解器比对称求解器快:
Abig = full(delsq(numgrid('L', 30)));bbig = sum(Abig, 2);LSopts。POSDEF = false; LSopts.SYM = false; tic; linsolve(Abig, bbig, LSopts); toc; LSopts.SYM = true; tic; linsolve(Abig, bbig, LSopts); toc; LSopts.POSDEF = true; tic; linsolve(Abig, bbig, LSopts); toc;
参考文献
[1]阿什克拉夫特,C., R.G.格莱姆斯和J.G.刘易斯。精确对称不定线性方程求解器SIAM J.矩阵肛门。达成。20卷。第2期,1998年,第513-561页。
[2]达夫,i.s。MA57 -稀疏对称定系统和不定系统解的新代码技术报告RAL-TR-2002-024,卢瑟福阿普尔顿实验室,2002。