Para aqueles com um pouco de fundo de álgebra linear, o desafio é simples: determine os autovalores e autovetores de uma dada matriz 2x2 complexa. Você pode pular adiante para os detalhes do Desafio para E / S, etc. Para aqueles que precisam de um pouco de atualização em sistemas eigensystems, continue lendo.
fundo
A equação característica de uma matriz A é definida por
det| A - λI | = 0
onde λ é um parâmetro complexo (escalar), I é a matriz de identidade e det | ... | é o determinante . O lado esquerdo avalia um polinômio em λ , o polinômio característico , que é quadrático no caso de matrizes 2x2. As soluções dessa equação característica são os autovalores de A , que iremos designar como λ 1 e λ 2 .
Agora os autovetores v i de A satisfazem
A vi = λi vi
Para cada λ i , isso fornece um sistema de duas equações em duas incógnitas (os componentes de v i ), que podem ser resolvidos facilmente. Você notará que o sistema é realmente subespecificado e a magnitude dos vetores próprios não é determinada pelas equações. Em geral, queremos que os vetores próprios sejam normalizados, ou seja, √ (| x | 2 + | y | 2 ) = 1 , onde x e y são os componentes do vetor, | x | 2 é x multiplicado pelo seu conjugado complexo.
Observe que os valores próprios podem ser degenerados, ou seja, λ 1 = λ 2 . Nesse caso, você pode ou não conseguir satisfazer o sistema único de equações com dois vetores próprios linearmente independentes.
O desafio
Dada uma matriz 2x2 com elementos complexos, determine seus dois valores próprios (possivelmente idênticos) e um vetor próprio normalizado para cada valor próprio. Os números resultantes devem ter precisão de pelo menos três dígitos significativos (decimais). Você pode assumir que as partes reais e imaginárias de qualquer elemento da matriz estão no intervalo [-1,1] .
Você pode escrever uma função ou um programa, recebendo entradas via STDIN, argumento de linha de comando, prompt ou argumento de função. Você pode enviar o resultado para STDOUT, uma caixa de diálogo ou como o valor de retorno da função.
Você pode usar qualquer formato de lista ou string conveniente (mas não ambíguo) para entrada e saída. Você também pode escolher entre pares de carros alegóricos ou tipos complexos para representar os números individuais.
Você não deve usar funções internas para resolver sistemas auto-gerenciáveis (como o Mathematica Eigenvectors
ou Eigensystem
) ou solucionadores de equações.
Isso é código de golfe, então a resposta mais curta (em bytes) vence.
Exemplos
Cada exemplo é de três linhas: a entrada, os valores próprios e os vetores próprios correspondentes na mesma ordem. Observe que os autovetores são determinados apenas até sua fase e que, no caso de autovalores degenerados, os autovetores podem realmente ser arbitrários (como no primeiro exemplo).
[[1.0, 0.0], [0.0, 1.0]]
[1.0, 1.0]
[[1.0, 0.0], [0.0, 1.0]]
[[0.0, 0.4], [-0.1, -0.4]]
[-0.2, -0.2]
[[0.894427, -0.447214], [0.894427, -0.447214]]
[[0.3, 0.1], [0.4, -0.9]]
[-0.932456, 0.332456]
[[-0.0808731, 0.996724], [0.951158, 0.308703]]
[[0.5, -1.0], [0.8, -0.5]]
[0.74162i, - 0.74162i]
[[0.745356, 0.372678 - 0.552771i], [0.745356, 0.372678 + 0.552771i]]
[[-0.0539222 + 0.654836i, -0.016102 + 0.221334i], [0.739514 - 0.17735i, -0.0849216 + 0.77977i]]
[0.238781 + 0.984333i, -0.377625 + 0.450273i]
[[0.313668 + 0.322289i, 0.893164], [-0.236405 - 0.442194i, 0.865204]]
[[-0.703107 - 0.331792i, 0.286719 - 0.587305i], [-0.418476 + 0.396347i, -0.885934 + 0.50534i]]
[-1.13654 - 0.32678i, -0.4525 + 0.500329i]
[[0.833367, -0.248208 - 0.493855i], [-0.441133 - 0.408236i, 0.799215]]
[[-0.156312 + 0.788441i, 0.045056 - 0.579167i], [0.130741 - 0.97017i, 0.049183 - 0.590768i]]
[-0.181759 + 1.11738i, 0.0746298 - 0.919707i]
[[0.86955, -0.493846 + 0.000213145i], [0.318856 - 0.0181135i, 0.94763]]
fonte