แก้ไข 2x Eigensystem


11

สำหรับผู้ที่มีพื้นหลังพีชคณิตเชิงเส้นเล็ก ๆ ความท้าทายนั้นง่ายเหมือนนี้: กำหนดค่าลักษณะเฉพาะและค่าลักษณะเฉพาะของเมทริกซ์ 2x2 ที่ซับซ้อน คุณอาจข้ามไปข้างหน้ารายละเอียด The Challenge for I / O เป็นต้นสำหรับผู้ที่ต้องการทบทวนระบบ eigens ให้อ่านต่อ

พื้นหลัง

สมลักษณะของเมทริกซ์ถูกกำหนดโดย

det| A - λI | = 0

โดยที่λเป็นพารามิเตอร์ที่ซับซ้อน (สเกลาร์) ฉันเป็นเมทริกซ์เอกลักษณ์และเดช | ... | เป็นปัจจัย ด้านซ้ายมือจะประเมินพหุนามในλซึ่งเป็นพหุนามลักษณะซึ่งเป็นกำลังสองในกรณีของเมทริกซ์ 2x2 การแก้สมการลักษณะนี้เป็นลักษณะเฉพาะของซึ่งเราจะแสดงเป็นλ 1และλ 2

ตอนนี้eigenvectors v ฉันของความพึงพอใจ

A vi = λi vi

สำหรับแต่ละλ iนี่จะให้ระบบสมการสองอันในสองสิ่งที่ไม่รู้จัก (ส่วนประกอบของv i ) ซึ่งสามารถแก้ไขได้อย่างง่ายดาย คุณจะสังเกตเห็นว่าระบบไม่ได้รับการระบุในความเป็นจริงและขนาดของ eigenvector ไม่ได้ถูกกำหนดโดยสมการ โดยปกติเราจะต้องการให้ eigenvector ทำการทำให้เป็นมาตรฐานนั่นคือ√ (| x | 2 + | y ​​| 2 ) = 1 , โดยที่xและyเป็นส่วนประกอบเวกเตอร์, | x | 2คือxคูณด้วยคอนจูเกตที่ซับซ้อน

โปรดทราบว่าค่าลักษณะเฉพาะที่อาจจะเลวเช่นλ 1 = λ 2 ในกรณีนี้คุณอาจหรืออาจจะไม่สามารถตอบสนองระบบสมการเดียวที่มี eigenvector อิสระเชิงเส้นสองเส้น

ความท้าทาย

กำหนด 2x2 เมทริกซ์ที่มีองค์ประกอบที่ซับซ้อนกำหนดค่าลักษณะเฉพาะสองค่า (อาจเหมือนกัน) และค่ามาตรฐานเฉพาะสำหรับแต่ละค่าลักษณะเฉพาะ ตัวเลขผลลัพธ์ต้องมีความถูกต้องถึงตัวเลขนัยสำคัญอย่างน้อย 3 (ทศนิยม) คุณอาจจะคิดว่าส่วนจริงและจินตภาพขององค์ประกอบเมทริกซ์ใด ๆ อยู่ในช่วง[-1,1]

คุณสามารถเขียนฟังก์ชั่นหรือโปรแกรมรับอินพุตผ่าน STDIN, อาร์กิวเมนต์บรรทัดคำสั่ง, พรอมต์หรือฟังก์ชันอาร์กิวเมนต์ คุณอาจส่งออกผลลัพธ์ไปยัง STDOUT กล่องโต้ตอบหรือเป็นค่าตอบแทนการทำงาน

คุณสามารถใช้สตริงหรือรูปแบบรายการที่สะดวก (แต่ไม่ชัดเจน) ใด ๆ สำหรับอินพุตและเอาต์พุต นอกจากนี้คุณยังสามารถเลือกระหว่างคู่ของลอยหรือชนิดที่ซับซ้อนเพื่อแสดงตัวเลขแต่ละตัว

คุณต้องไม่ใช้ฟังก์ชั่นในตัวสำหรับการแก้ระบบ eigensystem (เช่น Mathematica EigenvectorsหรือEigensystem) หรือตัวแก้สมการ

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ

ตัวอย่าง

แต่ละตัวอย่างคือสามบรรทัด: อินพุตค่าลักษณะเฉพาะและค่าลักษณะเฉพาะที่สอดคล้องกันในลำดับเดียวกัน โปรดทราบว่า eigenvector นั้นจะพิจารณาเฉพาะในช่วงของพวกเขาเท่านั้นและในกรณีของ eigenvalues ​​ที่แย่ลง eigenvector อาจจะมีความสามารถตามอำเภอใจ (ตามตัวอย่างแรก)

[[1.0, 0.0], [0.0, 1.0]]
[1.0, 1.0]
[[1.0, 0.0], [0.0, 1.0]]

[[0.0, 0.4], [-0.1, -0.4]]
[-0.2, -0.2]
[[0.894427, -0.447214], [0.894427, -0.447214]]

[[0.3, 0.1], [0.4, -0.9]]
[-0.932456, 0.332456]
[[-0.0808731, 0.996724], [0.951158, 0.308703]]

[[0.5, -1.0], [0.8, -0.5]]
[0.74162i, - 0.74162i]
[[0.745356, 0.372678 - 0.552771i], [0.745356, 0.372678 + 0.552771i]]

[[-0.0539222 + 0.654836i, -0.016102 + 0.221334i], [0.739514 - 0.17735i, -0.0849216 + 0.77977i]]
[0.238781 + 0.984333i, -0.377625 + 0.450273i]
[[0.313668 + 0.322289i, 0.893164], [-0.236405 - 0.442194i, 0.865204]]

