Decomposizione della Giordania


18

Nota importante : poiché questa sfida si applica solo alle matrici quadrate, ogni volta che utilizzo il termine "matrice", si presume che mi riferisca a una matrice quadrata. Lascio la descrizione "quadrata" per brevità.

sfondo

Molte operazioni legate alla matrice, come calcolare il determinante, risolvere un sistema lineare o estendere le funzioni con valori scalari alle matrici, sono rese più semplici usando una matrice diagonale (una i cui elementi che non sono sulla diagonale principale sono 0) che è simile alla matrice originale (che significa, per la matrice di input Ae la matrice diagonale D, esiste una matrice invertibile Ptale che D = P^(-1) * A * P; inoltre, De Acondividono alcune proprietà importanti, come autovalori, determinante e traccia). Per matrici con autovalori distinti (radici alle polinomio caratteristico della matrice, in soluzione det(A-λI) = 0per λ, dove Iè la matrice identità con le stesse dimensioni A), diagonalizzazione è semplice:Dè una matrice con gli autovalori sulla diagonale principale ed Pè una matrice formata da autovettori corrispondenti a tali autovalori (nello stesso ordine). Questo processo si chiama eigendecomposition .

Tuttavia, le matrici con autovalori ripetuti non possono essere diagonali in questo modo. Fortunatamente, la normale forma Jordan di qualsiasi matrice può essere calcolata piuttosto facilmente, e non è molto più difficile da lavorare rispetto a una normale matrice diagonale. Ha anche la bella proprietà che, se gli autovalori sono unici, la decomposizione della Giordania è identica alla composizione geografica.

Spiegazione della decomposizione della Giordania

Per una matrice quadrata i Acui autovalori hanno tutti una molteplicità geometrica di 1, il processo di decomposizione della Giordania può essere descritto come tale:

  1. Sia λ = {λ_1, λ_2, ... λ_n}l'elenco di autovalori di A, con molteplicità, con autovalori ripetuti che compaiono consecutivamente.
  2. Crea una matrice diagonale i Jcui elementi sono gli elementi di λ, nello stesso ordine.
  3. Per ogni autovalore con molteplicità maggiore di 1, posizionare 1a alla destra di ciascuna delle ripetizioni dell'autovalore nella diagonale principale di J, tranne l'ultima.

La matrice risultante Jè una forma normale della Giordania di A(possono esistere più forme normali della Giordania per una data matrice, a seconda dell'ordine degli autovalori).

Un esempio funzionante

Sia Ala seguente matrice:

Una matrice

Gli autovalori di A, con molteplicità, sono λ = {1, 2, 4, 4}. Inserendo questi in una matrice diagonale, otteniamo questo risultato:

passo 2

Successivamente, posizioniamo 1s alla destra di tutti tranne uno di ciascuno degli autovalori ripetuti. Poiché 4è l'unico autovalore ripetuto, posizioniamo un singolo 1accanto al primo 4:

forma di Giordania

Questa è una forma normale della Giordania di A(una singola matrice può potenzialmente avere diverse forme normali della Giordania valide, ma sto esaminando quel dettaglio a scopo di spiegazione).

L'obiettivo

Data una matrice quadrata Acome input, genera una forma normale valida di Jordan A.

  • L'input e l'output possono essere in qualsiasi formato ragionevole (array / list 2D / qualunque cosa, list / array / qualunque dei vettori di colonna o riga, un tipo di dati a matrice incorporato, ecc.).
  • Gli elementi e gli autovalori di Asaranno sempre numeri interi nell'intervallo [-200, 200].
  • Per semplicità, tutti gli autovalori avranno una molteplicità geometrica di 1 (e quindi vale il processo sopra).
  • A sarà al massimo una matrice 10x10 e almeno una matrice 2x2.
  • Non sono consentiti builtin che calcolano autovalori e / o autovettori o eseguono la composizione elettronica, la decomposizione della Giordania o qualsiasi altro tipo di decomposizione / diagonalizzazione. Sono ammessi l'aritmetica della matrice, l'inversione della matrice e altri built-in della matrice.

Casi test

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

Risposte:


4

Mathematica, 140 139 105 byte

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

Ho appena trovato l'integrato DiagonalMatrixche consente un modo semplice per posizionare gli 0 e 1 lungo la superdiagonale.

uso

Esempio


Che dire Last@JordanDecomposition@#&? O è barare?
Ruslan,

@Ruslan Sì, una delle regole è che i builtin che eseguono la decomposizione della Giordania non sono ammessi. Grazie comunque.
miglia

2

Sage, 79 byte

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

Provalo online

Dal momento che nessun altro sta pubblicando soluzioni, potrei anche andare avanti e pubblicarne una.

A.charpoly.roots()calcola le radici (e le molteplicità algebriche) del polinomio caratteristico di A(alias gli autovalori e le molteplicità). jordan_blockcostruisce un blocco Jordan dalla radice data e dalla molteplicità. block_diagonal_matrixforma una matrice con i blocchi Jordan sulla diagonale, che è esattamente la definizione di una forma normale Jordan.


2

J , 78 71 byte

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

Provalo online!

Le due parti impegnative di questo compito, ottenendo gli autovalori ed eseguendo la diagonalizzazione, finiscono per prendere entrambi lo stesso numero di byte. Questi sono stati vietati dalle regole, ma nel caso in cui siano curiosi, J ha builtin per la decomposizione QR ( 128!:0) così come i componenti aggiuntivi LAPACK che potrebbero essere usati per trovare autovalori.

Spiegazione (obsoleta)

Ci sono due parti principali di questo verbo: trovare gli autovalori ed eseguire la diagonalizzazione. Innanzitutto, per trovare gli autovalori, dovranno essere trovate le radici del polinomio caratteristico per la matrice di input. Utilizzando la stessa matrice di input dell'esempio,

   ] 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

