Определите, является ли матрица симметричной положительный определенный

Используйте chol и eig определить, является ли матрица симметричной положительный определенный (симметрическая матрица со всеми положительными собственными значениями).

Метод 1: делайте попытку факторизации Холесского

Наиболее эффективный метод проверять, является ли матрица симметричной положительный определенный, состоит в том, чтобы просто попытаться использовать 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.

Недостаток этого метода - то, что он не может быть расширен, чтобы также проверять, является ли матрица симметричной положительный полуопределенный (где собственные значения могут быть положительными или нуль).

Метод 2: проверяйте собственные значения

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

Смотрите также

|

Похожие темы