ค่าลักษณะเฉพาะของเมทริกซ์


11

รับตารางเมทริกซ์, ส่งออกค่าลักษณะเฉพาะของเมทริกซ์ ค่าลักษณะเฉพาะแต่ละค่าควรทำซ้ำหลาย ๆ ครั้งเท่ากับพีชคณิตหลายหลาก

ค่าลักษณะเฉพาะของเมทริกซ์Aเป็นค่าสเกลาλดังกล่าวว่าสำหรับเวกเตอร์คอลัมน์บาง,v A*v = λ*vพวกเขายังเป็นคำตอบสำหรับพหุนามลักษณะของA: det(A - λ*I) = 0( Iเมทริกซ์เอกลักษณ์ที่มีมิติเดียวกันกับที่A)

ผลลัพธ์จะต้องมีความถูกต้องถึง 3 หลักที่สำคัญ อินพุตและเอาต์พุตทั้งหมดจะอยู่ในช่วงของค่าตัวเลขสำหรับภาษาที่คุณเลือก

บิลด์อินเป็นที่ยอมรับ แต่คุณได้รับการสนับสนุนให้รวมโซลูชันที่ไม่ได้ใช้บิวอิน

กรณีทดสอบ

ในกรณีทดสอบเหล่านี้Iแสดงถึงหน่วยจินตภาพ a + b*Iตัวเลขที่ซับซ้อนมีการเขียนในรูปแบบ เอาต์พุตทั้งหมดมี 3 หลักที่มีความแม่นยำ

[[42.0]] -> [42.0]
[[1.0, 0.0], [0.0, 1.0]] -> [1.00, 1.00]
[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]] -> [16.1, -1.12, -1.24e-15]
[[1.2, 3.4, 5.6, 7.8], [6.3, 0.9, -5.4, -2.3], [-12.0, -9.7, 7.3, 5.9], [-2.5, 7.9, 5.3, 4.4]] -> [7.20 + 5.54*I, 7.20 - 5.54*I, -4.35, 3.75]
[[-3.22 - 9.07*I, 0.193 + 9.11*I, 5.59 + 1.33*I, -3.0 - 6.51*I, -3.73 - 6.42*I], [8.49 - 3.46*I, -1.12 + 6.39*I, -8.25 - 0.455*I, 9.37 - 6.43*I, -6.82 + 8.34*I], [-5.26 + 8.07*I, -6.68 + 3.72*I, -3.21 - 5.63*I, 9.31 + 3.86*I, 4.11 - 8.82*I], [-1.24 + 9.04*I, 8.87 - 0.0352*I, 8.35 + 4.5*I, -9.62 - 2.21*I, 1.76 - 5.72*I], [7.0 - 4.79*I, 9.3 - 2.31*I, -2.41 - 7.3*I, -7.77 - 6.85*I, -9.32 + 2.71*I]] -> [5.18 + 16.7*I, -24.9 - 2.01*I, -5.59 - 13.8*I, 0.0438 - 10.6*I, -1.26 + 1.82*I]
[[-30.6 - 73.3*I, 1.03 - 15.6*I, -83.4 + 72.5*I, 24.1 + 69.6*I, 52.3 + 2.68*I, 23.8 + 98.0*I, 96.8 + 49.7*I, -26.2 - 5.87*I, -52.4 + 98.2*I, 78.1 + 6.69*I], [-59.7 - 66.9*I, -26.3 + 65.0*I, 5.71 + 4.75*I, 91.9 + 82.5*I, -94.6 + 51.8*I, 61.7 + 82.3*I, 54.8 - 27.8*I, 45.7 + 59.2*I, -28.3 + 78.1*I, -59.9 - 54.5*I], [-36.0 + 22.9*I, -51.7 + 10.8*I, -46.6 - 88.0*I, -52.8 - 32.0*I, -75.7 - 23.4*I, 96.2 - 71.2*I, -15.3 - 32.7*I, 26.9 + 6.31*I, -59.2 + 25.8*I, -0.836 - 98.3*I], [-65.2 - 90.6*I, 65.6 - 24.1*I, 72.5 + 33.9*I, 1.47 - 93.8*I, -0.143 + 39.0*I, -3.71 - 30.1*I, 60.1 - 42.4*I, 55.6 + 5.65*I, 48.2 - 53.0*I, -3.9 - 33.0*I], [7.04 + 0.0326*I, -12.8 - 50.4*I, 70.1 - 30.3*I, 42.7 - 76.3*I, -3.24 - 64.1*I, 97.3 + 66.8*I, -11.0 + 16.5*I, -40.6 - 90.7*I, 71.5 - 26.2*I, 83.1 - 49.4*I], [-59.5 + 8.08*I, 74.6 + 29.1*I, -65.8 + 26.3*I, -76.7 - 83.2*I, 26.2 + 99.0*I, -54.8 + 33.3*I, 2.79 - 16.6*I, -85.2 - 3.64*I, 98.4 - 12.4*I, -27.6 - 62.3*I], [82.6 - 95.3*I, 55.8 - 73.6*I, -49.9 + 42.1*I, 53.4 + 16.5*I, 80.2 - 43.6*I, -43.3 - 3.9*I, -2.26 - 58.3*I, -19.9 + 98.1*I, 47.2 + 62.4*I, -63.3 - 54.0*I], [-88.7 + 57.7*I, 55.6 + 70.9*I, 84.1 - 52.8*I, 71.3 - 29.8*I, -3.74 - 19.6*I, 29.7 + 1.18*I, -70.6 - 10.5*I, 37.6 + 99.9*I, 87.0 + 19.0*I, -26.1 - 82.0*I], [69.5 - 47.1*I, 11.3 - 59.0*I, -84.3 - 35.1*I, -3.61 - 35.7*I, 88.0 + 88.1*I, -47.5 + 0.956*I, 14.1 + 89.8*I, 51.3 + 0.14*I, -78.5 - 66.5*I, 2.12 - 53.2*I], [0.599 - 71.2*I, 21.7 + 10.8*I, 19.9 - 97.1*I, 20.5 + 37.4*I, 24.7 + 40.6*I, -82.7 - 29.1*I, 77.9 + 12.5*I, 94.1 - 87.4*I, 78.6 - 89.6*I, 82.6 - 69.6*I]] -> [262. - 180.*I, 179. + 117.*I, 10.3 + 214.*I, 102. - 145.*I, -36.5 + 97.7*I, -82.2 + 89.8*I, -241. - 104.*I, -119. - 26.0*I, -140. - 218.*I, -56.0 - 160.*I]



