Матрична тригонометрія


13

Вступ

Два найбільш поширених тригонометричні функції, sineі cosine(або sinі cosдля стислості), може бути розширений , щоб бути матриці-функції. Один із способів обчислення аналогів матричного значення полягає в наступному:

Розглянемо ці дві важливі тригонометричні тотожності:

трійкові ідентичності

Використовуючи ці тотожності, ми можемо отримати такі рівняння для sinта cos:

триггерні функції

Матриця експонентний існує для всіх квадратних матриць і визначається за формулою:

експоненціальна матриця

де 0 тотожний матриця я з тими ж розмірами , як A . Використовуючи матричний експоненціал, ці дві тригонометричні функції (і, отже, всі інші тригонометричні функції) можна оцінити як функції матриць.

Змагання

Давши квадратну матрицю A , виведіть значення sin(A)і cos(A).

Правила

  • Введення та вихід можуть бути у будь-якому зручному, розумному форматі (2D масив, матричний формат вашої мови тощо).
  • Ви можете написати одну програму, дві незалежні програми, одну функцію або дві функції. Якщо ви вирішите записати дві функції, код може бути розподілений між ними (наприклад, імпорт та допоміжні функції).
  • Значення матриці вводу завжди будуть цілими числами.
  • У вашому рішенні можуть виникнути проблеми з точністю внаслідок неточності з плаваючою комою. Якщо у вашій мові були магічні значення нескінченної точності, то ваше рішення повинно працювати ідеально (ігноруючи той факт, що це вимагатиме нескінченного часу та / або пам'яті). Однак, оскільки цих магічних значень нескінченної точності не існує, допустимі неточності, викликані обмеженою точністю. Це правило діє, щоб уникнути ускладнень, що виникають внаслідок вимагання певної кількості точності у виході.
  • Вбудовані, які обчислюють тригонометричні функції для аргументів матриці (включаючи гіперболічні функції триггеру), не допускаються. Допускаються інші вбудовані матриці (такі як множення, експоненціація, діагоналізація, декомпозиція та матриця експоненціалів).

Випробування

Формат: 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]]

Подальше читання

Це відмінне запитання на Math.SE включає деякі альтернативні виведення матричних аналогів тригонометричних функцій.


У мене sin([[1, 0, 1], [0, 0, 0], [0, 1, 0]]) = {{0.841, -0.158, 0.841}, {0, 0, 0}, {0, 1, 0}}з Mathematica, ви можете перевірити?
kennytm

1
@kennytm Ось що показує тестовий випадок.
Мего

1
@Mego Мабуть, тоді всі існуючі відповіді слід видалити.
feersum

3
@Mego Дуже нерозумно думати, що всі побудовані з плаваючою комою використовують точний алгоритм (або той, який був би точним, якщо операції з плаваючою комою були замінені на операції з "дійсним числом").
feersum

1
@feersum Я вирішив це у своїй останній редакції:(ignoring the fact that it would require infinite time and/or memory)
Mego

Відповіді:


6

Джулія, 33 19 байт

A->reim(expm(A*im))

Це функція, яка приймає двовимірний масив плавців і повертає кордон таких масивів, що відповідають косинусу і синусу відповідно. Зауважимо, що це зворотній порядок, наведений у тестових випадках, в якому перше перераховано синус.

Для матриці A в реальному значенні ми маємо

синус

і

косинус

Тобто синус і косинус A відповідають уявній і реальній частинам матричної експоненціальної e iA . Див. Функції матриць (Higham, 2008).

Спробуйте в Інтернеті! (включає всі тестові випадки)

Збережено 14 байт завдяки Деннісу!


6

Математика, 27 байт

