Czy macierz jest pozytywnie zdefiniowana?

19

Wprowadzenie

Dzisiaj zajmiemy się zmorą studentów pierwszego roku algebry liniowej: definitywnością macierzy! Najwyraźniej nie stanowi to jeszcze wyzwania, więc zaczynamy:

Wejście

  • A symetryczna Matryca w dowolnym dogodnym formacie (możesz oczywiście wziąć tylko górną lub dolną część matrycy)n×n A
  • Opcjonalnie: rozmiar matrycyn

Co robić?

Wyzwanie jest proste: biorąc pod uwagę macierz o wartości rzeczywistej Macierz decyduje, czy jest ona pozytywnie określona, ​​podając prawdziwą wartość, jeśli tak, i wartość falsey, jeśli nie.n×n

Możesz założyć, że Twoje wbudowane naprawdę działają dokładnie, a zatem nie musisz brać pod uwagę problemów numerycznych, które mogłyby prowadzić do niewłaściwego zachowania, jeśli strategia / kod „możliwe do udowodnienia” przyniosą poprawny wynik.

Kto wygrywa?

To jest , więc wygrywa najkrótszy kod w bajtach (na język)!


Czym w każdym razie jest Matryca dodatnia?

Istnieje najwyraźniej 6 równoważnych sformułowań, w których matryca symetryczna jest dodatnia. Powtórzę trzy łatwiejsze i odsyłam do Wikipedii w przypadku bardziej złożonych.

  • Jeśli to jest dodatnie. Można to ponownie sformułować w następujący sposób: Jeżeli dla każdego niezerowego wektora iloczyn (standardowy) kropek i jest dodatni, to jest dodatnio określony.vRn{0}:vTAv>0A

    vvAvA
  • Niech być wartości własne z , jeśli teraz (to jest wszystkich wartości własne są dodatnie), a następnie jest pozytywnie określone. Jeśli nie wiesz, jakie są wartości własne, sugeruję skorzystanie z ulubionej wyszukiwarki, aby się dowiedzieć, ponieważ wyjaśnienie (i potrzebne strategie obliczeniowe) jest zbyt długie, aby mogło zostać zawarte w tym poście.λii{1,,n}A i { 1 , , n } : λ i > 0 AAi{1,,n}:λi>0A
  • Jeżeli Cholesky'ego-rozkładu z istnieje, to istnieje dolną trójkątne matrycy takie, że następnie jest dodatnio określony. Zauważ, że jest to równoważne wczesnemu zwróceniu wartości „fałsz”, jeśli w dowolnym momencie obliczenie katalogu głównego podczas algorytmu nie powiedzie się z powodu argumentu ujemnego.ALLLT=AA

Przykłady

Dla prawdziwej wydajności

(100010001)

(1000020000300004)

(521211113)

(1222502030)

(7.152.452.459.37)

Dla wyjścia falsey

(co najmniej jedna wartość własna wynosi 0 / dodatnia półokreślona)

(322240202)

(wartości własne mają różne znaki / nieokreślony)

(100010001)

(wszystkie wartości własne mniejsze niż 0 / definitywnie ujemne)

(100010001)

(wszystkie wartości własne mniejsze niż 0 / definitywnie ujemne)

(230350001)

(wszystkie wartości własne mniejsze niż 0 / definitywnie ujemne)

(7.152.452.459.37)

(trzy dodatnie, jedna ujemna wartość własna / nieokreślona)

(7.152.451.233.52.459.372.713.141.232.7106.23.53.146.20.56)

