เมทริกซ์เป็นบวกแน่นอนหรือไม่


19

บทนำ

วันนี้เราจะดูแลความหายนะของนักเรียนพีชคณิตเชิงเส้นในปีแรก: เมทริกซ์แน่นอน! เห็นได้ชัดว่านี่ยังไม่มีความท้าทายดังนั้นเราไปที่นี่:

อินพุต

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

จะทำอย่างไร?

ความท้าทายนั้นง่าย: การให้เมทริกซ์ที่มีมูลค่าจริงn×nเมทริกซ์ตัดสินว่ามันเป็นผลบวกแน่นอนหรือไม่โดยการส่งออกค่าความจริงหากเป็นเช่นนั้นและค่าความเท็จหากไม่

คุณอาจสันนิษฐานว่าบิวด์อินของคุณทำงานได้อย่างแม่นยำจริง ๆ และไม่จำเป็นต้องพิจารณาปัญหาเชิงตัวเลขซึ่งอาจนำไปสู่พฤติกรรมที่ไม่ถูกต้องหากกลยุทธ์ / รหัส "พิสูจน์ได้" ควรให้ผลลัพธ์ที่ถูกต้อง

ใครชนะ?

นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์ (ต่อภาษา) ชนะ!


เมทริกซ์ที่เป็นบวกแน่นอนคืออะไร

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

  • ถ้าvRn{0}:vTAv>0ดังนั้นAเป็นค่าบวกแน่นอน
    สิ่งนี้สามารถกำหนดสูตรใหม่ได้เช่น:
    หากสำหรับเวกเตอร์ที่ไม่เป็นศูนย์vผลิตภัณฑ์จุด (มาตรฐาน) ของvและAvเป็นค่าบวกดังนั้นAจะเป็นค่าบวกแน่นอน
  • ให้λii{1,,n}เป็นค่าลักษณะเฉพาะของA , ถ้าตอนนี้i{1,,n}:λi>0 (นั่นคือค่าลักษณะเฉพาะทั้งหมดเป็นค่าบวก) จากนั้นAเป็นค่าบวกแน่นอน
    หากคุณไม่ทราบว่าค่าลักษณะเฉพาะคืออะไรฉันขอแนะนำให้คุณใช้เครื่องมือค้นหาที่คุณชื่นชอบเพื่อค้นหาเพราะคำอธิบาย (และกลยุทธ์การคำนวณที่จำเป็น) นั้นยาวเกินกว่าที่จะอยู่ในบทความนี้
  • ถ้าCholesky-DecompositionของAมีอยู่นั่นคือมีเมทริกซ์สามเหลี่ยมล่างLเช่นนั้นLLT=Aดังนั้นAจะเป็นบวกแน่นอน โปรดทราบว่านี่เทียบเท่ากับการคืนค่า "เท็จ" แต่เนิ่น ๆ หากการคำนวณของรูทระหว่างอัลกอริทึมล้มเหลวเนื่องจากข้อโต้แย้งเชิงลบ

ตัวอย่าง

สำหรับการส่งออกจริง

(100010001)

(1000020000300004)

(521211113)

(1222502030)

(7.152.452.459.37)

สำหรับผลลัพธ์ที่ผิดพลาด

(อย่างน้อยหนึ่งค่าลักษณะเฉพาะคือ 0 / บวกกึ่งแน่นอน)

(322240202)

(ค่าลักษณะเฉพาะมีสัญญาณที่แตกต่างกัน / ไม่ จำกัด )

(100010001)

(ค่าลักษณะเฉพาะทั้งหมดมีค่าน้อยกว่า 0 / ลบแน่นอน)

(100010001)

(ค่าลักษณะเฉพาะทั้งหมดน้อยกว่า 0 / ลบแน่นอน)

(230350001)

(ค่าลักษณะเฉพาะทั้งหมดน้อยกว่า 0 / ลบแน่นอน)

(7.152.452.459.37)

(สามค่าบวกค่าลักษณะเฉพาะเชิงลบหนึ่งค่า / ไม่ จำกัด )

(7.152.451.233.52.459.372.713.141.232.7106.23.53.146.20.56)


ความท้าทายนี้ได้รับการทดลองใช้ผลิตภัณฑ์
SEJPM

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

9
@Shaggy ฉันคิดว่าความท้าทายดีกว่าโดยไม่มีพื้นหลังทั้งหมดมาอุดตัน มีคำอธิบายที่มีอยู่มากมายเกี่ยวกับค่าลักษณะเฉพาะที่อื่นและโพสต์นี้มีขนาดใหญ่มาก
ข้าวสาลีตัวช่วยสร้าง

1
ความท้าทายน่าจะดีกว่านี้หากคุณไม่ จำกัด อินพุต เมทริกซ์สมมาตร
polfosol ఠ_ఠ

