# cholesky
Cholesky 分解
函数库: TyMath
# 语法
F=cholesky(A, Val(false); check = true)
F=cholesky(A, Val(true); tol = 0.0, check = true)
F=cholesky(S; shift = 0.0, check = true, perm = nothing)
# 说明
F=cholesky(A, Val(false); check = true) 计算稠密对称正定矩阵 A 的 Cholesky 分解并返回 Cholesky 分解。
矩阵 A 可以是对称或 Hermitian StridedMatrix 或完全对称或 Hermitian StridedMatrix。
三角 Cholesky 因子可以通过 F.L 和 F.U 从因式分解 F 中获得,其中 A ≈ F.U' * F.U ≈ F.L * F.L'。
以下函数可用于 Cholesky 对象:size、\、inv、det、logdet 和 isposdef。
如果您的矩阵 A 由于其构造中的舍入误差而略微非 Hermitian,请在将其传递给 cholesky 之前将其包装在 Hermitian(A) 中,以便将其视为完美的 Hermitian。
当 check = true 时,如果分解失败则抛出错误。当 check = false 时,检查分解有效性的责任在于用户。
F=cholesky(A, Val(true); tol = 0.0, check = true) 计算密集对称半正定矩阵 A 的主元 Cholesky 分解并返回 CholeskyPivoted 分解。
矩阵 A 可以是对称或 Hermitian StridedMatrix 或完全对称或 Hermitian StridedMatrix。
三角 Cholesky 因子可以通过 F.L 和 F.U 从因式分解 F 以及通过 F.p 的排列获得,其中 A[F.p, F.p] ≈ Ur' * Ur ≈ Lr * Lr' 其中 Ur = F.U[1:F.rank, :] 和 Lr = F.L[:, 1:F.rank],或者 A ≈ Up' * Up ≈ Lp * Lp' with Up = F.U[1:F.rank, invperm(F.p)] and Lp = F.L[ invperm(F.p),1:F.rank]。
以下函数可用于 CholeskyPivoted 对象:size、\、inv、det 和 rank。
参数 tol 确定用于确定等级的公差。对于负值,公差是机器精度。
如果您的矩阵 A 由于其构造中的舍入误差而略微非 Hermitian,请在将其传递给 cholesky 之前将其包装在 Hermitian(A) 中,以便将其视为完美的 Hermitian。
当 check = true 时,如果分解失败则抛出错误。当 check = false 时,检查分解有效性的责任在于用户。
F=cholesky(S; shift = 0.0, check = true, perm = nothing) 计算稀疏正定矩阵 A 的 Cholesky 分解。
S 必须是 SparseMatrixCSC 或 SparseMatrixCSC 的对称/厄米特视图。 请注意,即使 S 没有类型标签,它仍然必须是对称的或 Hermitian 的。 如果未给出 perm,则使用减少填充的排列。 F = cholesky(A) 最常用于求解包含 F\b 的方程组,但也为 F 定义了方法 diag、det 和 logdet。您还可以使用 F.L 从 F 中提取单个因子。 但是,由于默认情况下启用旋转,因此分解在内部表示为 S == P' * L * L' * P 和置换矩阵 P; 只使用 L 而不考虑 P 会给出错误的答案。 要包括排列的影响,通常最好提取“组合”因子,例如 PtL = F.PtL(相当于 P'* L)和 LtP = F.UP(相当于 L'*P)。
当 check = true 时,如果分解失败则抛出错误。 当 check = false 时,检查分解有效性的责任在于用户。
设置可选的 shift 关键字参数计算 S+shift*I 而不是 S 的因式分解。如果提供了 perm 参数,它应该是 1:size(S,1) 的排列,给出要使用的顺序。
# 示例
用对称正定矩阵求解线性系统
使用 cholesky 分解对称系数矩阵,然后使用 Cholesky 因子求解线性系统。
创建在对角线上为正值的对称矩阵。
using TyMath
A = [1 0 1; 0 2 0; 1 0 3]
A = 3×3 Matrix{Int64}:
1 0 1
0 2 0
1 0 3
计算矩阵的 Cholesky 因子。
R = cholesky(A).U
R = 3×3 UpperTriangular{Float64, Matrix{Float64}}:
1.0 0.0 1.0
⋅ 1.41421 0.0
⋅ ⋅ 1.41421
为方程
b = sum(A,dims=2)
由于
x = R\(R'\b)
x = 3×1 Matrix{Float64}:
1.0
0.9999999999999999
0.9999999999999999
矩阵的 Cholesky 分解
计算矩阵的上下 Cholesky 分解,并验证结果。
使用 gallery 函数创建一个 6×6 对称正定测试矩阵。
using TyMath
A = TestArrays.lehmer(6);
使用 A 的上三角计算 Cholesky 因子。
R = cholesky(A).U
R = 6×6 UpperTriangular{Float64, Matrix{Float64}}:
1.0 0.5 0.333333 0.25 0.2 0.166667
⋅ 0.866025 0.57735 0.433013 0.34641 0.288675
⋅ ⋅ 0.745356 0.559017 0.447214 0.372678
⋅ ⋅ ⋅ 0.661438 0.52915 0.440959
⋅ ⋅ ⋅ ⋅ 0.6 0.5
⋅ ⋅ ⋅ ⋅ ⋅ 0.552771
验证上三角因子满足
norm(R'*R - A)
ans = 2.482534153247273e-16
使用 A 的下三角形计算 Cholesky 因子。
L = cholesky(A).L
L = 6×6 LowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅ ⋅ ⋅ ⋅ ⋅
0.5 0.866025 ⋅ ⋅ ⋅ ⋅
0.333333 0.57735 0.745356 ⋅ ⋅ ⋅
0.25 0.433013 0.559017 0.661438 ⋅ ⋅
0.2 0.34641 0.447214 0.52915 0.6 ⋅
0.166667 0.288675 0.372678 0.440959 0.5 0.552771
验证下三角因子满足
norm(L*L' - A)
ans = 2.482534153247273e-16
# 输入参数
A - 输入矩阵矩阵
输入矩阵。参数 A 可以使用满存储或稀疏存储,但必须为方阵和对称正定矩阵。
chol 假设 A 是对称实矩阵,或者是 Hermitian 对称复矩阵。
数据类型: Integer | Float64 | Float32 | Float16
复数支持: 是
S - 稀疏输入矩阵矩阵
稀疏输入矩阵。S 必须为方阵和对称正定矩阵。
chol 假设 S 是对称实矩阵,或者是 Hermitian 对称复矩阵。
数据类型: Integer | Float64 | Float32 | Float16
复数支持: 是
# 输出参数
F - 输出结果
输出结果。F.L 为下三角矩阵,F.U为上三角矩阵。
数据类型: Integer | Float64 | Float32 | Float16
# 详细信息
对称正定矩阵
对称正定矩阵是所有特征值均为正值的对称矩阵。
对于任何可逆实矩阵 A,您可以用乘积 B = A'* A 构造一个对称正定矩阵。由于任何对称正定矩阵 B 都可以分解为乘积 R'*R,Cholesky 分解可对此公式求反。
对称半正定矩阵的定义与此类似,只是其特征值必须均为正值或零。
在数值计算中,正定矩阵和半正定矩阵之间的界限比较模糊。特征值精确等于零的情况很少见,但它们可以在数值上为零。因此,cholesky 可能能够分解一个半正定矩阵,但对于特征值非常相似的另一个矩阵,分解可能会失败。
# 参考文献
[1] Anderson, E., ed. LAPACK Users’ Guide. 3rd ed. Software, Environments, Tools. Philadelphia: Society for Industrial and Applied Mathematics, 1999. https://doi.org/10.1137/1.9780898719604.
[2] Chen, Yanqing, Timothy A. Davis, William W. Hager, and Sivasankaran Rajamanickam. “Algorithm 887: CHOLMOD, Supernodal Sparse Cholesky Factorization and Update/Downdate.” ACM Transactions on Mathematical Software 35, no. 3 (October 2008): 1–14. https://doi.org/10.1145/1391989.1391995.