Ist die Matrix positiv-definit?

19

Einführung

Heute kümmern wir uns um den Fluch der Linearalgebra-Studenten im ersten Jahr: Matrix-Bestimmtheit! Anscheinend hat dies noch keine Herausforderung. Also los geht's:

Eingang

  • A symmetrische Matrix in jedem geeigneten Format (Sie können natürlich auch nur den oberen oder unteren Teil der Matrix nehmen)n×n AEIN
  • Optional: die Größe der Matrixn

Was ist zu tun?

Die Herausforderung ist einfach: Bei einer reellen Matrix entscheidet die Matrix, ob sie positiv und definitiv ist, indem sie einen Wahrheitswert ausgibt, wenn ja, und einen Falschwert, wenn nicht.n×n

Sie können davon ausgehen, dass Ihre eingebauten Funktionen tatsächlich präzise funktionieren, und müssen daher keine numerischen Probleme berücksichtigen, die zu einem falschen Verhalten führen könnten, wenn die Strategie / der Code "nachweislich" das richtige Ergebnis liefern sollte.

Wer gewinnt?

Das ist , also gewinnt der kürzeste Code in Bytes (pro Sprache)!


Was ist überhaupt eine positiv-definite Matrix?

Es gibt anscheinend 6 äquivalente Formulierungen, wenn eine symmetrische Matrix positiv definit ist. Ich werde die drei einfacheren reproduzieren und Sie für die komplexeren auf Wikipedia verweisen .

  • Wenn dann ist positiv-definit. Dies kann wie folgt : Wenn für jeden Nicht-Null-Vektor das (Standard-) Punktprodukt von und positiv ist, dann ist positiv bestimmt.vRn{0}:vTEINv>0EIN

    vvEINvEIN
  • Sei die Eigenwerte von , wenn jetzt (das ist alles Eigenwerte sind positiv) dann ist positiv-definit. Wenn Sie nicht wissen, um welche Eigenwerte es sich handelt, sollten Sie dies mit Ihrer bevorzugten Suchmaschine herausfinden, da die Erklärung (und die erforderlichen Berechnungsstrategien) zu lang ist, um in diesem Beitrag enthalten zu sein.λichich{1,,n}A i { 1 , , n } : λ i > 0 AEINich{1,,n}:λich>0EIN
  • Wenn die Cholesky-Zerlegung von existiert, dh es existiert eine untere Dreiecksmatrix , so daß , dann ist positiv definit. Beachten Sie, dass dies einer vorzeitigen Rückgabe von "false" entspricht, wenn die Berechnung der Wurzel während des Algorithmus an einem beliebigen Punkt aufgrund eines negativen Arguments fehlschlägt.EINLLLT=EINEIN

Beispiele

Für wahrheitsgemäße Ausgabe

(100010001)

(1000020000300004)

(52-121-1-1-13)

(1-22-2502030)

(7.152,452,459.37)

Für Falschgeldausgabe

(mindestens ein Eigenwert ist 0 / positives Semi-Definit)

(3-22-240202)

(Eigenwerte haben unterschiedliche Vorzeichen / unbestimmt)

(1000-10001)

(alle Eigenwerte kleiner als 0 / negativ definitiv)

(-1000-1000-1)

(alle Eigenwerte kleiner als 0 / negativ definitiv)

(-2303-5000-1)

(alle Eigenwerte kleiner als 0 / negativ definitiv)

(-7.15-2,45-2,45-9.37)

(drei positive, ein negativer Eigenwert / unbestimmt)

(7.152,451.233.52,459.372,713.141.232,7106.23.53.146.20,56)

SEJPM
quelle
Sie müssen besser definieren, wonach wir suchen sollen, anstatt davon auszugehen, dass wir alle die mathematische Notation lesen können (oder alle wissen, was ein "Eigenwert" ist). Ein Beispiel wäre auch nützlich.
Shaggy
9
@ Shaggy Ich denke, die Herausforderung ist besser, ohne den ganzen Hintergrund, um es zu verstopfen. Es gibt viele Erklärungen, was ein Eigenwert anderswo ist, und dieser Beitrag ist bereits sehr umfangreich.
Weizen-Assistent
1
Die Herausforderung wäre schöner gewesen, wenn Sie die Eingabe nicht auf symmetrische Matrizen beschränkt hätten.
Polfosol ఠ_ఠ
1
Ich wollte damit sagen, dass es auch langweilig ist, nur nach dem Vorzeichen von Eigenwerten zu suchen. Ich kenne verschiedene Geschmäcker;)
Polfosol ఠ_ఠ

Antworten:

11

C 108 Bytes

-1 Byte dank Logern
-3 Byte dank 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));}

Probieren Sie es online!

Führt eine Gaußsche Eliminierung durch und prüft, ob alle diagonalen Elemente positiv sind (Sylvester-Kriterium). Argument nist die Größe der Matrix minus eins.

nwellnhof
quelle
Vielleicht einen Charakter mit float statt double speichern?
Jens
Sie können ein anderes Zeichen rasieren, wenn Sie i=0in die for-Schleife fallen, den rekursiven Aufruf f(M,n-1,0)und den ersten Aufruf mit 0 als drittem Argument ausführen.
Jens
@Jens 1. Die Verwendung von Floats anstelle von Doubles kann schnell zu merklichen Rundungsfehlern führen, daher halte ich das gespeicherte Byte nicht für sinnvoll. 2. Das Initialisieren einer Variablen über ein zusätzliches Argument scheint mir ein Betrug zu sein.
Nwellnhof
@Logern Ich lehne es ab, den Trick "return statement weglassen" in meinen C-Antworten zu verwenden. Aber danke für das andere Byte gespeichert.
Nwellnhof
9

