exponenta event banner

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

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

Метод 1: Попытка Cholesky факторизации

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

См. также

|

Связанные темы