Matris Trigonometrisi


13

Giriş

En sık kullanılan iki trigonometrik fonksiyonlar, sineve cosine(ya da sinve coskısa), matris değerli bir fonksiyonu olarak uzatılabilir. Matris değerli analogları hesaplamanın bir yolu şöyledir:

Bu iki önemli trigonometrik kimliği düşünün:

trig kimlikleri

Bu kimlikleri kullanarak sinve için aşağıdaki denklemleri türetebiliriz cos:

trig fonksiyonları

Matris üstel tüm kare matrisler için var ve ile verilir:

matris üstel

burada bir 0 birim matristir I ile aynı boyutlara sahip A . Matris üstel kullanarak, bu iki trigonometrik fonksiyon (ve böylece diğer tüm trigonometrik fonksiyonlar) matrislerin fonksiyonu olarak değerlendirilebilir.

Meydan okuma

Bir kare matris verilen bir çıkış değerleri, sin(A)ve cos(A).

kurallar

  • Giriş ve çıkış uygun, makul bir formatta (2D dizi, dilinizin matris formatı, vb.) Olabilir.
  • Tek bir program, iki bağımsız program, tek bir işlev veya iki işlev yazabilirsiniz. İki işlev yazmayı seçerseniz, aralarında kod paylaşılabilir (içe aktarma ve yardımcı işlevler gibi).
  • Giriş matrisinin değerleri her zaman tamsayı olur.
  • Çözümünüzde kayan nokta tutarsızlığı nedeniyle doğruluk sorunları olabilir. Dilinizde sihirli sonsuz hassasiyet değerleri varsa, çözümünüz mükemmel bir şekilde çalışmalıdır (sonsuz zaman ve / veya bellek gerektireceği gerçeğini göz ardı ederek). Ancak, bu büyülü sonsuz kesinlik değerleri bulunmadığından, sınırlı kesinlikten kaynaklanan yanlışlıklar kabul edilebilir. Bu kural, çıktıda belirli bir miktarda hassasiyet gerektirmesinden kaynaklanan komplikasyonları önlemek için uygulanmaktadır.
  • Matris argümanları (hiperbolik trig fonksiyonları dahil) için trigonometrik fonksiyonları hesaplayan yapılara izin verilmez. Diğer matris yerleşimlerine (çarpma, üs alma, köşegenleştirme, ayrışma ve matris üstel gibi) izin verilir.

Test Durumları

Biçim: 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]]

Daha fazla okuma

Math.SE'deki bu mükemmel soru , trigonometrik fonksiyonların matris değerli analoglarının bazı alternatif türevlerini içerir.


sin([[1, 0, 1], [0, 0, 0], [0, 1, 0]]) = {{0.841, -0.158, 0.841}, {0, 0, 0}, {0, 1, 0}}Mathematica ile aldım , kontrol edebilir misin?
kennytm

1
@kennytm Test senaryosu bunu gösterir.
Mego

1
@Mego Görünüşe göre mevcut cevapların tümü silinmelidir.
feersum

3
@Mego Kayan nokta tabanlı tüm yerleşiklerin tam bir algoritma (ya da kayan nokta işlemlerinin "gerçek sayı" işlemleriyle değiştirilmesi durumunda kesin olan bir algoritma) kullandığını düşünmek tamamen mantıksızdır.
feersum

1
@feersum Son düzenlememde şu konuya değindim:(ignoring the fact that it would require infinite time and/or memory)
Mego

Yanıtlar:


6

Julia, 33 19 bayt

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

Bu, 2 boyutlu bir şamandıra dizisini kabul eden ve sırasıyla kosinüs ve sinüsle karşılık gelen bu dizilerin bir demetini döndüren bir işlevdir. Bunun, sinüsün önce listelendiği test vakalarında verilen sıranın tersi olduğuna dikkat edin.

Gerçek değerli bir A matrisi için ,

sinüs

ve

kosinüs

Yani, A'nın sinüsü ve kosinüsü , matris üstel e iA'nın hayali ve gerçek kısımlarına karşılık gelir . Bkz . Matrislerin Fonksiyonları (Higham, 2008).

Çevrimiçi deneyin! (tüm test senaryolarını içerir)

Dennis sayesinde 14 bayt tasarruf etti!


6

Mathematica, 27 bayt

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

@ Rainer P.'nin çözümüne dayanmaktadır .

Kare matrisi Aargüman olarak alır ve içeren bir liste çıkarır {sin(A), cos(A)}.

Giriş ile biçimlendirilmiş Nuzun tam formül yerine sayısal bir değer elde etmek için ve Columnsonuçlarını görüntülemek için sin(A)ve cos(A)ayrı matrisler yerine iç içe geçmiş bir listesi olarak.

Misal

Değerlerin ayrı ayrı hesaplanması 38 bayt gerektirir

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

6

Jöle , 23 22 bayt

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

Çevrimiçi deneyin!

Arka fon

Bu yaklaşım Taylor serisini sinüs ve kosinüs için doğrudan hesaplar , yani,

formül

Sonuç artık değişmeyene kadar her iki dizinin başlangıç ​​terimlerinin sayısını artırır, bu nedenle doğruluğu yalnızca kayan nokta türünün hassasiyeti ile sınırlıdır.

Nasıl çalışır

®Ḥ‘©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 bayt

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

Girdi, stdin üzerinde mükemmel bir kare olan sayıların bir listesidir. Çıktı stdout'ta oldukça basılı bir 2d dizisidir


2

Matlab, 138122 52 50 bayt

Matris üstelleşmesine izin verildiğinden, (önce fark etmediğim şey, d'oh) Artık yardımcı ciğimi tanımlamak zorunda değilim ve her şey önemsiz bir şekilde çözülebilir:

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

Giriş bir matris olmalıdır, örneğin [1,2;4,5]veya alternatif olarak[[1,2];[3,4]]

Beklenmedik bir şey (arkada beklenmedik değil), kosinüs ve sinüs matrisinin hala tatmin edici olmasıdır

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

İle A^0aynı değil eye(size(A))mi?
FryAmTheEggman

Oh, haklısın, teşekkürler!
Kusur

2
Neden kullanmıyorsunuz expm?
Luis Mendo

2
Kimliğe göre: Skaler formun fonksiyonları matrislere genişletmek için kullanıldığını düşünerek bu kimliği tatmin etmelerini umuyorum!
Mego

1
O zaman her şey neredeyse önemsiz hale geliyor.
Kusur



0

Adaçayı, 44 bayt

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

Çevrimiçi deneyin .

Bu anonim işlev karşılık gelen 2 matrislerin bir listesini verir sin(A)ve cos(A)sırasıyla. exp(I*A)matrisini üstel hesaplar I*A( Atüm elemanlar hayali birim ile çarpılır) ve tüm elemanlarına uygulanmış matrix.apply_map(f)bir matris döndürür f. Uygulayarak imagve realmatrisleri (a skaler değerin hayali ve gerçek parça almak için fonksiyonları), biz değerlerini almak sin(A)ve cos(A), (meydan okuma metninde) Euler ünlü kimliğine sayesinde.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.