{Im@#,Re@#}&@MatrixExp[I#]&

На основі @ Райнер П. рішення «s.

Приймає квадратну матрицю Aяк аргумент і виводить список, що містить {sin(A), cos(A)}.

Вхід відформатований, Nщоб отримати числове значення замість довгої точної формули та Columnвідобразити результати sin(A)та cos(A)як окремі матриці замість вкладеного списку.

Приклад

Для обчислення значень окремо потрібно 38 байт

{(#2-#)I,+##}/2&@@MatrixExp/@{I#,-I#}&

6

Желе , 23 22 байти

³æ*÷!
®Ḥ‘©r0Ç€s2_@/µÐL

Спробуйте в Інтернеті!

Фон

Цей підхід безпосередньо обчислює ряд Тейлора для синусів і косинусів , тобто

формула

Він збільшує кількість початкових доданків обох серій, поки результат більше не змінюється, тому його точність обмежується лише точністю типу плаваючої точки.

Як це працює

®Ḥ‘©r0Ç€s2_@/µÐL  Main link, Argument: A (matrix)

             µÐL  Loop; apply the chain until the results are no longer unique.
                  Return the last unique result.
®                   Yield the value of the register (initially zero).
 Ḥ                  Unhalve/double it.
  ‘©                Increment and copy the result (n) to the register.
    r0              Range; yield [n, ..., 0].
      ǀ            Apply the helper link to each k in the range.
        s2          Split the results into chunks of length 2. Since n is always
                    odd, this yields [[Ç(n), Ç(n-1)], ..., [Ç(1), Ç(0)]].
          _@/       Reduce the columns of the result by swapped subtraction,
                    yielding [Ç(1) - Ç(3) + ... Ç(n), Ç(0) - Ç(2) + ... Ç(n - 1)].


³æ*÷!             Helper link. Argument: k (integer)

³                 Yield the first command-line argument (A).
 æ*               Elevate A to the k-th power.
    !             Yield the factorial of k.
   ÷              Divide the left result by the right one.

3

C ++, 305 байт

#include<cmath>
#include<iostream>
#include<vector>
int x,i=0, j;void p(std::vector<double> v){int x=sqrt(v.size());for(i=0;i<x;i++){for(j=0;j<x;j++) std::cout << v[x] << " ";std::cout << "\n";}}int main(){std::vector<double> s, c;while(std::cin >> x){s.push_back(sin(x));c.push_back(cos(x));}p(s);p(c);}

Введення - це список чисел, які є ідеальним квадратом на stdin. Вихід - це симпатичний друкований 2d масив на stdout


2

Матлаб, 138 121 52 50 байт

Оскільки експозиція матриці дозволена, (що я спочатку не помітив, да), мені більше не потрібно визначати функцію помічника, і все це можна вирішити тривіально:

A=input('')*i;a=expm(A);b=expm(-A);[(b-a)*i,a+b]/2

Вхід має бути матрицею, наприклад, [1,2;4,5]або альтернативно[[1,2];[3,4]]

Несподівана річ (не дуже несподівана назад) полягає в тому, що матриця косинуса і синуса все ще задоволена

I = sin(A)^2+cos(A)^2

Це не A^0те саме, що eye(size(A))?
FryAmTheEggman

О, ти маєш рацію, дякую!
flawr

2
Чому б не використовувати expm?
Луїс Мендо

2
Що стосується ідентичності: я сподіваюся, що вони задовольнять цю ідентичність, вважаючи, що скалярна форма використовується для розширення функцій на матриці!
Мего

1
Ну тоді вся справа стає майже банальною.
flawr



0

Шавлія, 44 байти

lambda A:map(exp(I*A).apply_map,(imag,real))

Спробуйте в Інтернеті .

Ця анонімна функція повертає список з 2 матриць, що відповідають sin(A)і cos(A), відповідно. exp(I*A)обчислює матрицю експоненціалу для I*A( Aз усіма елементами, помноженими на уявну одиницю) і matrix.apply_map(f)повертає матрицю, де fвона була застосована до всіх її елементів. Застосовуючи imagі real(функції для отримання уявної та реальної частини скалярного значення) до матриць, ми отримуємо значення sin(A)та cos(A)завдяки знаменитій тотожності Ейлера (на яку йдеться в тексті виклику).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.