Dekomposisi Jordan

18

Catatan penting : Karena tantangan ini hanya berlaku untuk matriks kuadrat, setiap kali saya menggunakan istilah "matriks", diasumsikan bahwa saya mengacu pada matriks kuadrat. Saya meninggalkan deskripsi "persegi" demi singkatnya.

Latar Belakang

Banyak operasi yang berhubungan dengan matriks, seperti menghitung determinan, menyelesaikan sistem linier, atau memperluas fungsi bernilai skalar ke matriks menjadi lebih mudah dengan menggunakan matriks diagonal (elemen yang elemen-elemennya tidak berada pada diagonal utama adalah 0) yang serupa ke matriks asli (artinya, untuk matriks input Adan matriks diagonal D, ada beberapa matriks yang dapat dibalik Psehingga D = P^(-1) * A * P; juga, Ddan Aberbagi beberapa sifat penting, seperti nilai eigen, determinan, dan jejak). Untuk matriks dengan nilai eigen yang berbeda (akar ke polinomial karakteristik matriks, diberikan oleh penyelesaian det(A-λI) = 0untuk λ, di mana Imatriks identitas dengan dimensi yang sama A), diagonalisasi sederhana:Dadalah matriks dengan nilai eigen pada diagonal utama, dan Pmerupakan matriks yang dibentuk dari vektor eigen yang sesuai dengan nilai eigen tersebut (dalam urutan yang sama). Proses ini disebut komposisi eigend .

Namun, matriks dengan nilai eigen berulang tidak dapat didiagonalisasi dengan cara ini. Untungnya, bentuk normal Jordan dari matriks apa pun dapat dihitung dengan mudah, dan tidak jauh lebih sulit untuk dikerjakan daripada matriks diagonal biasa. Ini juga memiliki properti bagus, jika nilai eigen unik, maka dekomposisi Jordan identik dengan komposisi eigend.

Dekomposisi Jordan menjelaskan

Untuk matriks kuadrat Adengan nilai eigen semuanya memiliki kelipatan geometris 1, proses dekomposisi Jordan dapat digambarkan sebagai berikut:

  1. Membiarkan λ = {λ_1, λ_2, ... λ_n}menjadi daftar nilai eigen dari A, dengan multiplisitas, dengan nilai eigen berulang muncul secara berurutan.
  2. Buat matriks diagonal Jyang unsur-unsurnya adalah unsur-unsur λ, dalam urutan yang sama.
  3. Untuk setiap nilai eigen dengan multiplisitas lebih besar dari 1, letakkan a 1di sebelah kanan setiap pengulangan nilai eigen di diagonal utama J, kecuali yang terakhir.

Matriks yang dihasilkan Jadalah bentuk normal Jordan dari A(bisa ada beberapa bentuk normal Jordan untuk matriks yang diberikan, tergantung pada urutan nilai eigen).

Contoh yang berhasil

Membiarkan Amenjadi matriks berikut:

Sebuah matriks

Nilai eigen dari A, dengan multiplisitas, adalah λ = {1, 2, 4, 4}. Dengan menempatkan ini ke dalam matriks diagonal, kami mendapatkan hasil ini:

Langkah 2

Selanjutnya, kami menempatkan 1s di sebelah kanan semua kecuali satu dari masing-masing nilai eigen yang diulang. Karena 4satu-satunya nilai eigen yang diulang, kami menempatkan satu di 1sebelah 4 pertama:

bentuk jordan

Ini adalah bentuk normal Jordan A(sebuah matriks tunggal berpotensi memiliki beberapa bentuk normal Jordan yang valid, tapi saya membahas detail itu untuk tujuan penjelasan).

Tugas

Diberikan matriks persegi Asebagai input, menghasilkan bentuk normal Jordan valid A.

  • Input dan output mungkin dalam format yang wajar (array 2D / daftar / apa pun, daftar / array / apa pun dari vektor kolom atau baris, tipe data matriks bawaan, dll.).
  • Elemen dan nilai eigen dari Aakan selalu menjadi bilangan bulat dalam rentang tersebut [-200, 200].
  • Demi kesederhanaan, semua nilai eigen akan memiliki kelipatan geometris 1 (dan dengan demikian proses di atas berlaku).
  • A paling banyak akan menjadi matriks 10x10 dan setidaknya matriks 2x2.
  • Builtin yang menghitung nilai eigen dan / atau vektor eigen atau melakukan eigendekomposisi, dekomposisi Jordan, atau segala jenis dekomposisi / diagonalisasi lainnya tidak diperbolehkan. Aritmatika matriks, inversi matriks, dan matriks bawaan lainnya diizinkan.

Uji kasus

[[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]]
Mego
sumber

Jawaban:

4

Mathematica, 140 139 105 byte

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

