Introdução
As duas funções trigonométricas mais comuns, sine
e cosine
(ou sin
e cos
para abreviar), pode ser estendida a ser valorizado funções de matriz. Uma maneira de calcular os análogos com valor de matriz é a seguinte:
Considere estas duas identidades trigonométricas importantes:
Usando essas identidades, podemos derivar as seguintes equações para sin
e cos
:
A exponencial da matriz existe para todas as matrizes quadradas e é dada por:
onde A 0 representa a matriz identidade I com as mesmas dimensões que um . Usando a matriz exponencial, essas duas funções trigonométricas (e, portanto, todas as outras funções trigonométricas) podem ser avaliadas como funções de matrizes.
O desafio
Dada uma matriz quadrada A , produza os valores de sin(A)
e cos(A)
.
Regras
- A entrada e a saída podem estar em qualquer formato conveniente e razoável (matriz 2D, formato de matriz do seu idioma etc.).
- Você pode escrever um único programa, dois programas independentes, uma única função ou duas funções. Se você optar por escrever duas funções, o código poderá ser compartilhado entre elas (como importações e funções auxiliares).
- Os valores da matriz de entrada sempre serão inteiros.
- Sua solução pode ter problemas de precisão como resultado de imprecisão de ponto flutuante. Se o seu idioma possui valores mágicos de precisão infinita, sua solução deve funcionar perfeitamente (ignorando o fato de que isso exigiria tempo e / ou memória infinitos). No entanto, como esses valores mágicos de precisão infinita não existem, imprecisões causadas por precisão limitada são aceitáveis. Esta regra está em vigor para evitar complicações resultantes da exigência de uma quantidade específica de precisão na saída.
- Construções que calculam funções trigonométricas para argumentos de matriz (incluindo funções trigonométricas hiperbólicas) não são permitidas. Outras construções internas da matriz (como multiplicação, exponenciação, diagonalização, decomposição e exponencial da matriz) são permitidas.
Casos de teste
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]]
Leitura adicional
Esta excelente pergunta sobre Math.SE inclui algumas derivações alternativas dos análogos com valor matricial das funções trigonométricas.
(ignoring the fact that it would require infinite time and/or memory)
sin([[1, 0, 1], [0, 0, 0], [0, 1, 0]]) = {{0.841, -0.158, 0.841}, {0, 0, 0}, {0, 1, 0}}
com o Mathematica, você pode conferir?