1
ฉันหมายถึงแค่ตรวจสอบว่าเครื่องหมายของค่าลักษณะเฉพาะก็น่าเบื่อเช่นกัน ฉันรู้รสนิยมที่แตกต่าง;)
polfosol ఠ_ఠ

คำตอบ:


11

C, 108 ไบต์

-1 byte ต้องขอบคุณ Logern
-3 bytes ขอบคุณไปที่ catcat

f(M,n,i)double**M;{for(i=n*n;i--;)M[i/n][i%n]-=M[n][i%n]*M[i/n][n]/M[n][n];return M[n][n]>0&(!n||f(M,n-1));}

ลองออนไลน์!

ดำเนินการกำจัดแบบเกาส์เซียนและตรวจสอบว่าองค์ประกอบแนวทแยงทั้งหมดเป็นค่าบวกหรือไม่ (เกณฑ์ของ Sylvester) อาร์กิวเมนต์nคือขนาดของเมทริกซ์ลบหนึ่ง


บางทีช่วยตัวละครด้วยการลอยแทนการเป็นสองเท่า?
Jens


คุณสามารถโกนตัวละครอื่นได้ถ้าคุณดรอปi=0ไว้ใน for for loop โทรซ้ำf(M,n-1,0)และเรียกเริ่มต้นด้วย 0 เป็นอาร์กิวเมนต์ที่สาม
Jens

@Jens 1. การใช้การลอยแทนการดับเบิลสามารถนำไปสู่ข้อผิดพลาดในการปัดเศษที่สังเกตเห็นได้อย่างรวดเร็วดังนั้นฉันจึงไม่คิดว่าไบต์ที่บันทึกไว้มีค่า 2. การเริ่มต้นตัวแปรผ่านอาร์กิวเมนต์เพิ่มเติมดูเหมือนว่าการโกงกับฉัน
nwellnhof

@Logern ฉันปฏิเสธที่จะใช้เคล็ดลับ "ละเว้นคำสั่งส่งคืนสินค้า" ในคำตอบ C ของฉัน แต่ขอบคุณสำหรับการบันทึกไบต์อื่น ๆ
nwellnhof

9

MATLAB / Octave , 19 17 12 ไบต์

@(A)eig(A)>0

ลองออนไลน์!

ฟังก์ชัน eig จัดเตรียมค่าลักษณะเฉพาะในลำดับจากน้อยไปหามากดังนั้นหากค่าลักษณะเฉพาะแรกมีค่ามากกว่าศูนย์


คุณสามารถวางf=ที่จุดเริ่มต้น - ฟังก์ชั่นที่ไม่ระบุชื่อได้รับการยอมรับโดยทั่วไปว่าเป็นคำตอบ
Delfad0r

ขอบคุณสำหรับทิป!
Daniel Turizo

แม้ว่ามันจะเป็นเวกเตอร์ น่าสนใจ
Daniel Turizo

1
+1 ฉันได้เพิ่มลิงก์สำหรับลองออนไลน์ หวังว่าคุณจะไม่รังเกียจ โปรดทราบว่ามันยังพิสูจน์ได้ว่าค่าเอาต์พุตแม้จะเป็นอาร์เรย์จะนับเป็นค่า "ความจริง" หรือ "เท็จ" ที่ถูกต้องตามลิงค์ @ Delfad0r ที่โพสต์
Tom Carpenter

2
ต้องบอกว่ามันล้มเหลวในกรณีทดสอบ "falsey" ครั้งแรกของ TIO ฉันคาดเดาเนื่องจากปัญหาความแม่นยำ - หนึ่งในค่า Eigen ออกมา8.9219e-17มากกว่า 0
Tom Carpenter

7

เจลลี่ , 11 10 ไบต์

ṖṖ€$ƬÆḊṂ>0

ใช้เกณฑ์ซิลเวสของ

ลองออนไลน์!

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

ṖṖ€$ƬÆḊṂ>0  Main link. Argument: M (matrix)

   $Ƭ       Do the following until a fixed point is encountered.
Ṗ             Pop; remove the last row of the matrix.
 Ṗ€           Pop each; remove the last entry of each row.
     ÆḊ     Take the determinants of the resulting minors.
       Ṃ    Take the minimum.
        >0  Test if the least determinant is positive, i.e., if all determinants are.


6

Haskell , 56 ไบต์

f((x:y):z)=x>0&&f[zipWith(-)v$map(u/x*)y|u:v<-z]
f[]=1>0

ลองออนไลน์!

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

ล้มเหลวในการส่งออก falsey แรกเนื่องจากข้อผิดพลาดในการปัดเศษ แต่ในทางทฤษฎีมันจะทำงานกับความแม่นยำที่ไม่มีที่สิ้นสุด ขอบคุณคำแนะนำของ Curtis Bechtelตอนนี้ผลลัพธ์ถูกต้องทั้งหมด


