Doolittle分解(LU分解)转化成LDU分解的步骤
matlab只提供了计算LU分解的函数,需要计算LDU分解可以参照如下
这里的L D U是doolittle分解衍生的LDU
需要注意,Jacobi迭代法法里面和SOR方法的L D U是相加关系,并不适用于本方法,需要直接提取主对角元素和上下三角
lu
LU 矩阵分解
语法
[L,U] = lu(A)
[L,U,P] = lu(A)
[L,U,P] = lu(A,outputForm)
[L,U,P,Q] = lu(S)
[L,U,P,Q,D] = lu(S)
[___] = lu(S,thresh)
[___] = lu(___,outputForm)
说明
示例
[L,U] = lu(A) 将满矩阵或稀疏矩阵 A 分解为一个上三角矩阵 U 和一个经过置换的下三角矩阵 L,使得 A = L*U。
示例
[L,U,P] = lu(A) 还返回一个置换矩阵 P,并满足 A = P'*L*U。在此语法中,L 是单位下三角矩阵,U 是上三角矩阵。
示例
[L,U,P] = lu(A,outputForm) 以 outputForm 指定的格式返回 P。将 outputForm 指定为 'vector' 会将 P 返回为一个置换向量,并满足 A(P,:) = L*U。
示例
[L,U,P,Q] = lu(S) 将稀疏矩阵 S 分解为一个单位下三角矩阵 L、一个上三角矩阵 U、一个行置换矩阵 P 以及一个列置换矩阵 Q,并满足 P*S*Q = L*U。
[L,U,P,Q,D] = lu(S) 还返回一个对角缩放矩阵 D,并满足 P*(D\S)*Q = L*U。行缩放通常会使分解更为稀疏和稳定。
[___] = lu(S,thresh) 可结合上述任意输出参数组合指定 lu 使用的主元消去策略的阈值。根据指定的输出参数的数量,对 thresh 输入的要求及其默认值会有所不同。有关详细信息,请参阅 thresh 参数说明。
示例
[___] = lu(___,outputForm) 以 outputForm 指定的格式返回 P 和 Q。将 outputForm 指定为 'vector' 以将 P 和 Q 返回为置换向量。您可以使用上述语法中的任何输入参数组合。
那么,如何快速的将LU分解化为LDU分解
我们知道 LU分解和LDU分解的L是完全相同的,只需要改动U
将LU分解的U记作U~
U~=DU
其中D可得,为U的对角元素
由此可知 matlab的最简洁LDU分解代码
[L,U]=lu(A)
for i=1:n
D(i,i)=U(i,i)
end
U=D\U
示例
A=[4,-1,0,-1,0,0;-1,4,-1,0,-1,0;0,-1,4,0,0,-1;-1,0,0,4,-1,0;0,-1,0,-1,4,-1;0,0,-1,0,-1,4]
[m,n]=size(A)
D=eye(n)
[L,U]=lu(A)
for i=1:n
D(i,i)=U(i,i)
end
U=D\U
在此吐槽冯果忱 黄明游根本在60页偷懒没写
关联: matlab 数值分析 数值代数