Эта тема объясняет, как использовать 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))
, который учитывает величину самого большого собственного значения.