Là ma trận tích cực-xác định?


19

Giới thiệu

Hôm nay chúng ta sẽ quan tâm đến lợi ích của sinh viên đại số tuyến tính năm đầu tiên: sự dứt khoát của ma trận! Rõ ràng điều này chưa có một thách thức vì vậy chúng tôi đi đây:

Đầu vào

  • Một n×n đối xứng Matrix A trong bất kỳ định dạng thuận tiện (bạn cũng có thể tất nhiên chỉ mất phía trên hoặc phần dưới của ma trận)
  • Tùy chọn: kích thước của ma trận n

Phải làm sao

Thách thức rất đơn giản: Đưa ra một ma trận có giá trị thực Ma trận n×n quyết định xem nó có xác định dương hay không bằng cách đưa ra một giá trị trung thực nếu có và giá trị falsey nếu không.

Bạn có thể cho rằng các công cụ tích hợp của mình thực sự hoạt động chính xác và do đó không phải tính đến các vấn đề về số có thể dẫn đến hành vi sai nếu chiến lược / mã "có thể chứng minh" sẽ mang lại kết quả chính xác.

Ai thắng?

Đây là , vì vậy mã ngắn nhất tính theo byte (theo ngôn ngữ) sẽ thắng!


Dù sao ma trận xác định dương là gì?

Rõ ràng có 6 công thức tương đương khi một ma trận đối xứng là dương-xác định. Tôi sẽ sao chép ba cái dễ hơn và đưa bạn đến Wikipedia cho những cái phức tạp hơn.

  • Nếu vRn{0}:vTAv>0 thì A là dương-định.
    Điều này có thể được định dạng lại là:
    Nếu với mọi vectơ khác không v , sản phẩm chấm (tiêu chuẩn) của vAv là dương thì A là dương xác định.
  • Hãy λii{1,,n}giá trị riêngcủaA , nếu bây giời{1,,n}:λi>0 (có nghĩa là tất cả các giá trị riêng là dương tính) sau đóA là dương-định.
    Nếu bạn không biết giá trị bản địa là gì thì tôi khuyên bạn nên sử dụng công cụ tìm kiếm yêu thích của mình để tìm hiểu, bởi vì lời giải thích (và các chiến lược tính toán cần thiết) quá dài để có trong bài viết này.
  • Nếu tồn tại Cholesky-Decysis of A , tức là tồn tại ma trận tam giác thấp hơn L sao cho LLT=A thì A là xác định dương. Lưu ý rằng điều này tương đương với "false" trả về sớm nếu tại bất kỳ thời điểm nào, tính toán của root trong thuật toán không thành công do một đối số phủ định.

Ví dụ

Đối với đầu ra trung thực

(100010001)

(1000020000300004)

(521211113)

(1222502030)

(7.152.452.459.37)

Đối với đầu ra falsey

(ít nhất một giá trị riêng là 0 / bán xác định dương)

(322240202)

(giá trị riêng có các dấu hiệu khác nhau / không xác định)

(100010001)

(tất cả các giá trị riêng nhỏ hơn 0 / xác định âm)

(100010001)

(tất cả các giá trị riêng nhỏ hơn 0 / xác định âm)

(230350001)

(tất cả các giá trị riêng nhỏ hơn 0 / xác định âm)

(7.152.452.459.37)

(ba giá trị dương, một giá trị riêng âm / không xác định)

(7.152.451.233.52.459.372.713.141.232.7106.23.53.146.20.56)



Bạn cần cung cấp một định nghĩa tốt hơn về những gì chúng ta cần phải tìm kiếm hơn là giả sử tất cả chúng ta có thể đọc ký hiệu toán học (hoặc tất cả đều biết "giá trị riêng" là gì). Một ví dụ làm việc cũng sẽ hữu ích.
Xù xì

9
@Shaggy Tôi nghĩ rằng thách thức là tốt hơn mà không có tất cả các nền tảng để làm tắc nghẽn nó. Có rất nhiều giải thích hiện tại về những gì một giá trị riêng ở nơi khác, và bài đăng này đã thực sự lớn.
Thuật sĩ lúa mì

1
Thử thách sẽ đẹp hơn nếu bạn không giới hạn đầu vào đối với ma trận đối xứng .
polfosol _ఠ

1
Ý tôi là chỉ kiểm tra dấu hiệu của giá trị bản địa cũng nhàm chán. Hương vị khác nhau mà tôi biết;)
polfosol _ఠ

Câu trả lời:


11

C, 108 byte

-1 byte nhờ Logern
-3 byte nhờ vào trần nhà

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

Hãy thử trực tuyến!

Thực hiện loại bỏ Gaussian và kiểm tra xem tất cả các yếu tố đường chéo có dương hay không (tiêu chí của Sylvester). Đối số nlà kích thước của ma trận trừ đi một.


Có lẽ lưu một nhân vật với float thay vì double?
Jens


Bạn có thể cạo một ký tự khác nếu bạn thả i=0vào vòng lặp for, thực hiện cuộc gọi đệ quy f(M,n-1,0)và cuộc gọi ban đầu với 0 là đối số thứ ba.
Jens

@Jens 1. Sử dụng float thay vì nhân đôi có thể nhanh chóng dẫn đến các lỗi làm tròn đáng chú ý, vì vậy tôi không nghĩ rằng một byte được lưu là đáng giá. 2. Khởi tạo một biến thông qua một đối số bổ sung có vẻ như gian lận với tôi.
nwellnhof

@Logern Tôi từ chối sử dụng thủ thuật "bỏ qua câu lệnh hoàn trả" trong câu trả lời C của mình. Nhưng cảm ơn cho các byte khác được lưu.
nwellnhof

