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


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 Вот что показывает тестовый пример.
Mego

1
@Mego Очевидно, что все существующие ответы должны быть удалены.
февраля

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

Mathematica, 27 байт

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

Основано на решении @ Rainer P.

Принимает квадратную матрицу 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.

2

Matlab, 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
Что касается тождества: я надеюсь, что они удовлетворяют этому тождеству, учитывая, что скалярная форма использовалась для расширения функций на матрицы!
Mego

1
Ну, тогда все становится почти тривиальным.
flawr


2

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);}

Ввод представляет собой список чисел, которые являются идеальным квадратом на стандартном вводе. Вывод - это печатный 2d массив на stdout



0

Sage, 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.