Решение
Кажется, я решил свою конкретную проблему. Команда Matlabs chol
имеет возможность вернуть значение p
, которое равно нулю, если матрица положительно определена. Таким образом, выполняя
[~,p] = chol(A)
в моем случае определяет переход от положительно определенного к не положительно определенному (то есть сначала единственному, а затем неопределенному), а также очень эффективен в вычислительном отношении. В документации для chol
также предпочтительнее, чем eigs
, проверять положительную определенность. Однако, по-видимому, существует некоторая путаница в отношении результата, если матрица является только положительной полу -определенной, поэтому будьте осторожны, если это так.
Альтернативные решения
Я столкнулся с несколькими возможными решениями, которые я хотел бы заявить:
Определитель :
Для положительно определенной матрицы определитель является положительным. Однако для неопределенной матрицы это может быть отрицательно - это может указывать на переход. Хотя, вообще, детерминанты для больших почти сингулярных матриц не рекомендуются.
Собственные значения : Для положительно определенной матрицы действительная часть всех собственных значений положительна. Если хотя бы одно собственное значение равно нулю, матрица является сингулярной, а если одно становится отрицательным, а остальные положительными, то оно неопределенно. Обнаружение сдвига знака для наименьшего собственного значения указывает точку, в которой матрица становится сингулярной. В matlab самое низкое собственное значение может быть найдено
D = eigs(A,1,'smallestreal')
Однако, в моем случае, Матлаб не мог этого сделать. В качестве альтернативы вы можете попробовать поискать около нуля:
D = eigs(A,1,0)
Это, однако, находит только собственное значение, наиболее близкое к нулю. Даже если вы сделаете цикл, как указано в моем первоначальном вопросе выше, вы не гарантированно найдете самый низкий. И точность собственных значений для почти сингулярной матрицы в некоторых случаях кажется низкой.
Номер условия : Matlabs cond
возвращает номер условия матрицы, выполнив
C = cond(A)
, в котором указывается отношение наибольшего собственного значения к наименьшему. Смещение знака в номере условия, таким образом, указывает на переход. Это, однако, не сработало для меня, так как я получил только положительные числа условий, хотя у меня были отрицательные собственные значения. Но, возможно, это будет работать в других случаях.