Джордан Разложение


18

Важное примечание : поскольку этот вызов относится только к квадратным матрицам, каждый раз, когда я использую термин «матрица», предполагается, что я имею в виду квадратную матрицу. Для краткости я оставляю «квадратное» описание.

Фон

Многие связанные с матрицей операции, такие как вычисление определителя, решение линейной системы или расширение скалярных функций до матриц, упрощаются благодаря использованию диагональной матрицы (элемент которой не на главной диагонали равен 0), которая аналогична с оригинальной матрицы (то есть, для матрицы входного Aи диагональной матрицы D, существует некоторая обратимая матрица Pтаким образом, что D = P^(-1) * A * P, кроме того , Dи Aимеют некоторые важные свойства, такие как собственные, определителя и следа). Для матриц с различными собственными значениями (корни характеристического полинома матрицы, заданные путем решения det(A-λI) = 0для λ, где Iединичная матрица с такими же размерами, что и A), диагонализация проста:Dявляется матрицей с собственными значениями на главной диагонали и Pявляется матрицей, образованной из собственных векторов, соответствующих этим собственным значениям (в том же порядке). Этот процесс называется собственным разложением .

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

Объяснение разложения Джордана

Для квадратной матрицы A, все собственные значения которой имеют геометрическую кратность 1, процесс разложения Джордана можно описать так:

  1. Позвольте λ = {λ_1, λ_2, ... λ_n}быть список собственных значений A, с кратностью, с повторяющимися собственными значениями, появляющимися последовательно.
  2. Создайте диагональную матрицу J, элементами которой являются элементы λ, в том же порядке.
  3. Для каждого собственного значения с кратностью, большей 1, поместите a 1справа от каждого из повторений собственного значения в главной диагонали J, кроме последнего.

Результирующая матрица Jпредставляет собой нормальную жорданову форму A(может быть несколько нормальных жордановых форм для данной матрицы в зависимости от порядка собственных значений).

Работающий пример

Позвольте Aбыть следующей матрицы:

Матрица

Собственные значения A, с кратностью, являются λ = {1, 2, 4, 4}. Поместив их в диагональную матрицу, мы получим такой результат:

шаг 2

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

иорданская форма

Это нормальная жорданова форма A(одна матрица потенциально может иметь несколько допустимых нормальных жордановых форм, но я поясняю эту деталь для пояснения).

Задание

Учитывая квадратную матрицу в Aкачестве входных данных, выведите правильную жорданову нормальную форму A.

  • Вход и выход могут быть в любом приемлемом формате (2D массив / список / что угодно, список / массив / что угодно из векторов столбцов или строк, тип данных встроенной матрицы и т. Д.).
  • Элементы и собственные значения Aвсегда будут целыми числами в диапазоне [-200, 200].
  • Для простоты все собственные значения будут иметь геометрическую кратность 1 (и, следовательно, вышеописанный процесс выполняется).
  • A будет не более 10х10 матрицы и не менее 2х2 матрицы.
  • Встроенные функции, которые вычисляют собственные значения и / или собственные векторы или выполняют собственное разложение, разложение Жордана или любой другой вид разложения / диагонализации, не допускаются. Матричная арифметика, матричная инверсия и другие встроенные матрицы допускаются.

Контрольные примеры

[[1, 0], [0, 1]] -> [[1, 1], [0, 1]]
[[3, 0], [0, 3]] -> [[1, 1], [0, 1]]
[[4, 2, 2], [1, 2, 2],[0, 3, 3]] -> [[6, 0, 0], [0, 3, 0], [0, 0, 0]]
[[42, 48, 40, 64, 64], [41, 47, 31, 58, 42], [-55, -47, -27, -74, -46], [-46, -58, -46, -70, -68], [30, 20, 12, 34, 18]] -> [[10, 0, 0, 0, 0], [0, -18, 0, 0, 0], [0, 0, 6, 1, 0], [0, 0, 0, 6, 1], [0, 0, 0, 0, 6]]

Ответы:


4

Mathematica, 140 139 105 байт

