Wprowadzenie
Dwa najbardziej popularne funkcje trygonometryczne, sine
i cosine
(lub sin
i cos
krócej), może być rozszerzone do funkcji matrycy wartościach. Jednym ze sposobów obliczenia analogów wycenianych w macierzy jest:
Rozważ te dwie ważne tożsamości trygonometryczne:
Używając tych tożsamości, możemy wyprowadzić następujące równania dla sin
i cos
:
Wykładniczy matrycy istnieje dla matryc kwadratowych i jest przez:
gdzie 0 jest macierz identyczności I o tych samych wymiarach jak A . Korzystając z macierzy wykładniczej, te dwie funkcje trygonometryczne (a zatem wszystkie pozostałe funkcje trygonometryczne) można ocenić jako funkcje macierzy.
Wyzwanie
Biorąc pod uwagę macierz kwadratową A , wypisz wartości sin(A)
i cos(A)
.
Zasady
- Dane wejściowe i wyjściowe mogą być w dowolnym dogodnym, rozsądnym formacie (macierz 2D, format macierzy języka itp.).
- Możesz napisać pojedynczy program, dwa niezależne programy, jedną funkcję lub dwie funkcje. Jeśli zdecydujesz się napisać dwie funkcje, kod może być współdzielony między nimi (np. Funkcje importu i pomocnicze).
- Wartościami macierzy wejściowej zawsze będą liczby całkowite.
- Twoje rozwiązanie może mieć problemy z dokładnością w wyniku niedokładności zmiennoprzecinkowej. Jeśli twój język ma magiczne wartości nieskończonej precyzji, twoje rozwiązanie powinno działać idealnie (ignorując fakt, że wymagałoby to nieskończonego czasu i / lub pamięci). Ponieważ jednak te magiczne wartości nieskończonej precyzji nie istnieją, niedokładności spowodowane ograniczoną precyzją są dopuszczalne. Zasada ta ma na celu uniknięcie komplikacji wynikających z wymagania określonej precyzji w danych wyjściowych.
- Wbudowane funkcje obliczające funkcje trygonometryczne dla argumentów macierzy (w tym hiperboliczne funkcje wyzwalania) są niedozwolone. Inne wbudowane macierze (takie jak mnożenie, potęgowanie, diagonalizacja, rozkład i wykładniczy macierz) są dozwolone.
Przypadki testowe
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]]
Dalsza lektura
To doskonałe pytanie w Math.SE obejmuje kilka alternatywnych pochodnych macierzy analogów funkcji trygonometrycznych.
sin([[1, 0, 1], [0, 0, 0], [0, 1, 0]]) = {{0.841, -0.158, 0.841}, {0, 0, 0}, {0, 1, 0}}
z Mathematica, możesz sprawdzić?(ignoring the fact that it would require infinite time and/or memory)
Odpowiedzi:
Julia,
3319 bajtówJest to funkcja, która akceptuje dwuwymiarową tablicę liczb zmiennoprzecinkowych i zwraca krotkę takich tablic odpowiadających odpowiednio cosinus i sinus. Zauważ, że jest to odwrotność kolejności podanej w przypadkach testowych, w których sinus jest wymieniony jako pierwszy.
Dla macierzy A o wartościach rzeczywistych mamy
i
To znaczy, sinus i cosinus A odpowiadają wyobrażonym i rzeczywistym częściom macierzy wykładniczej e iA . Zobacz funkcje macierzy (Higham, 2008).
Wypróbuj online! (obejmuje wszystkie przypadki testowe)
Zaoszczędzono 14 bajtów dzięki Dennisowi!
źródło
Mathematica, 27 bajtów
Na podstawie @ Rainer P. roztworu „s.
Bierze macierz kwadratową
A
jako argument i wyświetla listę zawierającą{sin(A), cos(A)}
.Dane wejściowe są sformatowane w
N
celu otrzymania wartości liczbowych, zamiast długiego Dokładny wzór iColumn
wyświetlanie wynikówsin(A)
icos(A)
w postaci oddzielnych matryc zamiast zagnieżdżonej listy.Obliczanie wartości osobno wymaga 38 bajtów
źródło
Galaretka ,
2322 bajtówWypróbuj online!
tło
To podejście bezpośrednio oblicza szereg Taylora dla sinusa i cosinusa , tj.
Zwiększa liczbę początkowych składników obu serii, dopóki wynik się nie zmienia, więc jego dokładność jest ograniczona jedynie precyzją typu zmiennoprzecinkowego.
Jak to działa
źródło
C ++, 305 bajtów
Dane wejściowe to lista liczb, które są idealnym kwadratem na standardowym wejściu. Wyjście to ładnie wydrukowana tablica 2d na standardowym wyjściu
źródło
Matlab,
138 121 5250 bajtówPonieważ dozwolone jest potęgowanie macierzy (czego wcześniej nie zauważyłem, d'oh), nie muszę już definiować funkcji pomocnika, a całość można rozwiązać w trywialny sposób:
Dane wejściowe powinny być macierzą, np.
[1,2;4,5]
Lub alternatywnie[[1,2];[3,4]]
Nieoczekiwaną rzeczą (z perspektywy czasu nie taką nieoczekiwaną) jest to, że macierz cosinus i sinus nadal spełnia
źródło
A^0
to samo coeye(size(A))
?expm
?Matlab, 37 bajtów
źródło
Julia 0.4, 28 bajtów
Dane wejściowe to macierz liczb zmiennoprzecinkowych, dane wyjściowe to tablica macierzy. Wypróbuj online!
źródło
Sage, 44 bajty
Wypróbuj online .
Ta anonimowa funkcja zwraca listę 2 macierzy odpowiadających odpowiednio
sin(A)
icos(A)
.exp(I*A)
oblicza wykładniczą macierz dlaI*A
(A
ze wszystkimi elementami pomnożonymi przez urojoną jednostkę) imatrix.apply_map(f)
zwraca macierz, w którejf
zastosowano wszystkie jej elementy. Stosującimag
ireal
(funkcje do uzyskiwania wyobrażonych i rzeczywistych części wartości skalarnej) do macierzy, otrzymujemy wartościsin(A)
icos(A)
dzięki słynnej tożsamości Eulera (o której mowa w tekście wyzwania).źródło