MATLAB / Octave , 19 17 12 Bytes

@(A)eig(A)>0

Probieren Sie es online!

Die Funktion eig liefert die Eigenwerte in aufsteigender Reihenfolge. Wenn also der erste Eigenwert größer als Null ist, sind es auch die anderen.

Daniel Turizo
quelle
Sie können die f=am Anfang löschen - anonyme Funktionen werden in der Regel als Antworten akzeptiert.
Delfad0r
Danke für den Tipp!
Daniel Turizo
Auch wenn es ein Vektor ist? Interessant
Daniel Turizo
1
+1. Ich habe einen Link hinzugefügt, über den ich es online ausprobieren kann. Ich hoffe es macht dir nichts aus. Beachten Sie, dass dies auch beweist, dass die Ausgabewerte, obwohl sie Arrays sind, als die korrekten "Wahrheits" - oder "Falsch" -Werte gemäß dem angegebenen Link @ Delfad0r gelten.
Tom Carpenter
2
Trotzdem scheitert es beim ersten "Falsey" -Testfall auf TIO. Ich vermute aufgrund eines Präzisionsproblems - einer der Eigen-Werte wird 8.9219e-17als 0 ausgegeben.
Tom Carpenter
7

Jelly , 11 bis 10 Bytes

ṖṖ€$ƬÆḊṂ>0

Verwendet das Kriterium von Sylvester .

Probieren Sie es online!

Wie es funktioniert

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

Haskell , 56 Bytes

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

Probieren Sie es online!

Grundsätzlich ein Hafen von Nwellnhofs Antwort . Führt eine Gauß-Eliminierung durch und prüft, ob die Elemente auf der Hauptdiagonale positiv sind.

Schlägt die erste Falsey-Ausgabe aufgrund von Rundungsfehlern fehl, würde aber theoretisch mit unendlicher Präzision funktionieren. Dank des Vorschlags von Curtis Bechtel sind nun alle Ausgaben korrekt.

Delfad0r
quelle
2
Sie können hinzufügen inputs :: [[[Rational]]], um richtige Antworten zu erhalten
Curtis Bechtel
4

Wolfram Language (Mathematica) , 20 Byte

0<Min@Eigenvalues@#&

Probieren Sie es online!

Mr. Xcoder
quelle
Sollte der 4. Testfall falsch sein?
Dienstag,
@tsh Behoben, ich bin doof!
Mr. Xcoder
8
Komisch , wie Mathematica dafür eine integrierte Funktion hat , aber der Name ist länger als Ihre Lösung.
Federico Poloni
@FedericoPoloni: Wäre eine Lösung mit NullSpace oder MatrixRank nicht noch kürzer? Wenn das Null-Leerzeichen Null ist, ist die Matrix positiv definit.
Phil H
@PhilH Nein, das funktioniert leider nicht von alleine. Zum Beispiel hat das zweite Falsey-Beispiel (Diagonalmatrix mit (1, -1,1)) Rang 3, ist aber nicht positiv bestimmt.
Federico Poloni
3

MATL , 4 Bytes

Yv0>

Probieren Sie es online!

[3 -2 2; -2 4 0; 2 0 2]010-18

Mr. Xcoder
quelle
1
@LuisMendo Danke, ich habe heute etwas Neues über MATL gelernt!
Mr. Xcoder
Es ist mir ein Vergnügen :-) Hier ist eine bessere Erklärung von Suever. Ich habe vergessen zu sagen, dass bei Arrays mit komplexen Werten nur der Realteil mit Null verglichen wird. So [1 2 3j]ist Falsey
Luis Mendo
2

Mathematica, 29 28 Bytes

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

Definition 2.

Shieru Asakoto
quelle
2

MATL , 6 Bytes

Es ist möglich, noch weniger Bytes zu verwenden, @Mr. Xcoder hat eine 5-Byte-MATL-Antwort gefunden !

YvX<0>

Erläuterung

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

Probieren Sie es online!

fehlerhaft
quelle
Scheitert am ersten falschen Testfall. Siehe meine gelöschte Antwort .
Mr. Xcoder
1
@ Mr.Xcoder Oh, du hast mir sogar eine Antwort vorgelegt. Ich denke, Sie sollten Ihre Antwort wiederherstellen, da es nur auf Rundungsfragen ankommt. (Ich denke, man kann davon ausgehen, dass die Antworten eine begrenzte Rechengenauigkeit haben. Ich denke, dass nur die CAS-Sprachen hier exakte Berechnungen verwenden.)
Fehler
Nach Ihrem Rat habe ich es wiederhergestellt .
Mr. Xcoder
1

Ahorn , 33 Bytes

(dh meine 2 Cent)

with(LinearAlgebra):
IsDefinite(A)
Polfosol ఠ_ఠ
quelle
Hallo und willkommen bei PPCG; Ich bin mit Maple nicht vertraut, aber ist der Zeilenumbruch notwendig?
Jonathan Frech
@ JonathanFrech Hallo und danke. Nein, ist es nicht. Ich habe es übrigens nicht gezählt.
Polfosol ఠ_ఠ
Für mich spiegelt Ihre aktuelle Byteanzahl das Zeilenumbruchszeichen wider.
Jonathan Frech
@ JonathanFrech Duh, mein schlechtes
Polfosol ol_ఠ 24.
1
Nun ... jetzt stimmen Ihr Code und Ihre Bytezahl nicht mehr überein.
Jonathan Frech
0

JavaScript (ES6),  99 95  88 Byte

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

Probieren Sie es online!

Arnauld
quelle