[[-0.703107 - 0.331792i, 0.286719 - 0.587305i], [-0.418476 + 0.396347i, -0.885934 + 0.50534i]]
[-1.13654 - 0.32678i, -0.4525 + 0.500329i]
[[0.833367, -0.248208 - 0.493855i], [-0.441133 - 0.408236i, 0.799215]]

[[-0.156312 + 0.788441i, 0.045056 - 0.579167i], [0.130741 - 0.97017i, 0.049183 - 0.590768i]]
[-0.181759 + 1.11738i, 0.0746298 - 0.919707i]
[[0.86955, -0.493846 + 0.000213145i], [0.318856 - 0.0181135i, 0.94763]]

คำตอบ:


6

MATLAB, 91

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

ตอนแรกฉันพยายามเขียนโค้ดใน Python แต่การจัดการทางคณิตศาสตร์ของมันพิสูจน์แล้วว่าสมองเสียหายเกินไป ฟังก์ชั่นทางคณิตศาสตร์ของมันปฏิเสธที่จะยอมรับค่าที่ซับซ้อนและมันไม่เข้าใจว่าการหารทศนิยมด้วยศูนย์นั้นตกลง

function[]=f(a,b,c,d)
L=(a+d+[1,-1]*((a-d)^2+4*b*c)^.5)/2
t=atan((L-a)/b);v=[cos(t);sin(t)]

L =แรกที่ทั้งสองค่าลักษณะเฉพาะจะมีการพิมพ์ภายใต้หัวข้อ จากนั้นสองเวกเตอร์คอลัมน์จะมีการพิมพ์ภายใต้ค่านิยมที่สอดคล้องกันของ L v =ภายใต้ รหัสอาจล้มเหลวในการให้เวกเตอร์อิสระเป็นเส้นตรงในกรณีที่เป็นไปได้ที่จะทำเช่นนั้น (โปรแกรมดังกล่าวมักจะถูกพิจารณาว่าชำรุด) แต่มาร์ตินบอกว่าไม่จำเป็น


8

Python 2, 198 ไบต์

a,b,c,d=input()
H=(a+d)/2
D=(H*H-a*d+b*c)**.5
X,Y=H+D,H-D
p,q,r,s=[[1,0,0,1],[b,X-a,b,Y-a],[X-d,c,Y-d,c]][2*(c!=0)or(b!=0)]
A=abs
V=A(A(p)+A(q)*1j)
W=A(A(r)+A(s)*1j)
print[X,Y],[[p/V,q/V],[r/W,s/W]]

อินพุตเป็นรายการหมายเลขคงที่ของ 4 จำนวนเชิงซ้อนผ่าน STDIN เช่น

[0.0+0j, 0.4+0j, -0.1+0j, -0.4+0j]

โปรดทราบว่า Python ใช้jแทนiตัวเลขที่ซับซ้อน

เอาท์พุทเป็นสองรายการแรกที่มีค่าลักษณะเฉพาะและที่สองมีค่าลักษณะเฉพาะเช่น

[(-0.2+0j), (-0.2+0j)]
[[(0.8944271909999159+0j), (-0.4472135954999579+0j)], [(0.8944271909999159+0j), (-0.4472135954999579+0j)]]

(ขึ้นบรรทัดใหม่เพื่อความชัดเจน)


3

Lua, 462 455 431 427 ไบต์

ไม่มีคณิตศาสตร์เชิงซ้อนในตัวใน Lua ไม่มีการดำเนินการเวกเตอร์อย่างใดอย่างหนึ่ง ทั้งหมดจะต้องรีดด้วยมือ

a,b,c,d,e,f,g,h=...x=math.sqrt z=print i=a-g j=b-h
k=(i^2-j^2)/2+2*(c*e-d*f)m=x(k^2+(i*j+2*(c*f+d*e))^2)n=x(m+k)o=x(m-k)i=(a+g+n)/2
j=(b+h+o)/2 k=(a+g-n)/2 l=(b+h-o)/2 z(i,j,k,l)q=c^2+d^2 r=e^2+f^2 s=q+r if s==0
then z(1,0,0,0,0,0,1,0)else if r==0 then m,n,o,p=c,d,c,d c,d=i-a,j-b e,f=k-a,l-b
u=x(q+c^2+d^2)v=x(q+e^2+f^2)else m,n=i-g,j-h o,p=k-g,l-h c,d=e,f
u=x(r+m^2+n^2)v=x(r+o^2+p^2)end z(m/u,n/u,o/v,p/v,c/u,d/u,e/v,f/v)end

เรียกใช้จากบรรทัดคำสั่งด้วยอาร์กิวเมนต์ต่อไปนี้:

lua eigen.lua Re(a) Im(a) Re(b) Im(b) Re(c) Im(c) Re(d) Im(d)

สร้างเอาต์พุตต่อไปนี้:

Re(lambda1) Im(lambda1) Re(lambda2) Im(lambda2)
Re(v11) Im(v11) Re(v12) Im(v12) Re(v21) Im(v21) Re(v22) Im(v22)

... สำหรับ a, b, c, d ส่วนประกอบ 4 ของอินพุตเมทริกซ์, แลมบ์ดา 1 และแลมบ์ดา 2 ค่าลักษณะเฉพาะสองอัน, v11, v21 หน่วยไอเกนิกตัวแรกและ v12, v22 หน่วยไอเก็กตัวที่สอง ตัวอย่างเช่น,

lua eigen.lua 1 0  1 0  1 0  0 0

... ผลิต ...

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