Йорданська декомпозиція


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

Математика, 140 139 105 байт

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

Я щойно знайшов вбудований, DiagonalMatrixякий дозволяє простий спосіб розмістити 0 і 1 уздовж наддіагоналі.

Використання

Приклад


Про що Last@JordanDecomposition@#&? Або це обман?
Руслан

@ Руслан Так, одне з правил полягає в тому, що вбудовані, які виконують розкладення Йорданії, заборонені. Спасибі, хоча.
милі

2

Шавлія, 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 можна знайти, використовуючи | М - λ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 є -/ .*те, що діє на числа, а не в полі. Замість множення потрібен добуток полінома, який можна знайти за допомогою згортки ( [:+//.*/). Складене віднімання все ще використовується, і обидва ці дієслова потрібно діяти всередині полів, тому використовується пункт ( &.) 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.