เมทริกซ์ตรีโกณมิติ


13

บทนำ

ฟังก์ชันตรีโกณมิติที่พบมากที่สุดสองแบบsineและcosine(หรือsinและcosสำหรับระยะสั้น) สามารถขยายเป็นฟังก์ชันที่มีค่าเมทริกซ์ได้ วิธีหนึ่งในการคำนวณ analogs ที่มีค่าเมทริกซ์มีดังนี้:

พิจารณาอัตลักษณ์ตรีโกณมิติที่สำคัญสองประการนี้:

ตรีโกณมิติ

การใช้ข้อมูลเฉพาะตัวเหล่านี้เราสามารถหาสมการต่อไปนี้sinและcos:

ฟังก์ชันตรีโกณมิติ

ชี้แจงเมทริกซ์ที่มีอยู่สำหรับตารางการฝึกอบรมทั้งหมดและจะได้รับโดย:

เลขยกกำลังเมทริกซ์

ที่0เป็นตัวตนของเมทริกซ์ฉันมีขนาดเดียวกับ โดยใช้เมทริกซ์เอ็กซ์โปเนนเชียลฟังก์ชันตรีโกณมิติทั้งสอง (และฟังก์ชันตรีโกณมิติอื่นทั้งหมด) สามารถประเมินเป็นฟังก์ชันของเมทริกซ์

ความท้าทาย

กำหนดตารางเมทริกซ์ออกค่าของและsin(A)cos(A)

กฎระเบียบ

  • อินพุตและเอาต์พุตอาจอยู่ในรูปแบบที่สะดวกและเหมาะสม (อาร์เรย์ 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 คุณช่วยตรวจสอบได้ไหม
kennytm

1
@ kennytm นั่นคือสิ่งที่กรณีทดสอบแสดงให้เห็น
Mego

1
@Mego เห็นได้ชัดว่าคำตอบที่มีอยู่ทั้งหมดควรจะถูกลบออกแล้ว
feersum

3
@Mego มันไม่มีเหตุผลอย่างสมบูรณ์ที่จะคิดว่าบิวด์อินแบบลอยตัวทั้งหมดใช้อัลกอริธึมที่แน่นอน
feersum

1
@feersum ฉันได้กล่าวถึงเรื่องนี้ในการแก้ไขล่าสุดของฉัน:(ignoring the fact that it would require infinite time and/or memory)
Mego

คำตอบ:


6

Julia, 33 19 ไบต์

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

นี่คือฟังก์ชั่นที่ยอมรับอาร์เรย์ 2 มิติของการลอยและส่งคืน tuple ของอาร์เรย์ดังกล่าวที่ correponding ไปยังโคไซน์และไซน์ตามลำดับ โปรดทราบว่านี่เป็นสิ่งที่ตรงกันข้ามกับคำสั่งที่ให้ไว้ในกรณีทดสอบซึ่งเป็นรายการไซน์ก่อน

สำหรับเมทริกซ์A ที่มีคุณค่าจริงเรามี

ซายน์

และ

โคไซน์

นั่นคือไซน์และโคไซน์ของสอดคล้องกับชิ้นส่วนและจินตนาการที่แท้จริงของเมทริกซ์ชี้แจงอี iA ดูฟังก์ชั่นของเมทริกซ์ (Higham, 2008)

ลองออนไลน์! (รวมถึงกรณีทดสอบทั้งหมด)

บันทึก 14 ไบต์ขอบคุณ Dennis!


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

ลองออนไลน์!

พื้นหลัง

วิธีการนี้จะคำนวณชุด Taylor โดยตรงสำหรับไซน์และโคไซน์เช่น

สูตร

มันจะเพิ่มจำนวนคำศัพท์เริ่มต้นของทั้งสองซีรี่ส์จนกว่าผลลัพธ์จะไม่เปลี่ยนแปลงอีกต่อไปดังนั้นความแม่นยำจะถูก จำกัด ด้วยความแม่นยำของประเภทจุดลอย

มันทำงานอย่างไร

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

Matlab, 138 121 52 50 ไบต์

เนื่องจากการยกกำลังเมทริกซ์ได้รับอนุญาต (สิ่งที่ฉันไม่ได้สังเกตเห็นก่อน, d'Oh) ฉันไม่จำเป็นต้องกำหนด funciton ผู้ช่วยของฉันอีกต่อไปและสิ่งทั้งหมดสามารถแก้ไขได้เล็กน้อย:

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

โอ้ถูกต้องแล้วขอบคุณ!
ข้อบกพร่อง

2
ทำไมไม่ใช้expm?
Luis Mendo

2
ตามตัวตน: ฉันควรหวังว่าพวกเขาจะพึงพอใจตัวตนนั้นโดยพิจารณาว่ารูปแบบสเกลาร์ถูกนำมาใช้เพื่อขยายฟังก์ชั่นไปยังเมทริกซ์!
Mego

1
ถ้าอย่างนั้นทุกอย่างก็กลายเป็นเรื่องเล็กน้อย
ข้อบกพร่อง



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)ขอบคุณตัวตนที่โด่งดังของออยเลอร์ (อ้างอิงในข้อความท้าทาย)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.