introduction
Les deux fonctions trigonométriques les plus courantes, sine
et cosine
(ou sin
etcos
pour faire court), peuvent être étendues pour être des fonctions matricielles. Une façon de calculer les analogues à valeurs matricielles est la suivante:
Considérez ces deux identités trigonométriques importantes:
En utilisant ces identités, nous pouvons dériver les équations suivantes pour sin
et cos
:
L' exponentielle de matrice existe pour toutes les matrices carrées et est donnée par:
où A 0 est la matrice d'identité I avec les mêmes dimensions que A . En utilisant l'exponentielle matricielle, ces deux fonctions trigonométriques (et donc toutes les autres fonctions trigonométriques) peuvent être évaluées comme des fonctions de matrices.
Le défi
Étant donné une matrice carrée A , affichez les valeurs de sin(A)
et cos(A)
.
Règles
- L'entrée et la sortie peuvent être dans n'importe quel format pratique et raisonnable (tableau 2D, format matriciel de votre langue, etc.).
- Vous pouvez écrire un seul programme, deux programmes indépendants, une seule fonction ou deux fonctions. Si vous choisissez d'écrire deux fonctions, le code peut être partagé entre elles (telles que les importations et les fonctions d'assistance).
- Les valeurs de la matrice d'entrée seront toujours des entiers.
- Votre solution peut présenter des problèmes de précision en raison d'une imprécision en virgule flottante. Si votre langue avait des valeurs magiques de précision infinie, alors votre solution devrait fonctionner parfaitement (en ignorant le fait qu'elle nécessiterait un temps infini et / ou de la mémoire). Cependant, comme ces valeurs magiques de précision infinie n'existent pas, les inexactitudes causées par une précision limitée sont acceptables. Cette règle est en place pour éviter les complications résultant de la nécessité d'une précision spécifique dans la sortie.
- Les commandes internes qui calculent des fonctions trigonométriques pour les arguments de matrice (y compris les fonctions trigonométriques hyperboliques) ne sont pas autorisées. D'autres matrices intégrées (telles que la multiplication, l'exponentiation, la diagonalisation, la décomposition et l'exponentielle de la matrice) sont autorisées.
Cas de test
Format: 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]]
Lectures complémentaires
Cette excellente question de Math.SE comprend des dérivations alternatives des analogues matriciels des fonctions trigonométriques.
sin([[1, 0, 1], [0, 0, 0], [0, 1, 0]]) = {{0.841, -0.158, 0.841}, {0, 0, 0}, {0, 1, 0}}
avec Mathematica, pouvez-vous vérifier?(ignoring the fact that it would require infinite time and/or memory)
Réponses:
Julia,
3319 octetsIl s'agit d'une fonction qui accepte un tableau à deux dimensions de flotteurs et renvoie un tuple de ces tableaux correspondant respectivement au cosinus et au sinus. Notez qu'il s'agit de l'inverse de l'ordre donné dans les cas de test, dans lequel le sinus est répertorié en premier.
Pour une matrice A à valeur réelle , nous avons
et
C'est-à-dire que le sinus et le cosinus de A correspondent aux parties imaginaires et réelles de la matrice exponentielle e iA . Voir Fonctions des matrices (Higham, 2008).
Essayez-le en ligne! (inclut tous les cas de test)
Enregistré 14 octets grâce à Dennis!
la source
Mathematica, 27 octets
Basé sur la solution de @ Rainer P.
Prend la matrice carrée
A
comme argument et génère une liste contenant{sin(A), cos(A)}
.L'entrée est formatée avec
N
pour obtenir une valeur numérique au lieu d'une longue formule exacte etColumn
pour afficher les résultats desin(A)
et encos(A)
tant que matrices distinctes au lieu d'une liste imbriquée.Le calcul des valeurs séparément nécessite 38 octets
la source
Gelée ,
2322 octetsEssayez-le en ligne!
Contexte
Cette approche calcule directement la série de Taylor pour le sinus et le cosinus , c.-à-d.
Il augmente le nombre de termes initiaux des deux séries jusqu'à ce que le résultat ne change plus, de sorte que sa précision n'est limitée que par la précision du type à virgule flottante.
Comment ça fonctionne
la source
Matlab,
138 121 5250 octetsPuisque l'exponentiation matricielle est autorisée, (ce que je n'ai pas remarqué en premier, d'oh) je n'ai plus besoin de définir ma fonction d'aide, et le tout peut être résolu de manière triviale:
L'entrée doit être une matrice, par exemple
[1,2;4,5]
ou alternativement[[1,2];[3,4]]
Une chose inattendue (avec le recul pas si inattendu) est que la matrice cosinus et sinus satisfait toujours
la source
A^0
la même chose queeye(size(A))
?expm
?Matlab, 37 octets
la source
C ++, 305 octets
L'entrée est une liste de nombres qui sont un carré parfait sur stdin. La sortie est un joli tableau 2D imprimé sur stdout
la source
Julia 0.4, 28 octets
L'entrée est une matrice de flottants, la sortie est un tableau de matrices. Essayez-le en ligne!
la source
Sauge, 44 octets
Essayez-le en ligne .
Cette fonction anonyme renvoie une liste de 2 matrices correspondant respectivement à
sin(A)
etcos(A)
.exp(I*A)
calcule l'exponentielle de la matrice pourI*A
(A
avec tous les éléments multipliés par l'unité imaginaire) etmatrix.apply_map(f)
renvoie une matrice oùf
a été appliquée à tous ses éléments. En appliquantimag
etreal
(les fonctions pour obtenir les parties imaginaires et réelles d'une valeur scalaire) aux matrices, nous obtenons les valeurs desin(A)
etcos(A)
, grâce à la célèbre identité d'Euler (référencée dans le texte du défi).la source