В этом разделе описывается, как использовать chol
и eig
функции для определения, является ли матрица симметричной положительно определенной (симметричная матрица со всеми положительными собственными значениями).
Самый эффективный метод проверить, является ли матрица симметричной положительной определенной, - это просто попытаться использовать chol
на матрице. Если факторизация прекращается, то матрица не симметрично положительно определена. Этот метод не требует, чтобы матрица была симметричной для успешного теста (если матрица не симметричная, то факторизация прекращает работать).
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.
Недостатком этого метода является то, что он не может быть расширен, чтобы также проверить, является ли матрица симметричной положительной полуопределенной (где собственные значения могут быть положительными или нулевыми).
В то время как это менее эффективно использовать 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))
, который учитывает величину наибольшего собственного значения.