Il polinomio caratteristico per una matrice M può essere trovato usando | M - λI | = 0 dove I è la matrice identità con le stesse dimensioni M . L'espressione M - λI può essere modellata in J inscatolando ogni elemento in M con un -1 se si trova sulla diagonale, altrimenti uno 0. Ogni riquadro rappresenta un polinomio in forma di coefficiente.

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

Il determinante in J è -/ .*tuttavia che opera su numeri, non su polinomi in scatola. Invece della moltiplicazione, è necessario il prodotto polinomiale che può essere trovato usando convolution ( [:+//.*/). La sottrazione piegata viene ancora utilizzata ed entrambi questi verbi devono operare all'interno di caselle, quindi in &.( >) viene utilizzato unbox ( ).

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

Questi sono i coefficienti del polinomio caratteristico. Le radici possono essere trovate usando ciò p.che converte la rappresentazione di un polinomio tra coefficienti e forma delle radici.

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

Le radici sono [4, 4, 2, 1]e questi sono gli autovalori di M .

In secondo luogo, la diagonalizzazione deve essere eseguita. Ogni coppia continua di valori viene verificata per l'uguaglianza.

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

Viene aggiunto uno zero e tali valori vengono columinizzati insieme agli autovalori.

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

Quindi ogni riga viene riempita con la stessa lunghezza del numero di autovalori per formare una matrice quadrata.

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

Infine, ogni riga viene spostata a destra con i valori che cadono a destra e gli zeri che vengono spinti a sinistra. La prima riga viene spostata di zero volte, la seconda una volta, la terza due volte e così via.

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

L'uscita è la decomposizione di Jordan M .



1

MATL , 29 byte, non concorrenti

1$Yn1$ZQYotdUZS~0hXdF1hYSwXd+

Provalo online!

Questa è la mia prima presentazione MATL, quindi ci saranno sicuramente miglioramenti. Ho trascorso un po 'di tempo a impararlo e solo alla fine mi sono ricordato che questo potrebbe non aver funzionato usando il MATL dal 7 maggio 2016. Abbastanza sicuro, ho verificato il penultimo impegno fino a quel giorno e non è stato eseguito.

Mi sarebbe piaciuto usare diagma sembra che MATL supporti solo la versione a argomento singolo. Il secondo argomento sarebbe necessario per posizionare i valori lungo la superdiagonale (o qualsiasi altra diagonale per problemi diversi).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.