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

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

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

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

|

Похожие темы