Подтвердить что ты не робот

Каков наилучший алгоритм нахождения определителя матрицы?

Может ли кто-нибудь сказать мне, какой из лучших алгоритмов найти значение определителя матрицы размера N x N?

4b9b3361

Ответ 1

Вот обширная дискуссия.

Существует много алгоритмов.

Простым является принятие разложения LU. Тогда, поскольку

 det M = det LU = det L * det U

и оба L и U треугольны, определитель является произведением диагональных элементов L и U Это O(n^3). Существуют более эффективные алгоритмы.

Ответ 2

Если вы провели начальное исследование, вы, вероятно, обнаружили, что при N >= 4 вычисление матричного определителя становится довольно сложным. Что касается алгоритмов, я бы указал вам на статью Википедии о детерминантах матриц, в частности раздел "Алгоритмическая реализация".

Из моего собственного опыта вы можете легко найти алгоритм декомпозиции LU или QR в существующих матричных библиотеках, таких как Alglib. Сам алгоритм не совсем прост.

Ответ 3

Сокращение строки

Простейший способ (и не плохой, действительно) найти определитель матрицы nxn - сокращение строк. Имея в виду несколько простых правил о детерминантах, мы можем решить в форме:

det (A) = α * det ( R), где R - это форма эшелона строк исходной матрицы A, а α - некоторый коэффициент.

Поиск детерминанта матрицы в виде рядового эшелона очень просто; вы просто находите произведение диагонали. Решая детерминант исходной матрицы A, тогда просто сводится к вычислению α, когда вы найдете форму эшелона строк R.

Что вам нужно знать

Что такое строка эшелона?

Смотрите ссылку для простого определения
Примечание. Не все определения требуют 1s для ведущих записей, и для этого алгоритма это необязательно.

Вы можете найти R, используя операции элементарного ряда

Перемещение строк, добавление кратных строк и т.д.

Вы выведите α из свойств операций строки для детерминант

  • Если B - матрица, полученная путем умножения строки A на некоторую ненулевую константу ß, то

    det (B) = ß * det ( A)

    • Другими словами, вы можете существенно "вытеснить" константу из строки, просто вытащив ее перед детерминантом.
  • Если B - это матрица, полученная путем замены двух строк A, то

    det (B) = -det ( A)

    • Если вы меняете строки, переверните знак.
  • Если B - это матрица, полученная добавлением кратного одной строки в другую строку в A, тогда

    det (B) = det ( A)

    • Детерминант не изменяется.

Обратите внимание, что вы можете найти детерминант, в большинстве случаев, только с Правилом 3 (когда я полагаю, что диагональ A не имеет нулей), и во всех случаях только с правилами 2 и 3. Правило 1 полезно для людей делая математику на бумаге, пытаясь избежать фракций.

Пример

(Я делаю ненужные шаги, чтобы продемонстрировать каждое правило более четко)
| 2 3 3 1 | A=| 0 4 3 -3 | | 2 -1 -1 -3 | | 0 -4 -3 2 | R2 <-> R3, -α -> α (Rule 2) | 2 3 3 1 | -| 2 -1 -1 -3 | | 0 4 3 -3 | | 0 -4 -3 2 | R2 - R1 -> R2 (Rule 3) | 2 3 3 1 | -| 0 -4 -4 -4 | | 0 4 3 -3 | | 0 -4 -3 2 | R2/(-4) -> R2, -4α -> α (Rule 1) | 2 3 3 1 | 4| 0 1 1 1 | | 0 4 3 -3 | | 0 -4 -3 2 | R3 - 4R2 -> R3, R4 + 4R2 -> R4 (Rule 3, applied twice) | 2 3 3 1 | 4| 0 1 1 1 | | 0 0 -1 -7 | | 0 0 1 6 | R4 + R3 -> R3 | 2 3 3 1 | 4| 0 1 1 1 | = 4 ( 2 * 1 * -1 * -1 ) = 8 | 0 0 -1 -7 | | 0 0 0 -1 |

Ответ 4

Я не очень хорошо знаком с факторизацией LU, но я знаю, что для того, чтобы получить либо L, либо U, вам нужно сделать начальную матрицу треугольной (верхняя треугольная для U или нижняя треугольная для L). Однако, как только вы получите матрицу в треугольной форме для некоторой nxn-матрицы A и предположим, что единственной операцией, которую использует ваш код, является Rb-k * Ra, вы можете просто решить det (A) = Π T (i, i) из я = 0 к n (т.е. det (A) = T (0,0) x T (1,1) x... x T (n, n)) для треугольной матрицы T. Проверьте эту ссылку, чтобы увидеть, что я говорю около. http://matrix.reshish.com/determinant.php