9

MATLAB / Octave , 19 17 12 byte

@(A)eig(A)>0

Hãy thử trực tuyến!

Hàm eig cung cấp các giá trị riêng theo thứ tự tăng dần, vì vậy nếu giá trị riêng đầu tiên lớn hơn 0, thì các giá trị khác cũng vậy.


Bạn có thể bỏ phần f=đầu - các hàm ẩn danh thường được chấp nhận làm câu trả lời.
Delfad0r

Cảm ơn vì tiền hỗ trợ!
Daniel Turizo

Ngay cả khi nó là một vector? Thú vị
Daniel Turizo

1
+1. Tôi đã thêm một liên kết để thử trực tuyến. Hy vọng bạn không phiền. Lưu ý rằng điều đó cũng chứng minh rằng các giá trị đầu ra mặc dù là các mảng được tính là giá trị "trung thực" hoặc "falsey" chính xác theo liên kết @ Delfad0r được đăng.
Tom Carpenter

2
Phải nói rằng, nó đã thất bại cho trường hợp thử nghiệm "falsey" đầu tiên trên TIO. Tôi đoán là do một vấn đề chính xác - một trong những giá trị Eigen xuất hiện 8.9219e-17thay vì 0.
Tom Carpenter

7

Thạch , 11 10 byte

ṖṖ€$ƬÆḊṂ>0

Sử dụng tiêu chí của Sylvester .

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

ṖṖ€$ƬÆḊṂ>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 byte

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

Hãy thử trực tuyến!

Về cơ bản là một cảng của câu trả lời của nwellnhof . Thực hiện loại bỏ gaussian và kiểm tra xem các phần tử trên đường chéo chính có dương hay không.

Thất bại đầu ra falsey đầu tiên vì lỗi làm tròn, nhưng về mặt lý thuyết nó sẽ hoạt động với độ chính xác vô hạn. Nhờ đề xuất của Curtis Bechtel , bây giờ các kết quả đầu ra đều chính xác.


2
bạn có thể thêm inputs :: [[[Rational]]]để có câu trả lời chính xác
Curtis Bechtel

4

Trường hợp thử nghiệm thứ 4 có nên sai không?
tsh

@tsh Đã sửa, tôi câm!
Ông Xcoder

8
Thật buồn cười là Mathicala có một nội dung cho việc này , nhưng tên của nó dài hơn giải pháp của bạn.
Federico Poloni

@FedericoPoloni: Sẽ không một giải pháp nào sử dụng NullSpace hoặc MatrixRank thậm chí còn ngắn hơn? Nếu không gian Null bằng 0 thì ma trận xác định dương.
Phil H

@PhilH Không, tôi sợ rằng nó không hoạt động. Chẳng hạn, ví dụ falsey thứ hai (ma trận đường chéo với (1, -1,1)) có thứ hạng 3, nhưng không xác định dương.
Federico Poloni

3

MATL , 4 byte

Yv0>

Hãy thử trực tuyến!

Tôi đã nhận thấy rằng đối với [3 -2 2; -2 4 0; 2 0 2]trường hợp thử nghiệm, MATL tính toán 0giá trị riêng với độ chính xác rất nhỏ, tính toán một cái gì đó thấp đến mức10-18. Do đó, điều này không thành công trong trường hợp thử nghiệm giả đầu tiên do các vấn đề chính xác. Cảm ơn Luis Mendo đã chỉ ra rằng một mảng không trống là sự thật nếu tất cả các mục nhập của nó khác 0, tiết kiệm 1 byte.


1
@LuisMendo Cảm ơn, tôi đã học được một điều mới về MATL ngày hôm nay!
Ông Xcoder

Niềm vui của tôi :-) Đây là một lời giải thích tốt hơn của Suever. Tôi quên nói rằng đối với các mảng có giá trị phức tạp, chỉ có phần thực được so sánh với không. [1 2 3j]Falsey cũng vậy
Luis Mendo



2

MATL , 6 byte

Có thể làm điều đó bằng cách sử dụng ít byte hơn, @Mr. Xcoder đã tìm được câu trả lời MATL 5 byte !

YvX<0>

Giải trình

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

Hãy thử trực tuyến!


Thất bại trong trường hợp thử nghiệm giả mạo đầu tiên. Xem câu trả lời đã bị xóa của tôi .
Ông Xcoder

1
@ Mr.Xcoder Ồ, bạn thậm chí đã gửi câu trả lời trước tôi. Tôi nghĩ bạn nên hủy bỏ câu trả lời của mình vì nó chỉ phụ thuộc vào các vấn đề làm tròn. (Tôi nghĩ rằng bạn có thể mong đợi câu trả lời cho sử dụng hạn chế số học chính xác -. Tôi nghĩ rằng chỉ có những ngôn ngữ CAS ở đây sử dụng tính toán chính xác)
flawr

Theo lời khuyên của bạn, tôi đã hoàn tác nó .
Ông Xcoder

1

Maple , 33 byte

(tức là 2 xu của tôi)

with(LinearAlgebra):
IsDefinite(A)

Xin chào và chào mừng đến với PPCG; Tôi không quen thuộc với Maple, mặc dù dòng mới là cần thiết?
Jonathan Frech

@JonathanFrech Xin chào và cảm ơn. Không, không phải vậy. Tôi đã không đếm nó btw.
polfosol _ఠ

Đối với tôi số byte hiện tại của bạn dường như phản ánh ký tự dòng mới.
Jonathan Frech

@JonathanFrech Duh, xấu của tôi
polfosol _ఠ

1
Chà ... bây giờ mã của bạn và số byte của bạn không đồng ý.
Jonathan Frech

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.