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.
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?(ignoring the fact that it would require infinite time and/or memory)
Respostas:
Julia,
3319 bytesEsta é uma função que aceita uma matriz bidimensional de flutuadores e retorna uma tupla de tais matrizes correspondentes ao cosseno e seno, respectivamente. Observe que isso é o inverso da ordem dada nos casos de teste, nos quais o seno é listado primeiro.
Para uma matriz A de valor real , temos
e
Ou seja, o seno e cosseno de A correspondem às partes imaginárias e reais da matriz exponencial e iA . Veja Funções de matrizes (Higham, 2008).
Experimente online! (inclui todos os casos de teste)
Economizou 14 bytes graças a Dennis!
fonte
Mathematica, 27 bytes
Baseado na solução de @ Rainer P ..
Pega a matriz quadrada
A
como argumento e gera uma lista contendo{sin(A), cos(A)}
.A entrada é formatada com
N
para obter um valor numérico em vez de uma fórmula exata longa eColumn
exibir os resultados desin(A)
ecos(A)
como matrizes separadas em vez de uma lista aninhada.Calcular os valores separadamente requer 38 bytes
fonte
Geléia ,
2322 bytesExperimente online!
fundo
Essa abordagem calcula diretamente a série de Taylor para seno e cosseno , ou seja,
Ele aumenta o número de termos iniciais de ambas as séries até que o resultado não seja mais alterado, portanto, sua precisão é limitada apenas pela precisão do tipo de ponto flutuante.
Como funciona
fonte
Matlab,
138 121 5250 bytesComo a exponenciação de matriz é permitida (o que eu não notei primeiro, d'oh), não preciso mais definir minha função auxiliar, e tudo pode ser resolvido trivialmente:
A entrada deve ser uma matriz, por exemplo,
[1,2;4,5]
ou alternativamente[[1,2];[3,4]]
Uma coisa inesperada (em retrospectiva não tão inesperada) é que as matrizes cosseno e seno ainda satisfazem
fonte
A^0
o mesmo queeye(size(A))
?expm
?Matlab, 37 bytes
fonte
C ++, 305 bytes
Entrada é uma lista de números que são um quadrado perfeito no stdin. A saída é uma matriz 2D bastante impressa no stdout
fonte
Julia 0.4, 28 bytes
Input é uma matriz de flutuadores, output é uma matriz de matrizes. Experimente online!
fonte
Sábio, 44 bytes
Experimente online .
Essa função anônima retorna uma lista de 2 matrizes correspondentes a
sin(A)
ecos(A)
, respectivamente.exp(I*A)
calcula a exponencial da matriz paraI*A
(A
com todos os elementos multiplicados pela unidade imaginária) ematrix.apply_map(f)
retorna uma matriz ondef
foi aplicada a todos os seus elementos. Aplicandoimag
ereal
(as funções para obter as partes imaginárias e reais de um valor escalar) às matrizes, obtemos os valores desin(A)
ecos(A)
, graças à famosa identidade de Euler (referenciada no texto do desafio).fonte