SEJPM
źródło
Musisz podać lepszą definicję tego, czego powinniśmy szukać, zamiast zakładać, że wszyscy możemy odczytać zapis matematyczny (lub wszyscy wiemy, co to jest „wartość własna”). Przydałby się też sprawdzony przykład.
Shaggy
9
@Shaggy Myślę, że wyzwanie jest lepsze bez całego tła, aby je zatkać. Istnieje wiele istniejących wyjaśnień tego, czym wartość własna jest gdzie indziej, a ten post jest już naprawdę duży.
Wheat Wizard
1
Wyzwanie byłoby przyjemniejsze, gdybyś nie ograniczył danych wejściowych do matryc symetrycznych .
polfosol ఠ_ఠ
1
Miałem na myśli po prostu sprawdzanie, czy znak wartości własnych jest nudny. Znam różne smaki;)
polfosol ఠ_ఠ

Odpowiedzi:

11

C, 108 bajtów

-1 bajt dzięki Logern
-3 bajty dzięki ceilingcat

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

Wypróbuj online!

Przeprowadza eliminację Gaussa i sprawdza, czy wszystkie elementy ukośne są dodatnie (kryterium Sylwestra). Argument njest rozmiarem macierzy minus jeden.

nwellnhof
źródło
Być może uratować postać ze zmiennoprzecinkową zamiast podwójnej?
Jens
Możesz ogolić inną postać, jeśli wpadniesz i=0do pętli for, wykonasz wywołanie rekurencyjne f(M,n-1,0)i początkowe z 0 jako trzeci argument.
Jens
@Jens 1. Używanie liczb zmiennoprzecinkowych zamiast liczb podwójnych może szybko prowadzić do zauważalnych błędów zaokrąglania, więc nie sądzę, aby zaoszczędzony jeden bajt był tego wart. 2. Inicjowanie zmiennej za pomocą dodatkowego argumentu wygląda dla mnie na oszustwo.
nwellnhof
@Logern Odmawiam użycia sztuczki „pomiń instrukcję zwrotną” w moich odpowiedziach w języku C. Ale dzięki za uratowanie drugiego bajtu.
nwellnhof
9

MATLAB / Octave , 19 17 12 bajtów

@(A)eig(A)>0

Wypróbuj online!

Funkcja eig zapewnia wartości własne w porządku rosnącym, więc jeśli pierwsza wartość własna jest większa od zera, pozostałe też są.

Daniel Turizo
źródło
Możesz odrzucić f=na początku - anonimowe funkcje są ogólnie akceptowane jako odpowiedzi.
Delfad0r,
Dzięki za wskazówkę!
Daniel Turizo
Nawet jeśli to wektor? Ciekawe
Daniel Turizo,
1
+1. Dodałem link do wypróbowania go online. Mam nadzieję, że nie masz nic przeciwko. Zauważ, że dowodzi to również, że wartości wyjściowe, mimo że są tablicami, liczą się jako prawidłowe wartości „prawdy” lub „falseya” zgodnie z opublikowanym linkiem @ Delfad0r.
Tom Carpenter,
2
Powiedziawszy to, nie udaje się to w pierwszym przypadku testowym „falsey” na TIO. Zgaduję ze względu na problem z precyzją - jedna z wartości Eigen pojawia się 8.9219e-17zamiast 0.
Tom Carpenter
7

Galaretka , 11 10 bajtów

ṖṖ€$ƬÆḊṂ>0

Wykorzystuje kryterium Sylvester .

Wypróbuj online!

Jak to działa

ṖṖ€$ƬÆḊṂ>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.
Dennis
źródło
6

R , 29 bajtów

function(m)all(eigen(m)$va>0)

Wypróbuj online!


Alternatywne użycie cholesky:

R , 34 33 bajtów

function(m)is.array(try(chol(m)))

Wypróbuj online!

-1 bajt dzięki @Giuseppe

digEmAll
źródło
6

Haskell , 56 bajtów

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

Wypróbuj online!

Zasadniczo port odpowiedzi nwellnhofa . Dokonuje eliminacji gaussowskiej i sprawdza, czy elementy na głównej przekątnej są dodatnie.

Nie udaje się uzyskać pierwszego wyniku falsey z powodu błędów zaokrąglania, ale teoretycznie działałoby to z nieskończoną precyzją. Dzięki sugestii Curtisa Bechtela wszystkie wyniki są teraz prawidłowe.

