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 Ason 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 Iestá 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, Irepresenta 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ónzcalcula todas las raíces de ese polinomio mediante la iteracióngque implementa el Método de Laguerre para encontrar una raíz, una vez que se encuentra una raíz, se elimina y segvuelve 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,zipWithy(&)así como el pequeño ayudante(!). La funciónfaddeevLeVerriercorresponde af,rootsazygalaguerre, 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
eigincorporado. 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ñonen 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
solverealmente no está a la altura de la tarea) que no utiliza incorporados, sino que resuelve simbólicamente el problema de valor propiodet(A-λI)=0y lo convierte a forma numérica usandovpafuente
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
mcomo una matriz. Frustrantemente, laeigenfunción en R devuelve un objeto de claseeigen, que tiene dos campos:valueslos valores propios yvectorslos vectores propios.Sin embargo, de manera más molesta, el argumento opcional
only.valuesdevuelve unlistcon dos campos, quevaluescontiene 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,
eigdevuelve 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