introduzione
Le due funzioni trigonometriche più comuni, sine
e cosine
(o sin
e cos
in breve), possono essere estesi ad essere funzioni di matrici a valori. Un modo per calcolare gli analoghi valutati a matrice è il seguente:
Considera queste due importanti identità trigonometriche:
Usando queste identità, possiamo derivare le seguenti equazioni per sin
e cos
:
La matrice esponenziale esiste per tutte le matrici quadrate ed è data da:
dove A 0 è la matrice identità che con le stesse dimensioni A . Usando l'esponenziale della matrice, queste due funzioni trigonometriche (e quindi tutte le altre funzioni trigonometriche) possono essere valutate come funzioni di matrici.
La sfida
Data una matrice quadrata A , genera i valori di sin(A)
e cos(A)
.
Regole
- L'input e l'output possono essere in qualsiasi formato conveniente e ragionevole (array 2D, formato matrice della tua lingua, ecc.).
- È possibile scrivere un singolo programma, due programmi indipendenti, una singola funzione o due funzioni. Se si sceglie di scrivere due funzioni, il codice potrebbe essere condiviso tra loro (come le funzioni di importazione e di supporto).
- I valori della matrice di input saranno sempre numeri interi.
- La soluzione potrebbe presentare problemi di precisione a causa dell'imprecisione in virgola mobile. Se il tuo linguaggio aveva magici valori di precisione infinita, allora la tua soluzione dovrebbe funzionare perfettamente (ignorando il fatto che richiederebbe tempo e / o memoria infiniti). Tuttavia, poiché non esistono quei magici valori di precisione infinita, sono inaccettabili le imprecisioni causate da una precisione limitata. Questa regola è in atto per evitare complicazioni derivanti dalla richiesta di una quantità specifica di precisione nell'output.
- Non sono consentiti i builtin che calcolano le funzioni trigonometriche per gli argomenti di matrice (comprese le funzioni di trigocia iperbolica). Sono consentiti altri built-in di matrice (come moltiplicazione, esponenziazione, diagonalizzazione, decomposizione ed esponenziale della matrice).
Casi test
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]]
Ulteriori letture
Questa eccellente domanda di Math.SE include alcune derivazioni alternative degli analoghi valutati a matrice di funzioni trigonometriche.
(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}}
con Mathematica, puoi controllare?