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 A
e a matriz diagonal D
, existe alguma matriz invertível P
que D = P^(-1) * A * P
, D
além de A
compartilhar 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) = 0
de λ
, 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 A
cujos valores próprios têm uma multiplicidade geométrica de 1, o processo de decomposição de Jordan pode ser descrito da seguinte forma:
- Seja
λ = {λ_1, λ_2, ... λ_n}
a lista de autovalores deA
, com multiplicidade, com autovalores repetidos aparecendo consecutivamente. - Crie uma matriz diagonal
J
cujos elementos são os elementos deλ
, na mesma ordem. - Para cada valor próprio com multiplicidade maior que 1, coloque
1
a à direita de cada uma das repetições do valor próprio na diagonal principal deJ
, 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 A
Ser a seguinte matriz:
Os autovalores de A
, com multiplicidade, são λ = {1, 2, 4, 4}
. Ao colocá-los em uma matriz diagonal, obtemos o resultado:
Em seguida, colocamos 1
s à direita de todos, exceto um de cada um dos autovalores repetidos. Como 4
é o único valor próprio repetido, colocamos um único 1
próximo aos 4 primeiros:
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 A
como 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
A
sempre 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]]
Last@JordanDecomposition@#&
? Ou é trapaça?Sábio, 79 bytes
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 deA
(também conhecido como autovalores e multiplicidades).jordan_block
constrói um bloco Jordan a partir da raiz e multiplicidade especificadas.block_diagonal_matrix
forma uma matriz com os blocos de Jordan na diagonal, que é exatamente a definição de uma forma normal de Jordan.fonte
J ,
7871 bytesExperimente 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,
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.
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.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.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.
Um zero é acrescentado e esses valores são columinizados juntamente com os valores próprios.
Em seguida, cada linha é preenchida com o mesmo comprimento que o número de valores próprios para formar uma matriz quadrada.
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.
A saída é a decomposição Jordan de M .
fonte
Oitava , 60 bytes
Experimente online!
Uma porta da minha solução Mathematica .
fonte
MATL , 29 bytes, não concorrente
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,
diag
mas 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).fonte