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)



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.


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.


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.


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.


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

4

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




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!


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)

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.