2
คุณสามารถเพิ่มinputs :: [[[Rational]]]เพื่อรับคำตอบที่ถูกต้อง
Curtis Bechtel

4

ภาษา Wolfram (Mathematica)ขนาด 20 ไบต์

0<Min@Eigenvalues@#&

ลองออนไลน์!


กรณีทดสอบที่ 4 ควรเป็นเท็จหรือไม่
tsh

@tsh คงที่ฉันเป็นใบ้!
Mr. Xcoder

8
ขำขันว่า Mathematica มีแบบในตัวสำหรับสิ่งนี้แต่ชื่อของมันยาวกว่าโซลูชันของคุณ
Federico Poloni

@FedericoPoloni: การแก้ปัญหาโดยใช้ NullSpace หรือ MatrixRank จะสั้นกว่านี้หรือไม่ ถ้า Null space เป็นศูนย์ดังนั้นเมทริกซ์จะเป็นค่าบวกแน่นอน
Phil H

@ ฟิลล์ไม่ฉันเกรงว่าจะไม่ทำงานด้วยตัวเอง ตัวอย่างเช่นตัวอย่างเท็จที่สอง (เมทริกซ์แนวทแยงที่มี (1, -1,1)) มีอันดับ 3 แต่ไม่แน่นอนแน่นอน
Federico Poloni

3

MATL , 4 ไบต์

Yv0>

ลองออนไลน์!

[3 -2 2; -2 4 0; 2 0 2]010-18 18สิ่งนี้จึงล้มเหลวในกรณีทดสอบที่ผิดพลาดครั้งแรกเนื่องจากปัญหาความแม่นยำ ขอบคุณ Luis Mendo สำหรับการชี้ให้เห็นว่าอาเรย์ที่ไม่ว่างนั้นเป็นความจริงหากรายการทั้งหมดต่างจาก 0 ทำให้ประหยัด 1 ไบต์


1
@ LuisMendo ขอบคุณฉันได้เรียนรู้สิ่งใหม่เกี่ยวกับ MATL วันนี้!
Mr. Xcoder

ความสุขของฉัน :-) นี่คือคำอธิบายที่ดีกว่าโดย Suever ฉันลืมที่จะพูดว่าสำหรับอาร์เรย์ที่มีมูลค่าซับซ้อนเท่านั้นส่วนจริงจะถูกเปรียบเทียบกับศูนย์ ดังนั้น[1 2 3j]เท็จคือ
Luis Mendo



2

MATL , 6 ไบต์

เป็นไปได้ที่จะทำโดยใช้ไบต์ที่น้อยลง @Mr Xcoder จัดการเพื่อหาคำตอบ 5 ไบต์ MATL !

YvX<0>

คำอธิบาย

Yv     compute eigenvalues
  X<   take the minimum
    0> check whether it is greather than zero

ลองออนไลน์!


ล้มเหลวในกรณีทดสอบที่ผิดพลาดครั้งแรก ดูคำตอบที่ถูกลบของฉัน
Mr. Xcoder

1
@ Mr.Xcoder โอ้คุณยังเคยส่งคำตอบมาก่อนเลย ฉันคิดว่าคุณควรยกเลิกการลบคำตอบของคุณเพราะมันขึ้นอยู่กับประเด็นการปัดเศษ (ฉันคิดว่าคุณสามารถคาดหวังคำตอบในการใช้เลขคณิตความแม่นยำที่ จำกัด ได้ - ฉันคิดว่าเฉพาะภาษา CAS ที่นี่ใช้การคำนวณที่แน่นอน)
ข้อบกพร่อง

ทำตามคำแนะนำของคุณฉันได้ยกเลิกการลบแล้ว
Mr. Xcoder

1

เมเปิ้ล 33 ไบต์

(เช่น 2 เซ็นต์ของฉัน)

with(LinearAlgebra):
IsDefinite(A)

สวัสดีและยินดีต้อนรับสู่ PPCG; ฉันไม่คุ้นเคยกับเมเปิ้ลแม้ว่าการขึ้นบรรทัดใหม่เป็นสิ่งจำเป็นหรือไม่
Jonathan Frech

@ JonathanFrech สวัสดีและขอบคุณ ไม่มันไม่ใช่. ฉันไม่ได้นับมัน
polfosol ఠ_ఠ

สำหรับฉันแล้วจำนวนไบต์ปัจจุบันของคุณดูเหมือนจะสะท้อนถึงอักขระบรรทัดใหม่
Jonathan Frech

@ JonathanFrech Duh แย่ของฉัน
polfosol ఠ_ఠ

1
ทีนี้ ... ตอนนี้โค้ดและจำนวนไบต์ของคุณไม่เห็นด้วย
Jonathan Frech

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