Dada una matriz cuadrada, genera los valores propios de la matriz. Cada valor propio debe repetirse varias veces igual a su multiplicidad algebraica.
Los valores propios de una matriz A
son valores escalares λ
de tal manera que, por alguna vector columna v
, A*v = λ*v
. También son las soluciones al polinomio característico de A
: det(A - λ*I) = 0
(donde I
está la matriz de identidad con las mismas dimensiones que A
).
Las salidas deben tener una precisión de 3 dígitos significativos. Todas las entradas y salidas estarán dentro del rango representable de valores numéricos para el idioma elegido.
Las incorporaciones son aceptables, pero le recomendamos que incluya soluciones que no las utilicen.
Casos de prueba
En estos casos de prueba, I
representa la unidad imaginaria. Los números complejos se escriben en el formulario a + b*I
. Todas las salidas tienen 3 dígitos significativos de precisión.
[[42.0]] -> [42.0]
[[1.0, 0.0], [0.0, 1.0]] -> [1.00, 1.00]
[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]] -> [16.1, -1.12, -1.24e-15]
[[1.2, 3.4, 5.6, 7.8], [6.3, 0.9, -5.4, -2.3], [-12.0, -9.7, 7.3, 5.9], [-2.5, 7.9, 5.3, 4.4]] -> [7.20 + 5.54*I, 7.20 - 5.54*I, -4.35, 3.75]
[[-3.22 - 9.07*I, 0.193 + 9.11*I, 5.59 + 1.33*I, -3.0 - 6.51*I, -3.73 - 6.42*I], [8.49 - 3.46*I, -1.12 + 6.39*I, -8.25 - 0.455*I, 9.37 - 6.43*I, -6.82 + 8.34*I], [-5.26 + 8.07*I, -6.68 + 3.72*I, -3.21 - 5.63*I, 9.31 + 3.86*I, 4.11 - 8.82*I], [-1.24 + 9.04*I, 8.87 - 0.0352*I, 8.35 + 4.5*I, -9.62 - 2.21*I, 1.76 - 5.72*I], [7.0 - 4.79*I, 9.3 - 2.31*I, -2.41 - 7.3*I, -7.77 - 6.85*I, -9.32 + 2.71*I]] -> [5.18 + 16.7*I, -24.9 - 2.01*I, -5.59 - 13.8*I, 0.0438 - 10.6*I, -1.26 + 1.82*I]
[[-30.6 - 73.3*I, 1.03 - 15.6*I, -83.4 + 72.5*I, 24.1 + 69.6*I, 52.3 + 2.68*I, 23.8 + 98.0*I, 96.8 + 49.7*I, -26.2 - 5.87*I, -52.4 + 98.2*I, 78.1 + 6.69*I], [-59.7 - 66.9*I, -26.3 + 65.0*I, 5.71 + 4.75*I, 91.9 + 82.5*I, -94.6 + 51.8*I, 61.7 + 82.3*I, 54.8 - 27.8*I, 45.7 + 59.2*I, -28.3 + 78.1*I, -59.9 - 54.5*I], [-36.0 + 22.9*I, -51.7 + 10.8*I, -46.6 - 88.0*I, -52.8 - 32.0*I, -75.7 - 23.4*I, 96.2 - 71.2*I, -15.3 - 32.7*I, 26.9 + 6.31*I, -59.2 + 25.8*I, -0.836 - 98.3*I], [-65.2 - 90.6*I, 65.6 - 24.1*I, 72.5 + 33.9*I, 1.47 - 93.8*I, -0.143 + 39.0*I, -3.71 - 30.1*I, 60.1 - 42.4*I, 55.6 + 5.65*I, 48.2 - 53.0*I, -3.9 - 33.0*I], [7.04 + 0.0326*I, -12.8 - 50.4*I, 70.1 - 30.3*I, 42.7 - 76.3*I, -3.24 - 64.1*I, 97.3 + 66.8*I, -11.0 + 16.5*I, -40.6 - 90.7*I, 71.5 - 26.2*I, 83.1 - 49.4*I], [-59.5 + 8.08*I, 74.6 + 29.1*I, -65.8 + 26.3*I, -76.7 - 83.2*I, 26.2 + 99.0*I, -54.8 + 33.3*I, 2.79 - 16.6*I, -85.2 - 3.64*I, 98.4 - 12.4*I, -27.6 - 62.3*I], [82.6 - 95.3*I, 55.8 - 73.6*I, -49.9 + 42.1*I, 53.4 + 16.5*I, 80.2 - 43.6*I, -43.3 - 3.9*I, -2.26 - 58.3*I, -19.9 + 98.1*I, 47.2 + 62.4*I, -63.3 - 54.0*I], [-88.7 + 57.7*I, 55.6 + 70.9*I, 84.1 - 52.8*I, 71.3 - 29.8*I, -3.74 - 19.6*I, 29.7 + 1.18*I, -70.6 - 10.5*I, 37.6 + 99.9*I, 87.0 + 19.0*I, -26.1 - 82.0*I], [69.5 - 47.1*I, 11.3 - 59.0*I, -84.3 - 35.1*I, -3.61 - 35.7*I, 88.0 + 88.1*I, -47.5 + 0.956*I, 14.1 + 89.8*I, 51.3 + 0.14*I, -78.5 - 66.5*I, 2.12 - 53.2*I], [0.599 - 71.2*I, 21.7 + 10.8*I, 19.9 - 97.1*I, 20.5 + 37.4*I, 24.7 + 40.6*I, -82.7 - 29.1*I, 77.9 + 12.5*I, 94.1 - 87.4*I, 78.6 - 89.6*I, 82.6 - 69.6*I]] -> [262. - 180.*I, 179. + 117.*I, 10.3 + 214.*I, 102. - 145.*I, -36.5 + 97.7*I, -82.2 + 89.8*I, -241. - 104.*I, -119. - 26.0*I, -140. - 218.*I, -56.0 - 160.*I]
Respuestas:
Haskell ,
576 554 532507 bytesNo hay incorporados!
Pruébalo en línea!
¡Muchas gracias @ ØrjanJohansen por un total de -47 bytes!
Explicación
Primero, calcula el polinomio característico con el algoritmo Faddeev-LeVerrier, que es la función
f
. Luego, la funciónz
calcula todas las raíces de ese polinomio mediante la iteracióng
que implementa el Método de Laguerre para encontrar una raíz, una vez que se encuentra una raíz, se elimina y seg
vuelve a llamar hasta que el polinomio tenga un grado 1 que se resuelve trivialmentez[a,b]=[-b/a]
.Sin golf
Me re-inline las funciones
sum
,length
,magnitude
,fromIntegral
,zipWith
y(&)
así como el pequeño ayudante(!)
. La funciónfaddeevLeVerrier
corresponde af
,roots
az
yg
alaguerre
, respectivamente.fuente
n!
!!
y estaba realmente confundido: DOctava , 4 bytes
Pruébalo en línea!
¡Solo dos bytes más que el equivalente de lenguaje de golf MATL!
Define un identificador de función anónimo para el
eig
incorporado. Curiosamente, la filosofía de diseño de MATLAB va en contra de muchos lenguajes de alta gama, que les gusta usarDescripteFunctionNamesTakingArguments()
, mientras que MATLAB y, en consecuencia, Octave tienden a obtener el nombre de función más breve e inequívoco posible. Por ejemplo, para obtener una s ubset de valores propios (por ejemplo, el más pequeñon
en magnitud absoluta), se utilizaeigs
.Como beneficio adicional, aquí hay una función (funciona en MATLAB, y en teoría podría funcionar en Octave pero
solve
realmente no está a la altura de la tarea) que no utiliza incorporados, sino que resuelve simbólicamente el problema de valor propiodet(A-λI)=0
y lo convierte a forma numérica usandovpa
fuente
MATL , 2 bytes
Pruébalo en línea!
Explicación
Seguí los consejos habituales en álgebra lineal numérica: en lugar de escribir su propia función, use una función incorporada que esté específicamente diseñada para evitar inestabilidades numéricas.
Por cierto, es más corto. ¯ \ _ (ツ) _ / ¯
fuente
Yv
?ZQ
) del polinomio característico. Pero calcular explícitamente los coeficientes del polinomio puede ser mucho trabajoMathematica, 11 bytes
Pruébalo en línea!
fuente
First@Eigensystem@#&
(20 bytes)R , 22 bytes
Pruébalo en línea!
Toma
m
como una matriz. Frustrantemente, laeigen
función en R devuelve un objeto de claseeigen
, que tiene dos campos:values
los valores propios yvectors
los vectores propios.Sin embargo, de manera más molesta, el argumento opcional
only.values
devuelve unlist
con dos campos, quevalues
contiene los valores propios yvectors
, establecido enNULL
, pero comoeigen(m,,T)
también tiene 22 bytes, es un lavado.fuente
Julia , 12 bytes
Pruébalo en línea!
Desafortunadamente,
eig
devuelve tanto los valores propios como los vectores propios, como una tupla, por lo que desperdiciamos otros 9 bytes para lambdificarlo y tomar el primer elemento.fuente
Python + numpy, 33 bytes
fuente
Pari / GP , 19 bytes
Pruébalo en línea!
fuente