Важное примечание : поскольку этот вызов относится только к квадратным матрицам, каждый раз, когда я использую термин «матрица», предполагается, что я имею в виду квадратную матрицу. Для краткости я оставляю «квадратное» описание.
Фон
Многие связанные с матрицей операции, такие как вычисление определителя, решение линейной системы или расширение скалярных функций до матриц, упрощаются благодаря использованию диагональной матрицы (элемент которой не на главной диагонали равен 0), которая аналогична с оригинальной матрицы (то есть, для матрицы входного A
и диагональной матрицы D
, существует некоторая обратимая матрица P
таким образом, что D = P^(-1) * A * P
, кроме того , D
и A
имеют некоторые важные свойства, такие как собственные, определителя и следа). Для матриц с различными собственными значениями (корни характеристического полинома матрицы, заданные путем решения det(A-λI) = 0
для λ
, где I
единичная матрица с такими же размерами, что и A
), диагонализация проста:D
является матрицей с собственными значениями на главной диагонали и P
является матрицей, образованной из собственных векторов, соответствующих этим собственным значениям (в том же порядке). Этот процесс называется собственным разложением .
Однако матрицы с повторяющимися собственными значениями не могут быть диагонализированы таким образом. К счастью, нормальную жорданову форму любой матрицы можно вычислить довольно легко, и с ней не намного сложнее работать, чем с обычной диагональной матрицей. Он также обладает хорошим свойством, что, если собственные значения являются уникальными, то разложение Жордана идентично собственному разложению.
Объяснение разложения Джордана
Для квадратной матрицы A
, все собственные значения которой имеют геометрическую кратность 1, процесс разложения Джордана можно описать так:
- Позвольте
λ = {λ_1, λ_2, ... λ_n}
быть список собственных значенийA
, с кратностью, с повторяющимися собственными значениями, появляющимися последовательно. - Создайте диагональную матрицу
J
, элементами которой являются элементыλ
, в том же порядке. - Для каждого собственного значения с кратностью, большей 1, поместите a
1
справа от каждого из повторений собственного значения в главной диагоналиJ
, кроме последнего.
Результирующая матрица J
представляет собой нормальную жорданову форму A
(может быть несколько нормальных жордановых форм для данной матрицы в зависимости от порядка собственных значений).
Работающий пример
Позвольте A
быть следующей матрицы:
Собственные значения A
, с кратностью, являются λ = {1, 2, 4, 4}
. Поместив их в диагональную матрицу, мы получим такой результат:
Затем мы помещаем 1
s справа от всех, кроме одного, каждого из повторяющихся собственных значений. Поскольку 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]]
Last@JordanDecomposition@#&
? Или это обман?Sage, 79 байт
Попробуйте онлайн
Поскольку никто не публикует решения, я мог бы также опубликовать его.
A.charpoly.roots()
вычисляет корни (и алгебраические кратности) характеристического многочленаA
(или собственных значений и кратностей).jordan_block
строит блок Джордана из данного корня и кратности.block_diagonal_matrix
образует матрицу с жордановыми блоками на диагонали, которая является в точности определением жордановой нормальной формы.источник
J ,
7871 байтПопробуйте онлайн!
Две сложные части этой задачи, получение собственных значений и выполнение диагонализации, в итоге занимают примерно одинаковое количество байтов. Они были запрещены правилами, но в случае любопытства у J есть встроенные функции для декомпозиции QR (
128!:0
), а также аддоны LAPACK, которые можно использовать для поиска собственных значений.Объяснение (устарело)
У этого глагола есть две основные части: поиск собственных значений и выполнение диагонализации. Во-первых, чтобы найти собственные значения, нужно найти корни характеристического полинома для входной матрицы. Используя ту же матрицу ввода из примера,
Характеристический многочлен для матрицы M можно найти с помощью | M - λI | = 0 , где I является единичной матрицей с теми же размерами , как М . Выражение M - λI можно смоделировать в J, поместив в квадрат каждый элемент в M с -1, если он находится на диагонали, в противном случае - 0. Каждое поле представляет полином в форме коэффициента.
Определитель в J, тем не
-/ .*
менее, работает с числами, а не с прямоугольниками. Вместо умножения нужен полиномиальный продукт, который можно найти с помощью сверточности ([:+//.*/
). Сложенное вычитание по-прежнему используется, и оба эти глагола должны работать внутри блоков, поэтому используется under (&.
) unbox (>
).Это коэффициенты характеристического полинома. Корни можно найти с помощью
p.
которого преобразует представление многочлена между коэффициентами и формой корней.Корни
[4, 4, 2, 1]
и те собственные значения М .Во-вторых, диагонализация должна быть выполнена. Каждая непрерывная пара значений проверяется на равенство.
Ноль добавляется, и эти значения объединяются вместе с собственными значениями.
Затем каждая строка дополняется до той же длины, что и число собственных значений, для формирования квадратной матрицы.
Наконец, каждый ряд сдвигается вправо, значения падают справа, а нули - слева. Первый ряд смещается ноль раз, второй - один раз, третий - дважды и так далее.
Выход разложение Жордана М .
источник
Октава , 60 байт
Попробуйте онлайн!
Порт моего решения Mathematica .
источник
MATL , 29 байт, неконкурентный
Попробуйте онлайн!
Это моя первая подача в MATL, так что обязательно будут улучшения. Я потратил некоторое время на изучение этого, и только в конце я вспомнил, что это может не сработать с использованием MATL от 7 мая 2016 года. Конечно же, я проверил предпоследний коммит в тот день, и он не запустился.
Я хотел бы использовать,
diag
но кажется, что MATL поддерживает только версию с одним аргументом. Второй аргумент был бы необходим для размещения значений вдоль супердиагонали (или любой другой диагонали для различных задач).источник