Decomposição da Jordânia

18

Nota importante : Como esse desafio se aplica apenas a matrizes quadradas, sempre que eu uso o termo "matriz", presume-se que estou me referindo a uma matriz quadrada. Estou deixando de fora a descrição "quadrada" por uma questão de brevidade.

fundo

Muitas operações relacionadas à matriz, como calcular o determinante, resolver um sistema linear ou estender funções com valor escalar para matrizes são facilitadas usando uma matriz diagonal (uma cujos elementos que não estão na diagonal principal são 0) que é semelhante para a matriz original (ou seja, para a matriz de entrada Ae a matriz diagonal D, existe alguma matriz invertível Pque D = P^(-1) * A * P, Dalém de Acompartilhar algumas propriedades importantes, como autovalores, determinantes e traços). Para matrizes com valores próprios distintos (as raízes do polinômio característico da matriz, dadas pela resolução det(A-λI) = 0de λ, onde Ié a matriz de identidade com as mesmas dimensões A), a diagonalização é simples:Dé uma matriz com os autovalores na diagonal principal e Pé uma matriz formada a partir de autovetores correspondentes a esses autovalores (na mesma ordem). Esse processo é chamado de composição automática .

No entanto, matrizes com valores próprios repetidos não podem ser diagonalizadas dessa maneira. Felizmente, a forma normal de qualquer matriz de Jordan pode ser calculada com bastante facilidade e não é muito mais difícil de trabalhar do que uma matriz diagonal regular. Ele também possui a propriedade legal de que, se os autovalores forem únicos, a decomposição de Jordan será idêntica à autocomposição.

Decomposição da Jordânia explicada

Para uma matriz quadrada Acujos valores próprios têm uma multiplicidade geométrica de 1, o processo de decomposição de Jordan pode ser descrito da seguinte forma:

  1. Seja λ = {λ_1, λ_2, ... λ_n}a lista de autovalores de A, com multiplicidade, com autovalores repetidos aparecendo consecutivamente.
  2. Crie uma matriz diagonal Jcujos elementos são os elementos de λ, na mesma ordem.
  3. Para cada valor próprio com multiplicidade maior que 1, coloque 1a à direita de cada uma das repetições do valor próprio na diagonal principal de J, exceto a última.

A matriz resultante Jé uma forma normal de Jordan A(pode haver várias formas normais de Jordan para uma determinada matriz, dependendo da ordem dos valores próprios).

Um exemplo trabalhado

Let ASer a seguinte matriz:

Uma matriz

Os autovalores de A, com multiplicidade, são λ = {1, 2, 4, 4}. Ao colocá-los em uma matriz diagonal, obtemos o resultado:

passo 2

Em seguida, colocamos 1s à direita de todos, exceto um de cada um dos autovalores repetidos. Como 4é o único valor próprio repetido, colocamos um único 1próximo aos 4 primeiros:

formulário jordan

Esta é uma forma normal do Jordan A(uma única matriz pode potencialmente ter vários formulários normais do Jordan válidos, mas estou examinando esses detalhes para fins de explicação).

A tarefa

Dada uma matriz quadrada Acomo entrada, produza uma forma normal válida de Jordan de A.

  • A entrada e a saída podem estar em qualquer formato razoável (matriz / lista 2D / qualquer que seja, lista / matriz / qualquer que seja o vetor de colunas ou linhas, um tipo de dados de matriz incorporado, etc.).
  • Os elementos e valores próprios Asempre serão números inteiros no intervalo [-200, 200].
  • Por uma questão de simplicidade, todos os autovalores terão uma multiplicidade geométrica de 1 (e, portanto, o processo acima é válido).
  • A será no máximo uma matriz 10x10 e pelo menos uma matriz 2x2.
  • Construções que calculam valores próprios e / ou vetores próprios ou executam composição automática, decomposição de Jordan ou qualquer outro tipo de decomposição / diagonalização não são permitidos. Aritmética de matriz, inversão de matriz e outras incorporadas à matriz são permitidas.

Casos de teste

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

Respostas:

4

Mathematica, 140 139 105 bytes

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