Delfad0r
źródło
2
możesz dodać, inputs :: [[[Rational]]]aby uzyskać poprawne odpowiedzi
Curtis Bechtel
4

Wolfram Language (Mathematica) , 20 bajtów

0<Min@Eigenvalues@#&

Wypróbuj online!

Pan Xcoder
źródło
Czy czwarty przypadek testowy powinien być fałszywy?
tsh
@tsh Naprawiono, jestem głupi!
Pan Xcoder,
8
Zabawne, jak Mathematica ma do tego wbudowane oprogramowanie , ale jego nazwa jest dłuższa niż twoje rozwiązanie.
Federico Poloni,
@FedericoPoloni: Czy rozwiązanie wykorzystujące NullSpace lub MatrixRank nie byłoby jeszcze krótsze? Jeśli zerowa przestrzeń wynosi zero, to macierz jest dodatnia.
Phil H
@PhilH Nie, obawiam się, że to nie działa samo z siebie. Na przykład drugi przykład falseya (macierz diagonalna z (1, -1, 1)) ma rangę 3, ale nie jest pozytywnie określony.
Federico Poloni
3

MATL , 4 bajty

Yv0>

Wypróbuj online!

[3 -2 2; -2 4 0; 2 0 2]01018

Pan Xcoder
źródło
1
@LuisMendo Dzięki, nauczyłem się dzisiaj czegoś nowego o MATL!
Pan Xcoder,
Cała przyjemność po mojej stronie :-) Oto lepsze wyjaśnienie Suever. Zapomniałem powiedzieć, że w przypadku tablic o złożonej wartości tylko rzeczywista część jest porównywana z zero. Podobnie jak [1 2 3j]falsey
Luis Mendo
2

Mathematica, 29 28 bajtów

AllTrue[Eigenvalues@#,#>0&]&

Definicja 2.

Shieru Asakoto
źródło
2

MATL , 6 bajtów

Można to zrobić przy użyciu jeszcze mniej bajtów @Mr. Xcoderowi udało się znaleźć 5-bajtową odpowiedź MATL !

YvX<0>

Wyjaśnienie

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

Wypróbuj online!

wada
źródło
Nie udaje się pierwszy przypadek testu fałszerstwa. Zobacz moją usuniętą odpowiedź .
Pan Xcoder,
1
@ Mr.Xcoder Och, nawet przesłałeś mi odpowiedź. Myślę, że powinieneś cofnąć usunięcie swojej odpowiedzi, ponieważ zależy to tylko od zaokrąglenia. (Myślę, że można oczekiwać, że w odpowiedziach zastosowana zostanie arytmetyka o ograniczonej precyzji - myślę, że tylko tutaj języki CAS używają dokładnych obliczeń.)
flawr
Postępując zgodnie z twoją radą, usunąłem ją .
Pan Xcoder,
1

Klon , 33 bajty

(tj. moje 2 centy)

with(LinearAlgebra):
IsDefinite(A)
polfosol ఠ_ఠ
źródło
Witam i witam w PPCG; Klon nie jest mi obcy, ale czy nowa linia jest konieczna?
Jonathan Frech,
@JonathanFrech Witam i dziękuję. Nie, nie jest. Nie liczyłem tego przy okazji.
polfosol ఠ_ఠ
Dla mnie twoja obecna liczba bajtów wydaje się odzwierciedlać znak nowej linii.
Jonathan Frech,
@JonathanFrech Duh, my bad
polfosol ఠ_ఠ
1
Cóż ... teraz twój kod i liczba bajtów się nie zgadzają.
Jonathan Frech,
0

JavaScript (ES6),  99 95  88 bajtów

01

f=(m,n=0,R=m[n])=>R?f(m,n+1)&R[m.map((r,y)=>y<n&&R.map((v,x)=>r[x]-=v*r[n]/R[n])),n]>0:1

Wypróbuj online!

Arnauld
źródło