ที่เกี่ยวข้อง ? อาจเกี่ยวข้องกันไหม (ขึ้นอยู่กับวิธีการ)
user202729

คำตอบ:


12

Haskell , 576 554 532 507 ไบต์

ไม่มีบิลด์อิน!

import Data.Complex
s=sum
l=length
m=magnitude
i=fromIntegral
(&)=zip
t=zipWith
(x!a)b=x*a+b
a#b=[[s$t(*)x y|y<-foldr(t(:))([]<$b)b]|x<-a]
f a|let c=[1..l a];g(u,d)k|m<-[t(+)a b|(a,b)<-a#u&[[s[d|x==y]|y<-c]|x<-c]]=(m,-s[s[b|(n,b)<-c&a,n==m]|(a,m)<-a#m&c]/i k)=snd<$>scanl g(0<$c<$c,1)c
p?x|let f=foldl1(x!);c=l p-1;n=i c;q p=init$t(*)p$i<$>[c,c-1..];o=f(q p)/f p;a|d<-sqrt$(n-1)*(n*(o^2-f(q$q p)/f p)-o^2)=n/last(o-d:[o+d|m(o-d)<m(o+d)])=last$p?(x-a):[x|m a<1e-9]
z[a,b]=[-b/a]
z p=p?0:z(init$scanl1(p?0!)p)

ลองออนไลน์!

ขอบคุณมาก @ ØrjanJohansenรวม -47 ​​ไบต์!

คำอธิบาย

แรกนี้คำนวณพหุนามลักษณะกับFaddeev-LeVerrier อัลกอริทึมfซึ่งเป็นฟังก์ชั่น จากนั้นฟังก์ชั่นzคำนวณรากทั้งหมดของพหุนามว่าโดย iterating gซึ่งการดำเนินการวิธี Laguerre ของการหารากเมื่อรากจะพบว่ามันจะถูกลบและgได้รับการเรียกอีกครั้งจนกว่าพหุนามมีการศึกษาระดับ 1 z[a,b]=[-b/a]ซึ่งได้รับการแก้ไขโดยนิด

Ungolfed

ฉันอีกครั้ง inlined ฟังก์ชั่นsum, length, magnitude, fromIntegral, zipWithและเช่นเดียวกับผู้ช่วยที่เล็ก(&) ๆ น้อย ๆ (!)ฟังก์ชั่นfaddeevLeVerrierสอดคล้องกับf, rootsไปzและgไปlaguerreตามลำดับ

-- Transpose a matrix/list
transpose a = foldr (zipWith(:)) (replicate (length a) []) a

-- Straight forward implementation for matrix-matrix multiplication
(#) :: [[Complex Double]] -> [[Complex Double]] -> [[Complex Double]]
a # b = [[sum $ zipWith (*) x y | y <- transpose b]|x<-a]


-- Faddeev-LeVerrier algorithm
faddeevLeVerrier :: [[Complex Double]] -> [Complex Double]
faddeevLeVerrier a = snd <$> scanl go (zero,1) [1..n]
  where n = length a
        zero = replicate n (replicate n 0)
        trace m = sum [sum [b|(n,b)<-zip [1..n] a,n==m]|(m,a)<-zip [1..n] m]
        diag d = [[sum[d|x==y]|y<-[1..n]]|x<-[1..n]]
        add as bs = [[x+y | (x,y) <- zip a b] | (b,a) <- zip as bs]
        go (u,d) k = (m, -trace (a#m) / fromIntegral k)
          where m = add (diag d) (a#u)


-- Compute roots by succesively removing newly computed roots
roots :: [Complex Double] -> [Complex Double]
roots [a,b] = [-b/a]
roots   p   = root : roots (removeRoot p)
  where root = laguerre p 0
        removeRoot = init . scanl1 (\a b -> root*a + b)

-- Compute a root of a polynomial p with an initial guess x
laguerre :: [Complex Double] -> Complex Double -> Complex Double
laguerre p x = if magnitude a < 1e-9 then x else laguerre p new_x
  where evaluate = foldl1 (\a b -> x*a+b)
        order' = length p - 1
        order  = fromIntegral $ length p - 1
        derivative p = init $ zipWith (*) p $ map fromIntegral [order',order'-1..]
        g  = evaluate (derivative p) / evaluate p
        h  = (g ** 2 - evaluate (derivative (derivative p)) / evaluate p)
        d  = sqrt $ (order-1) * (order*h - g**2)
        ga = g - d
        gb = g + d
        s = if magnitude ga < magnitude gb then gb else ga
        a = order /s
        new_x = x - a

1
เนื่องจากการส่งเพียงอย่างเดียวที่ไม่ได้ใช้บิวอินนี่ควรเป็นคำตอบที่ได้รับคะแนนสูงสุด
แยกผลไม้

+1 สำหรับการคำนวณบางสิ่งที่เกี่ยวข้องกับปัจจัยในเวลาน้อยกว่าn!!
user202729

ขอบคุณเพื่อน! @ user202729: เริ่มแรกฉันดูแล!และสับสนจริง ๆ : D
ბიოო

6

อ็อกเทฟ , 4 ไบต์

@eig

ลองออนไลน์!

มีเพียงสองไบต์ที่มากกว่าภาษาที่เทียบเท่าของ MATL Golf!

กำหนดจัดการฟังก์ชันที่ไม่ระบุชื่อให้กับeigในตัว ที่น่าสนใจคือปรัชญาการออกแบบของ MATLAB นั้นขัดแย้งกับภาษาระดับสูงหลายภาษาที่ต้องการใช้งานDescripteFunctionNamesTakingArguments()ในขณะที่ MATLAB และ Octave มีแนวโน้มที่จะได้ชื่อฟังก์ชันที่สั้นที่สุดที่ชัดเจน ยกตัวอย่างเช่นการที่จะได้รับs ubset ค่าลักษณะเฉพาะ (เช่นที่เล็กที่สุดnในขนาดที่แน่นอน) eigsคุณใช้

เป็นโบนัสที่นี่เป็นฟังก์ชั่น (ทำงานใน MATLAB และในทางทฤษฎีสามารถทำงานในคู่ แต่พวกเขาsolveไม่ได้จริงๆขึ้นอยู่กับงาน) ที่ไม่ได้ใช้ตัว -ins แต่แทนที่จะเป็นสัญลักษณ์แก้ปัญหา eigenvalue, det(A-λI)=0และแปลงมัน เป็นรูปแบบตัวเลขโดยใช้vpa

@(A)vpa(solve(det(A-sym('l')*eye(size(A)))))

3

MATL , 2 ไบต์

Yv

ลองออนไลน์!

คำอธิบาย

ฉันทำตามคำแนะนำตามปกติในพีชคณิตเชิงเส้นเชิงตัวเลข: แทนที่จะเขียนฟังก์ชันของคุณเองใช้บิวด์อินที่ออกแบบมาเป็นพิเศษเพื่อหลีกเลี่ยงความไม่แน่นอนเชิงตัวเลข

บังเอิญมันสั้นกว่า ¯ \ _ (ツ) _ / ¯


นี้ begs คำถามนานแค่ไหนถึงจะไม่มีYv?
Sanchises

@Sanchises ฉันไม่แน่ใจ ฉันอาจจะไปเกี่ยวกับเรื่องนี้โดยการค้นหาราก ( ZQ) ของพหุนามลักษณะ แต่การคำนวณค่าสัมประสิทธิ์พหุนามอย่างชัดเจนอาจเป็นงานจำนวนมาก
Luis Mendo

2

Mathematica ขนาด 11 ไบต์

Eigenvalues

ลองออนไลน์!


ใช่ฉันคาดหวังคำตอบในตัวก่อนคลิก "1 คำตอบใหม่สำหรับคำถามนี้" ลองรอคำตอบที่ไม่ได้สร้างขึ้นมาก่อน ... / โดยพื้นฐานแล้ว Mathematica solution มักจะเป็น <คำแรกในชื่อ>
user202729

ระยะทางที่ไม่บริสุทธิ์ที่สั้นที่สุดที่ฉันได้รับคือFirst@Eigensystem@#&(20 ไบต์)
Mr. Xcoder

7
ฉันเห็นด้วยกับ user202729 ที่นี่จริง ๆ ในขณะที่มันเป็นเรื่องสนุกที่จะตลกเกี่ยวกับ Mathematica ที่มี builtin สำหรับทุกสิ่งมันน่ารำคาญมากทั้งในฐานะผู้ท้าทายโปสเตอร์และตอบคำถามเพื่อดูคำตอบในตัวที่เทียบเท่ากับสิ่งที่คุณพยายามทำค่อนข้างยาก Golfing (IMO) เป็นเรื่องเกี่ยวกับการพยายามค้นหาอัลกอริธึมที่สั้นที่สุดและการใช้อัลกอริธึมที่กล่าวมา
caird coinheringaahing

2
@cairdcoinheringaahing เราควรเริ่มนำข้อเสนอของ xnor มาปฏิบัติจริง
Martin Ender

1

R , 22 ไบต์

function(m)eigen(m)$va

ลองออนไลน์!

ใช้mเป็นเมทริกซ์ เฉื่อยชาeigenฟังก์ชันใน R ส่งคืนออบเจ็กต์ของคลาสeigenซึ่งมีสองฟิลด์: values, ค่าลักษณะเฉพาะและvectorseigenvectors

อย่างไรก็ตามยิ่งน่ารำคาญกว่าอาร์กิวเมนต์ที่เป็นตัวเลือกonly.valuesจะส่งกลับค่าlistด้วยสองฟิลด์valuesประกอบด้วยค่าลักษณะเฉพาะและvectorsตั้งค่าเป็นNULLแต่เนื่องจากeigen(m,,T)มีขนาด 22 ไบต์จึงเป็นการล้างข้อมูล




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