Introducción
Las dos funciones trigonométricas más comunes, sine
y cosine
(o sin
ycos
para abreviar), pueden extenderse para ser funciones con valores de matriz. Una forma de calcular los análogos con valores de matriz es la siguiente:
Considere estas dos identidades trigonométricas importantes:
Usando estas identidades, podemos derivar las siguientes ecuaciones para sin
y cos
:
La matriz exponencial existe para todas las matrices cuadradas y viene dada por:
donde A 0 es la matriz de identidad I con las mismas dimensiones que A . Usando la matriz exponencial, estas dos funciones trigonométricas (y, por lo tanto, todas las demás funciones trigonométricas) pueden evaluarse como funciones de matrices.
El reto
Dada una matriz cuadrada A , genera los valores de sin(A)
y cos(A)
.
Reglas
- La entrada y la salida pueden estar en cualquier formato conveniente y razonable (matriz 2D, formato de matriz de su idioma, etc.).
- Puede escribir un solo programa, dos programas independientes, una sola función o dos funciones. Si elige escribir dos funciones, el código puede compartirse entre ellas (como las importaciones y las funciones auxiliares).
- Los valores de la matriz de entrada siempre serán enteros.
- Su solución puede tener problemas de precisión como resultado de la imprecisión de punto flotante. Si su lenguaje tenía valores mágicos de precisión infinita, entonces su solución debería funcionar perfectamente (ignorando el hecho de que requeriría tiempo y / o memoria infinitos). Sin embargo, dado que esos valores mágicos de precisión infinita no existen, las imprecisiones causadas por la precisión limitada son aceptables. Esta regla está en su lugar para evitar complicaciones resultantes de requerir una cantidad específica de precisión en la salida.
- No se permiten los componentes integrados que calculan funciones trigonométricas para argumentos de matriz (incluidas las funciones trigonométricas hiperbólicas). Se permiten otras matrices integradas de la matriz (como la multiplicación, exponenciación, diagonalización, descomposición y la exponencial de la matriz).
Casos de prueba
Formato: A -> sin(A), cos(A)
[[0]] -> [[0]], [[1]]
[[0, 2], [3, 5]] -> [[-0.761177343863758, 0.160587281888277], [0.240880922832416, -0.359709139143065]], [[0.600283445979886, 0.119962280223493], [0.179943420335240, 0.900189146538619]]
[[1, 0, 1], [0, 0, 0], [0, 1, 0]] -> [[0.841470984807897, -0.158529015192103, 0.841470984807897], [0, 0, 0], [0, 1, 0]], [[0.540302305868140, -0.459697694131860, -0.459697694131860], [0, 1, 0], [0, 0, 1]]
[[1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 1]] -> [[0.841470984807897, 0, 0, 0, 0], [0, 0.841470984807897, 0, 0, 0], [0, 0, 0.841470984807897, 0, 0], [0, 0, 0, 0.841470984807897, 0], [0, 0, 0, 0, 0.841470984807897]], [[0.540302305868140, 0, 0, 0, 0], [0, 0.540302305868140, 0, 0, 0], [0, 0, 0.540302305868140, 0, 0], [0, 0, 0, 0.540302305868140, 0], [0, 0, 0, 0, 0.540302305868140]]
[[-3, 2, -6], [3, 0, 4], [4, -2, 7]] -> [[-0.374786510963954, 0.135652884035570, -1.35191037980742], [1.14843105375406, 0.773644542790111, 1.21625749577185], [1.21625749577185, -0.135652884035570, 2.19338136461532]], [[4.13614256031450, -1.91289828483056, 5.50873853927692], [-2.63939111203107, 1.49675144828342, -3.59584025444636], [-3.59584025444636, 1.91289828483056, -4.96843623340878]]
Otras lecturas
Esta excelente pregunta en Math.SE incluye algunas derivaciones alternativas de los análogos de funciones trigonométricas con valores de matriz.
sin([[1, 0, 1], [0, 0, 0], [0, 1, 0]]) = {{0.841, -0.158, 0.841}, {0, 0, 0}, {0, 1, 0}}
con Mathematica, ¿puedes verificar?(ignoring the fact that it would require infinite time and/or memory)
Respuestas:
Julia,
3319 bytesEsta es una función que acepta una matriz bidimensional de flotadores y devuelve una tupla de tales matrices correspondiente al coseno y seno, respectivamente. Tenga en cuenta que este es el reverso del orden dado en los casos de prueba, en los que el seno se enumera primero.
Para una matriz A de valor real , tenemos
y
Es decir, el seno y el coseno de A corresponden a las partes imaginarias y reales de la matriz exponencial e iA . Ver Funciones de matrices (Higham, 2008).
Pruébalo en línea!(incluye todos los casos de prueba)
¡Guardado 14 bytes gracias a Dennis!
fuente
Mathematica, 27 bytes
Basado en @ Rainer P. la solución de
Toma la matriz cuadrada
A
como argumento y genera una lista que contiene{sin(A), cos(A)}
.La entrada está formateada
N
para obtener un valor numérico en lugar de una fórmula exacta larga yColumn
para mostrar los resultados desin(A)
ycos(A)
como matrices separadas en lugar de una lista anidada.Calcular los valores por separado requiere 38 bytes
fuente
Jalea ,
2322 bytesPruébalo en línea!
Antecedentes
Este enfoque calcula directamente la serie de Taylor para seno y coseno , es decir,
Aumenta el número de términos iniciales de ambas series hasta que el resultado ya no cambia, por lo que su precisión solo está limitada por la precisión del tipo de punto flotante.
Cómo funciona
fuente
Matlab,
138121 5250 bytesComo la exponenciación matricial está permitida, (lo que no noté primero, por supuesto) ya no necesito definir mi función auxiliar, y todo se puede resolver trivialmente:
La entrada debe ser una matriz, por ejemplo,
[1,2;4,5]
o alternativamente[[1,2];[3,4]]
Una cosa inesperada (en retrospectiva no tan inesperada) es que el coseno y la matriz sinusoidal aún satisfacen
fuente
A^0
mismo queeye(size(A))
?expm
?Matlab, 37 bytes
fuente
C ++, 305 bytes
La entrada es una lista de números que son un cuadrado perfecto en stdin. La salida es una matriz 2d bastante impresa en stdout
fuente
Julia 0.4, 28 bytes
La entrada es una matriz de flotadores, la salida es una matriz de matrices. Pruébalo en línea!
fuente
Sabio, 44 bytes
Pruébalo en línea .
Esta función anónima devuelve una lista de 2 matrices correspondientes a
sin(A)
ycos(A)
, respectivamente.exp(I*A)
calcula la matriz exponencial paraI*A
(A
con todos los elementos multiplicados por la unidad imaginaria) ymatrix.apply_map(f)
devuelve una matriz dondef
se ha aplicado a todos sus elementos. Al aplicarimag
yreal
(las funciones para obtener las partes imaginarias y reales de un valor escalar) a las matrices, obtenemos los valoressin(A)
ycos(A)
, gracias a la famosa identidad de Euler (referenciada en el texto del desafío).fuente