Saya baru saja menemukan builtin DiagonalMatrixyang memungkinkan cara mudah untuk menempatkan 0s dan 1s sepanjang superdiagonal.

Pemakaian

Contoh

mil
sumber
Bagaimana dengan Last@JordanDecomposition@#&? Atau itu curang?
Ruslan
@Ruslan Ya, salah satu aturannya adalah bahwa builtin yang melakukan dekomposisi Jordan tidak diperbolehkan. Terimakasih Meskipun.
mil
2

Sage, 79 byte

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

Cobalah online

Karena tidak ada orang lain yang memposting solusi, saya mungkin lebih baik memposting.

A.charpoly.roots()menghitung akar (dan multiplisitas aljabar) dari polinomial karakteristik A(alias nilai eigen dan multiplisitas). jordan_blockmembangun blok Jordan dari akar yang diberikan dan banyaknya. block_diagonal_matrixmembentuk matriks dengan blok Jordan pada diagonal, yang persis definisi bentuk normal Jordan.

Mego
sumber
2

J , 78 71 byte

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

Cobalah online!

Dua bagian yang menantang dari tugas ini, mendapatkan nilai eigen dan melakukan diagonalisasi, akhirnya mengambil jumlah byte yang sama. Ini tidak diizinkan oleh aturan tetapi jika ada yang penasaran, J memiliki builtin untuk dekomposisi QR ( 128!:0) serta addon LAPACK yang dapat digunakan untuk menemukan nilai eigen.

Penjelasan (Sudah kedaluwarsa)

Ada dua bagian utama dari kata kerja ini: menemukan nilai eigen dan melakukan diagonalisasi. Pertama, untuk menemukan nilai eigen, akar polinomial karakteristik untuk matriks input harus ditemukan. Menggunakan matriks input yang sama dari contoh,

   ] 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

Polinomial karakteristik untuk matriks M dapat ditemukan menggunakan | M - λI | = 0 di mana saya adalah matriks identitas dengan dimensi yang sama seperti M . Ekspresi M - λI dapat dimodelkan dalam J dengan meninju setiap elemen dalam M dengan -1 jika berada pada diagonal yang lain, jika tidak, 0. Setiap kotak mewakili polinomial dalam bentuk koefisien.

   (],&.>[:-@=#\) 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│
└────┴────┴────┴────┘

Namun penentu dalam J adalah -/ .*, yang beroperasi pada angka, bukan polinomial kotak. Alih-alih multiplikasi, produk polinomial diperlukan yang dapat ditemukan menggunakan konvolusi ( [:+//.*/). Pengurangan dilipat masih digunakan, dan kedua kata kerja ini perlu beroperasi di dalam kotak sehingga di bawah ( &.) unbox ( >) digunakan.

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

Ini adalah koefisien dari polinomial karakteristik. Akar dapat ditemukan menggunakan p.yang mengubah representasi polinomial antara koefisien dan bentuk akar.

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

Akar adalah [4, 4, 2, 1]dan mereka adalah nilai eigen dari M .

Kedua, diagonalisasi harus dilakukan. Setiap pasangan nilai kontinu diuji untuk kesetaraan.

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

Nol ditambahkan dan nilai-nilai tersebut dikelompokkan bersama dengan nilai eigen.

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

Kemudian setiap baris diisi dengan panjang yang sama dengan jumlah nilai eigen untuk membentuk matriks persegi.

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

Akhirnya setiap baris bergeser ke kanan dengan nilai jatuh di sebelah kanan dan nol didorong di sebelah kiri. Baris pertama digeser nol kali, yang kedua sekali, yang ketiga dua kali, dan seterusnya.

   (-@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

Output adalah dekomposisi Jordan dari M .

mil
sumber
1

Oktaf , 60 byte

@(a)diag(1-sign(diff(v=round(roots(poly(a)))).^2),1)+diag(v)

Cobalah online!

Port solusi Mathematica saya .

mil
sumber
1

MATL , 29 byte, tidak bersaing

1$Yn1$ZQYotdUZS~0hXdF1hYSwXd+

Cobalah online!

Ini adalah pengajuan MATL pertama saya jadi pasti ada perbaikan. Saya menghabiskan beberapa waktu untuk mempelajarinya dan hanya pada akhirnya saya ingat bahwa ini mungkin tidak akan berhasil menggunakan MATL dari 7 Mei 2016. Cukup yakin, saya memeriksa komitmen kedua dari belakang hingga hari itu dan itu tidak berjalan.

Saya ingin menggunakan diagtetapi tampaknya MATL hanya mendukung versi argumen tunggal. Argumen kedua akan diperlukan untuk menempatkan nilai di sepanjang superdiagonal (atau diagonal lainnya untuk masalah yang berbeda).

mil
sumber