Total[DiagonalMatrix@@@{{#},{1-Sign[Differences@#^2],1}}]&@(x/.Solve[#~CharacteristicPolynomial~x==0,x])&

Я только что нашел встроенную DiagonalMatrixфункцию, которая позволяет легко разместить 0 и 1 вдоль супердиагонали.

использование

пример


Как насчет Last@JordanDecomposition@#&? Или это обман?
Руслан

@Ruslan Да, одно из правил заключается в том, что встроенные функции, выполняющие разложение по Джордану, не допускаются. Спасибо хоть.
миль

2

Sage, 79 байт

lambda A:block_diagonal_matrix([jordan_block(*r)for r in A.charpoly().roots()])

Попробуйте онлайн

Поскольку никто не публикует решения, я мог бы также опубликовать его.

A.charpoly.roots()вычисляет корни (и алгебраические кратности) характеристического многочлена A(или собственных значений и кратностей). jordan_blockстроит блок Джордана из данного корня и кратности. block_diagonal_matrixобразует матрицу с жордановыми блоками на диагонали, которая является в точности определением жордановой нормальной формы.


2

J , 78 71 байт

1(#\.|."_1#{."1],.2=/\,&_)@>@{[:p.@>[:-&.>/ .(+//.@(*/)&.>)],&.>[:-@=#\

Попробуйте онлайн!

Две сложные части этой задачи, получение собственных значений и выполнение диагонализации, в итоге занимают примерно одинаковое количество байтов. Они были запрещены правилами, но в случае любопытства у J есть встроенные функции для декомпозиции QR ( 128!:0), а также аддоны LAPACK, которые можно использовать для поиска собственных значений.

Объяснение (устарело)

У этого глагола есть две основные части: поиск собственных значений и выполнение диагонализации. Во-первых, чтобы найти собственные значения, нужно найти корни характеристического полинома для входной матрицы. Используя ту же матрицу ввода из примера,

   ] m =: _4 ]\ 5 4 2 1 0 1 _1 _1 _1 _1 3 0 1  1 _1 2
 5  4  2  1
 0  1 _1 _1
_1 _1  3  0
 1  1 _1  2

Характеристический многочлен для матрицы M можно найти с помощью | M - λI | = 0 , где I является единичной матрицей с теми же размерами , как М . Выражение M - λI можно смоделировать в J, поместив в квадрат каждый элемент в M с -1, если он находится на диагонали, в противном случае - 0. Каждое поле представляет полином в форме коэффициента.

   (],&.>[:-@=#\) m
┌────┬────┬────┬────┐
│5 _1│4 0 │2 0 │1 0 │
├────┼────┼────┼────┤
│0 0 │1 _1│_1 0│_1 0│
├────┼────┼────┼────┤
│_1 0│_1 0│3 _1│0 0 │
├────┼────┼────┼────┤
│1 0 │1 0 │_1 0│2 _1│
└────┴────┴────┴────┘

Определитель в J, тем не -/ .*менее, работает с числами, а не с прямоугольниками. Вместо умножения нужен полиномиальный продукт, который можно найти с помощью сверточности ( [:+//.*/). Сложенное вычитание по-прежнему используется, и оба эти глагола должны работать внутри блоков, поэтому используется under ( &.) unbox ( >).

   ([:-&.>/ .(+//.@(*/)&.>)],&.>[:-@=#\) m0
┌───────────────┐
│32 _64 42 _11 1│
└───────────────┘

Это коэффициенты характеристического полинома. Корни можно найти с помощью p.которого преобразует представление многочлена между коэффициентами и формой корней.

   ([:p.@>[:-&.>/ .(+//.@(*/)&.>)],&.>[:-@=#\) m0
┌─┬───────┐
│1│4 4 2 1│
└─┴───────┘

Корни [4, 4, 2, 1]и те собственные значения М .

Во-вторых, диагонализация должна быть выполнена. Каждая непрерывная пара значений проверяется на равенство.

   (2=/\]) 4 4 2 1
1 0 0

Ноль добавляется, и эти значения объединяются вместе с собственными значениями.

   (],.0,~2=/\]) 4 4 2 1
4 1
4 0
2 0
1 0

Затем каждая строка дополняется до той же длины, что и число собственных значений, для формирования квадратной матрицы.

   (#{."1],.0,~2=/\]) 4 4 2 1
4 1 0 0
4 0 0 0
2 0 0 0
1 0 0 0

Наконец, каждый ряд сдвигается вправо, значения падают справа, а нули - слева. Первый ряд смещается ноль раз, второй - один раз, третий - дважды и так далее.

   (-@i.@#|.!.0"_1#{."1],.0,~2=/\]) 4 4 2 1
4 1 0 0
0 4 0 0
0 0 2 0
0 0 0 1

Выход разложение Жордана М .



1

MATL , 29 байт, неконкурентный

1$Yn1$ZQYotdUZS~0hXdF1hYSwXd+

Попробуйте онлайн!

Это моя первая подача в MATL, так что обязательно будут улучшения. Я потратил некоторое время на изучение этого, и только в конце я вспомнил, что это может не сработать с использованием MATL от 7 мая 2016 года. Конечно же, я проверил предпоследний коммит в тот день, и он не запустился.

Я хотел бы использовать, diagно кажется, что MATL поддерживает только версию с одним аргументом. Второй аргумент был бы необходим для размещения значений вдоль супердиагонали (или любой другой диагонали для различных задач).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.