Используйте 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
, чтобы вычислить все собственные значения и проверять их значения, этот метод более гибок, поскольку можно также использовать его, чтобы проверять, является ли матрица симметричной положительный полуопределенный. Однако, для маленьких матриц различие во время вычисления между методами незначительно, чтобы проверять, является ли матрица симметричной положительный определенный.
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
, даже при том, что собственное значение является численно нулем, и матрица лучше классифицируется как симметричная положительный полуопределенный.
Чтобы выполнить сравнение с помощью допуска, можно использовать измененные команды
d = eig(A) isposdef = all(d) > tol issemidef = all(d) > -tol
Допуск задает радиус вокруг нуля, и любые собственные значения в том радиусе обработаны как нули. Хорошим выбором для допуска в большинстве случаев является length(d)*eps(max(d))
, который учитывает значение самого большого собственного значения.