判断矩阵是否为对称正定矩阵
本主题介绍如何使用 chol
和 eig
函数来确定矩阵是否为对称正定矩阵(特征值全为正的对称矩阵)。
方法 1:尝试乔列斯基分解
检查矩阵是否为对称正定矩阵的最有效方法是尝试对矩阵使用 chol
。如果分解失败,则矩阵不是对称正定矩阵。
创建一个对称方阵,用 try
/catch
块来测试 chol(A)
是否成功。
A = [1 -1 0; -1 5 0; 0 0 7]
A = 3×3
1 -1 0
-1 5 0
0 0 7
try chol(A) disp('Matrix is symmetric positive definite.') catch ME disp('Matrix is not symmetric positive definite') end
ans = 3×3
1.0000 -1.0000 0
0 2.0000 0
0 0 2.6458
Matrix is symmetric positive definite.
这种方法的缺点是它不能扩展到也检查矩阵是否为对称半正定矩阵(特征值可以为正或零)。
方法 2:检查特征值
虽然使用 eig
来计算所有特征值并检查其值效率较低,但是这种方法更灵活,因为您也可以用它来检查矩阵是否为对称半正定矩阵。不过,对于小矩阵来说,检查矩阵是否为对称正定矩阵的这两种方法的计算时间之间的差异可以忽略。
此方法要求您在执行测试之前,先使用 issymmetric
来检查矩阵是否对称(如果矩阵不对称,则不需要计算特征值)。
tf = issymmetric(A)
tf = logical
1
d = eig(A)
d = 3×1
0.7639
5.2361
7.0000
isposdef = all(d > 0)
isposdef = logical
1
使用命令 all(d >= 0)
,您可以将此方法扩展到检查矩阵是否为对称半正定矩阵。
数值注意事项
此处概述的方法可能对同一矩阵给出不同结果。由于这两种计算都涉及舍入误差,因此每种算法检查有定性时基于的矩阵与 A
有微小的差异。在实践中,使用容差是一种更稳健的比较方法,因为特征值可能在计算机精度范围内表示为数值零,但实际上是稍大于零的正数,或稍小于零的负数。
例如,如果矩阵具有 eps
数量级的特征值,则使用比较 isposdef = all(d > 0)
会返回 true
,即使特征值在数值上为零,矩阵也更适宜分类为对称半正定矩阵。
要使用容差执行比较,可以使用以下经过修正的命令
tf = issymmetric(A) d = eig(A) isposdef = all(d > tol) issemidef = all(d > -tol)
容差定义以零为中心的半径,在该半径内的任何特征值都视为零。在大多数情况下,容差为 length(d)*eps(max(d))
都是合适的,它考虑了最大特征值的模。