Наименьшее собственное значение для большой почти сингулярной матрицы - PullRequest
0 голосов
/ 15 января 2019

В Matlab у меня есть вещественная и симметричная n x n матрица A, где n> 6000. Даже если A положительно определено, оно близко к единственному. A переходит от положительно определенного к единственному к неопределенному для конкретной переменной, которая изменяется. Я должен определить, когда А становится единичным. Я не доверяю детерминантам, поэтому я смотрю на собственные значения, но у меня нет памяти (или времени) для вычисления всех n собственных значений, и меня интересуют только самые маленькие - и особенно, когда он меняет знак с от положительного к отрицательному. Я пробовал

D = eigs(A,1,'smallestabs')

, из-за которого я теряю знак собственного значения, а

D = eigs(A,1,'smallestreal')

Matlab не может получить наименьшее собственное значение для сходимости. Затем я попытался определить значение сдвига, например

for i = 1:10 
   if i == 1
      D(i) = eigs(A,1,0) 
   else
      D(i) = eigs(A,1,D(i-1))
   end
end

где я смотрю в диапазоне последнего наименьшего собственного значения. Однако, собственные значения, кажется, ведут себя странно, и я не уверен, действительно ли я нашел истинное самое низкое значение.

Итак, любые идеи о том, как

  • без сомнения, найдите наименьшее собственное значение с 'eigs', или
  • другим способом определить, когда A становится единичным (при изменении переменной в A)

высоко ценится!

1 Ответ

0 голосов
/ 16 января 2019

Решение

Кажется, я решил свою конкретную проблему. Команда Matlabs chol имеет возможность вернуть значение p, которое равно нулю, если матрица положительно определена. Таким образом, выполняя

[~,p] = chol(A)

в моем случае определяет переход от положительно определенного к не положительно определенному (то есть сначала единственному, а затем неопределенному), а также очень эффективен в вычислительном отношении. В документации для chol также предпочтительнее, чем eigs, проверять положительную определенность. Однако, по-видимому, существует некоторая путаница в отношении результата, если матрица является только положительной полу -определенной, поэтому будьте осторожны, если это так.


Альтернативные решения

Я столкнулся с несколькими возможными решениями, которые я хотел бы заявить:

Определитель : Для положительно определенной матрицы определитель является положительным. Однако для неопределенной матрицы это может быть отрицательно - это может указывать на переход. Хотя, вообще, детерминанты для больших почти сингулярных матриц не рекомендуются.

Собственные значения : Для положительно определенной матрицы действительная часть всех собственных значений положительна. Если хотя бы одно собственное значение равно нулю, матрица является сингулярной, а если одно становится отрицательным, а остальные положительными, то оно неопределенно. Обнаружение сдвига знака для наименьшего собственного значения указывает точку, в которой матрица становится сингулярной. В matlab самое низкое собственное значение может быть найдено

D = eigs(A,1,'smallestreal')

Однако, в моем случае, Матлаб не мог этого сделать. В качестве альтернативы вы можете попробовать поискать около нуля:

D = eigs(A,1,0)

Это, однако, находит только собственное значение, наиболее близкое к нулю. Даже если вы сделаете цикл, как указано в моем первоначальном вопросе выше, вы не гарантированно найдете самый низкий. И точность собственных значений для почти сингулярной матрицы в некоторых случаях кажется низкой.

Номер условия : Matlabs cond возвращает номер условия матрицы, выполнив

C = cond(A)

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

...