Einführung
Die beiden häufigsten trigonometrische Funktionen, sine
und cosine
(oder sin
und cos
kurz), kann erweitert werden , matrixWertFunktionen sind. Eine Möglichkeit, die Analoga mit Matrixwerten zu berechnen, ist die folgende:
Betrachten Sie diese beiden wichtigen trigonometrischen Identitäten:
Unter Verwendung dieser Identitäten können wir die folgenden Gleichungen für sin
und ableiten cos
:
Das Matrixexponential existiert für alle quadratischen Matrizen und ist gegeben durch:
wobei A 0 die Identitätsmatrix I mit den gleichen Dimensionen wie A ist . Mit der Matrixexponentialfunktion können diese beiden trigonometrischen Funktionen (und damit alle anderen trigonometrischen Funktionen) als Funktionen von Matrizen ausgewertet werden.
Die Herausforderung
Geben Sie bei einer quadratischen Matrix A die Werte von sin(A)
und aus cos(A)
.
Regeln
- Die Ein- und Ausgabe kann in jedem geeigneten, angemessenen Format erfolgen (2D-Array, Matrixformat Ihrer Sprache usw.).
- Sie können ein einzelnes Programm, zwei unabhängige Programme, eine einzelne Funktion oder zwei Funktionen schreiben. Wenn Sie zwei Funktionen schreiben möchten, wird der Code möglicherweise von beiden gemeinsam genutzt (z. B. Import- und Hilfsfunktionen).
- Die Werte der Eingabematrix sind immer ganze Zahlen.
- Ihre Lösung kann aufgrund von Gleitkommaungenauigkeiten Genauigkeitsprobleme aufweisen. Wenn Ihre Sprache magische Werte mit unendlicher Genauigkeit aufweist, sollte Ihre Lösung einwandfrei funktionieren (ohne die Tatsache zu berücksichtigen, dass dafür unendliche Zeit und / oder Speicher erforderlich wären). Da es diese magischen Werte mit unendlicher Genauigkeit nicht gibt, sind Ungenauigkeiten aufgrund begrenzter Genauigkeit akzeptabel. Diese Regel dient zur Vermeidung von Komplikationen, die sich aus der Anforderung einer bestimmten Genauigkeit der Ausgabe ergeben.
- Builtins, die trigonometrische Funktionen für Matrixargumente berechnen (einschließlich hyperbolischer Triggerfunktionen), sind nicht zulässig. Andere Matrix-Buildins (wie Multiplikation, Exponentiation, Diagonalisierung, Zerlegung und die Exponentialmatrix) sind zulässig.
Testfälle
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]]
Weitere Lektüre
Diese hervorragende Frage bei Math.SE enthält einige alternative Ableitungen der matrixwertigen Analoga trigonometrischer Funktionen.
sin([[1, 0, 1], [0, 0, 0], [0, 1, 0]]) = {{0.841, -0.158, 0.841}, {0, 0, 0}, {0, 1, 0}}
du nachsehen, was ich mit Mathematica gemacht habe?(ignoring the fact that it would require infinite time and/or memory)
Antworten:
Julia,
3319 BytesDies ist eine Funktion, die ein zweidimensionales Array von Floats akzeptiert und ein Tupel solcher Arrays zurückgibt, die dem Cosinus bzw. Sinus entsprechen. Beachten Sie, dass dies die Umkehrung der Reihenfolge ist, die in den Testfällen angegeben wurde, in denen der Sinus zuerst aufgeführt wird.
Für eine reelle Matrix A gilt:
und
Das heißt, der Sinus und Kosinus von A entsprechen den imaginären und realen Teile der Matrix exponentiellen e iA . Siehe Funktionen von Matrizen (Higham, 2008).
Probieren Sie es online! (beinhaltet alle Testfälle)
14 Bytes gespart dank Dennis!
quelle
Mathematica, 27 Bytes
Basierend auf der Lösung von @ Rainer P ..
Nimmt die quadratische Matrix
A
als Argument und gibt eine Liste aus, die enthält{sin(A), cos(A)}
.Die Eingabe wird mit formatiert
N
, um einen numerischen Wert anstelle einer langen exakten Formel zu erhalten undColumn
die Ergebnisse vonsin(A)
undcos(A)
als separate Matrizen anstelle einer verschachtelten Liste anzuzeigen .Die Berechnung der Werte erfordert gesondert 38 Byte
quelle
Jelly ,
2322 BytesProbieren Sie es online!
Hintergrund
Dieser Ansatz berechnet direkt die Taylor-Reihe für Sinus und Cosinus , dh
Erhöht die Anzahl der Anfangsterme beider Reihen, bis sich das Ergebnis nicht mehr ändert, sodass seine Genauigkeit nur durch die Genauigkeit des Gleitkommatyps begrenzt wird.
Wie es funktioniert
quelle
Matlab,
138 121 5250 BytesDa Matrix-Exponentiation erlaubt ist (was ich zuerst nicht bemerkt habe, oh), muss ich meine Helferfunktion nicht mehr definieren, und das Ganze kann trivial gelöst werden:
Die Eingabe sollte zB
[1,2;4,5]
oder alternativ eine Matrix sein[[1,2];[3,4]]
Eine unerwartete Sache (im Nachhinein nicht so unerwartet) ist, dass die Cosinus- und Sinusmatrix immer noch befriedigen
quelle
A^0
dasselbe wieeye(size(A))
?expm
?Matlab, 37 Bytes
quelle
C ++, 305 Bytes
Die Eingabe ist eine Liste von Zahlen, die ein perfektes Quadrat für stdin darstellen. Die Ausgabe ist ein hübsch gedrucktes 2d-Array auf stdout
quelle
Julia 0,4, 28 Bytes
Input ist eine Matrix von Floats, Output ist ein Array von Matrizen. Probieren Sie es online!
quelle
Salbei, 44 Bytes
Probieren Sie es online aus .
Diese anonyme Funktion gibt eine Liste von 2 Matrizen zurück, die
sin(A)
und entsprechencos(A)
entsprechen.exp(I*A)
berechnet die Exponentialmatrix fürI*A
(A
wobei alle Elemente mit der imaginären Einheit multipliziert werden) undmatrix.apply_map(f)
gibt eine Matrix zurückf
, auf die alle Elemente angewendet wurden. Indem wirimag
undreal
(die Funktionen zum Abrufen der Imaginär- und Realteile eines Skalarwerts) auf die Matrizen anwenden , erhalten wir die Werte vonsin(A)
undcos(A)
, dank Eulers berühmter Identität (auf die im Herausforderungstext verwiesen wird).quelle