Acabei de encontrar o builtin, DiagonalMatrixque permite uma maneira fácil de colocar os 0s e 1s ao longo da superdiagonal.

Uso

Exemplo

milhas
fonte
Que tal Last@JordanDecomposition@#&? Ou é trapaça?
Ruslan #
@Ruslan Sim, uma das regras é que os componentes internos que executam a decomposição da Jordânia não são permitidos. Obrigado embora.
miles
2

Sábio, 79 bytes

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

Experimente online

Como ninguém mais está postando soluções, é melhor ir em frente e postar uma.

A.charpoly.roots()calcula as raízes (e multiplicidades algébricas) do polinômio característico de A(também conhecido como autovalores e multiplicidades). jordan_blockconstrói um bloco Jordan a partir da raiz e multiplicidade especificadas. block_diagonal_matrixforma uma matriz com os blocos de Jordan na diagonal, que é exatamente a definição de uma forma normal de Jordan.

Mego
fonte
2

J , 78 71 bytes

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

Experimente online!

As duas partes desafiadoras desta tarefa, obtendo os valores próprios e realizando a diagonalização, acabam tendo o mesmo número de bytes. Elas não foram permitidas pelas regras, mas, se houver alguma curiosidade, J construiu para a decomposição do QR ( 128!:0), bem como complementos do LAPACK, que poderiam ser usados ​​para encontrar valores próprios.

Explicação (desatualizada)

Existem duas partes principais desse verbo: encontrar os valores próprios e executar a diagonalização. Primeiro, para encontrar os autovalores, as raízes do polinômio característico da matriz de entrada deverão ser encontradas. Usando a mesma matriz de entrada do exemplo,

   ] 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

O polinômio característico de uma matriz M pode ser encontrado usando | M - λI | = 0, onde I é a matriz identidade com as mesmas dimensões que M . A expressão M - λI pode ser modelada em J encaixotando cada elemento em M com -1 se estiver na diagonal; caso contrário, um 0. Cada caixa representa um polinômio em forma de coeficiente.

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

O determinante em J é -/ .*, no entanto, que opera em números, não em polinômios em caixa. Em vez de multiplicação, é necessário o produto polinomial que pode ser encontrado usando convolução ( [:+//.*/). A subtração dobrada ainda é usada, e ambos os verbos precisam operar dentro de caixas para que sob ( &.) unbox ( >) seja usado.

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

Estes são os coeficientes do polinômio característico. As raízes podem ser encontradas usando o p.que converte a representação de um polinômio entre coeficientes e forma de raízes.

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

As raízes são [4, 4, 2, 1]e aqueles que são os valores próprios de M .

Segundo, a diagonalização deve ser realizada. Cada par contínuo de valores é testado quanto à igualdade.

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

Um zero é acrescentado e esses valores são columinizados juntamente com os valores próprios.

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

Em seguida, cada linha é preenchida com o mesmo comprimento que o número de valores próprios para formar uma matriz quadrada.

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

Finalmente, cada linha é deslocada para a direita, com os valores caindo à direita e os zeros sendo pressionados à esquerda. A primeira linha é deslocada zero vezes, a segunda uma vez, a terceira duas vezes e assim por diante.

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

A saída é a decomposição Jordan de M .

milhas
fonte
1

Oitava , 60 bytes

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

Experimente online!

Uma porta da minha solução Mathematica .

milhas
fonte
1

MATL , 29 bytes, não concorrente

1$Yn1$ZQYotdUZS~0hXdF1hYSwXd+

Experimente online!

Este é o meu primeiro envio de MATL, portanto, é provável que haja melhorias. Passei um tempo aprendendo e apenas no final lembrei que isso poderia não ter funcionado usando o MATL a partir de 7 de maio de 2016. Com certeza, verifiquei o penúltimo commit desse dia e ele não foi executado.

Eu gostaria de usar, diagmas parece que o MATL suporta apenas a versão de argumento único. O segundo argumento seria necessário para colocar valores ao longo da superdiagonal (ou qualquer outra diagonal para problemas diferentes).

milhas
fonte