マトリックス三角法


13

前書き

二つの最も一般的な三角関数、sine及びcosine(又はsinおよびcos短いため)は、行列値の関数であるように拡張することができます。マトリックス値のアナログを計算する1つの方法は次のとおりです。

次の2つの重要な三角関数を検討してください。

トリガーID

これらのIDを使用して、我々はのために以下の式を導くことができるsincos

トリガー関数

行列の指数はすべての正方行列に存在し、次式で与えられます。

行列指数

ここで、A 0は恒等行列であり、Iと同じ寸法とA。行列指数を使用すると、これらの2つの三角関数(および他のすべての三角関数)は、行列の関数として評価できます。

チャレンジ

正方行列Aが与えられ、sin(A)との値を出力しますcos(A)

ルール

  • 入力および出力は、便利で合理的な形式(2D配列、言語のマトリックス形式など)になります。
  • 1つのプログラム、2つの独立したプログラム、1つの関数、または2つの関数を作成できます。2つの関数を記述する場合、それらの間でコードを共有できます(インポート関数やヘルパー関数など)。
  • 入力行列の値は常に整数です。
  • 浮動小数点の不正確さの結果として、ソリューションに精度の問題がある場合があります。言語に魔法のような無限精度の値がある場合、ソリューションは完全に機能するはずです(無限の時間やメモリを必要とするという事実を無視して)。ただし、それらの魔法の無限精度の値は存在しないため、精度の制限に起因する不正確さは許容されます。この規則は、出力に特定の精度を要求することに起因する複雑さを回避するために設けられています。
  • マトリックス引数の三角関数(双曲線三角関数を含む)を計算する組み込み関数は使用できません。他の行列組み込み関数(乗算、べき乗、対角化、分解、行列指数など)が許可されています。

テストケース

フォーマット: 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 を入手しましたが、確認できますか?
ケニー

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

これは、floatの2次元配列を受け入れ、それぞれコサインとサインに対応する配列のタプルを返す関数です。これは、正弦が最初にリストされているテストケースで指定された順序の逆であることに注意してください。

実数値の行列Aに対して、

正弦

そして

余弦

つまり、Aのサインとコサインは、行列指数e iAの虚数部と実数部に対応します。Functions of Matrixes(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、 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


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

入力は、stdin上の完全な正方形である数値のリストです。出力は標準出力にきれいに印刷された2D配列です



0

セージ、44バイト

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

オンラインで試す

この無名関数は、sin(A)およびcos(A)にそれぞれ対応する2つの行列のリストを返します。(すべての要素に虚数単位を乗算した)exp(I*A)の行列指数を計算し、そのすべての要素に適用された行列を返します。適用することによって、および行列に(スカラー値の虚と実部を取得するための関数を)、私たちはの値を取得して、(チャレンジテキストで参照)オイラーの有名なアイデンティティのおかげで。I*AAmatrix.apply_map(f)fimagrealsin(A)cos(A)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.