La matrice est-elle positive-définie?


19

introduction

Aujourd'hui, nous allons nous occuper du fléau des étudiants en première année d'algèbre linéaire: la précision de la matrice! Apparemment, cela n'a pas encore de défi, alors c'est parti:

Contribution

  • Une matrice symétrique dans n'importe quel format pratique (vous pouvez bien sûr également ne prendre que la partie supérieure ou inférieure de la matrice)n×n A
  • Facultativement: la taille de la matricen

Que faire?

Le défi est simple: étant donné une matrice à valeur réelle matrice décide si elle est définie positive en émettant une valeur véridique dans l'affirmative et une valeur de Falsey dans le cas contraire.n×n

Vous pouvez supposer que vos éléments intégrés fonctionnent réellement avec précision et ne doivent donc pas prendre en compte les problèmes numériques qui pourraient conduire à un comportement incorrect si la stratégie / le code "de manière prouvable" devait donner le résultat correct.

Qui gagne?

C'est le , donc le code le plus court en octets (par langue) gagne!


Qu'est-ce qu'une matrice positive définie de toute façon?

Il existe apparemment 6 formulations équivalentes lorsqu'une matrice symétrique est définie positivement. Je vais reproduire les trois plus faciles et vous référer à Wikipedia pour les plus complexes.

  • Si alors est défini positif. Cela peut être reformulé comme suit: Si pour chaque vecteur non nul, le produit scalaire (standard) de et est positif, alors est défini positif.vRn{0}:vTAv>0UNE

    vvUNEvUNE
  • Soit les valeurs propres de , si maintenant (c'est tout les valeurs propres sont positives) alors est défini de façon positive. Si vous ne savez pas quelles sont les valeurs propres, je vous suggère d'utiliser votre moteur de recherche préféré pour le découvrir, car l'explication (et les stratégies de calcul nécessaires) est trop longue pour être contenue dans cet article.λjeje{1,,n}A i { 1 , , n } : λ i > 0 AUNEje{1,,n}:λje>0UNE
  • Si la décomposition de Cholesky de existe, c'est-à-dire qu'il existe une matrice triangulaire inférieure telle que alors est défini positif. Notez que cela équivaut à un retour précoce "faux" si à tout moment le calcul de la racine pendant l'algorithme échoue en raison d'un argument négatif.UNELLLT=UNEUNE

Exemples

Pour une sortie fidèle

(100010001)

(1000020000300004)

(52-121-1-1-13)

(1-22-2502030)

(7.152,452,459.37)

Pour sortie falsey

(au moins une valeur propre est 0 / semi-définie positive)

(3-22-240202)

(les valeurs propres ont des signes différents / indéfinis)

(1000-10001)

(toutes les valeurs propres inférieures à 0 / définie négative)

(-1000-1000-1)

(toutes valeurs propres inférieures à 0 / définies négatives)

(-2303-5000-1)

(toutes les valeurs propres inférieures à 0 / définies négatives)

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

(trois valeurs propres positives, une négative / indéfinie)

(7.152,451,233,52,459.372,713.141,232,7106.23,53.146.20,56)



Vous devez fournir une meilleure définition de ce que nous sommes censés rechercher plutôt que de supposer que nous pouvons tous lire la notation mathématique (ou tous savoir ce qu'est une "valeur propre"). Un exemple concret serait également utile.
Shaggy

9
@Shaggy Je pense que le défi est meilleur sans tout le fond pour le boucher. Il existe de nombreuses explications existantes sur ce qu'est une valeur propre ailleurs, et ce message est déjà très volumineux.
Wheat Wizard

1
Le défi aurait été plus agréable si vous n'aviez pas limité l'entrée aux matrices symétriques .
polfosol ఠ_ఠ

1
Je voulais juste dire que vérifier le signe des valeurs propres est également ennuyeux. Différents goûts que je connais;)
polfosol ఠ_ఠ

Réponses:


11

C, 108 octets

-1 octet grâce à Logern
-3 octets grâce à plafondcat

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

Essayez-le en ligne!

Effectue l'élimination gaussienne et vérifie si tous les éléments diagonaux sont positifs (critère de Sylvester). L'argument nest la taille de la matrice moins un.


Peut-être enregistrer un personnage avec float au lieu de double?
Jens


Vous pouvez raser un autre caractère si vous déposez i=0dans la boucle for, effectuez l'appel récursif f(M,n-1,0)et l'appel initial avec 0 comme troisième argument.
Jens

@Jens 1. L'utilisation de flottants au lieu de doubles peut rapidement entraîner des erreurs d'arrondi notables, donc je ne pense pas que le seul octet enregistré en vaille la peine. 2. L'initialisation d'une variable via un argument supplémentaire ressemble à de la triche pour moi.
nwellnhof

@Logern Je refuse d'utiliser l'astuce "omettre la déclaration de retour" dans mes réponses C. Mais merci pour l'autre octet enregistré.
nwellnhof

9

MATLAB / Octave , 19 17 12 octets

@(A)eig(A)>0

Essayez-le en ligne!

La fonction eig fournit les valeurs propres par ordre croissant, donc si la première valeur propre est supérieure à zéro, les autres le sont aussi.


Vous pouvez supprimer le f=au début - les fonctions anonymes sont généralement acceptées comme réponses.
Delfad0r

Merci pour le conseil!
Daniel Turizo

Même si c'est un vecteur? Intéressant
Daniel Turizo

1
+1. J'ai ajouté un lien pour l'essayer en ligne. J'espère que cela ne vous dérange pas. Notez que cela prouve également que les valeurs de sortie, bien qu'elles soient des tableaux, comptent comme les valeurs "véridiques" ou "falsey" correctes selon le lien @ Delfad0r publié.
Tom Carpenter

2
Cela dit, il échoue pour le premier cas de test "falsey" sur TIO. Je suppose qu'en raison d'un problème de précision - l'une des valeurs propres sort 8.9219e-17plutôt que 0.
Tom Carpenter

7

Gelée , 11 10 octets

ṖṖ€$ƬÆḊṂ>0

Utilise le critère de Sylvester .

Essayez-le en ligne!

Comment ça fonctionne

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

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

Essayez-le en ligne!

Fondamentalement, un port de réponse de nwellnhof . Effectue l'élimination gaussienne et vérifie si les éléments de la diagonale principale sont positifs.

Échoue la première sortie de falsey en raison d'erreurs d'arrondi, mais cela fonctionnerait théoriquement avec une précision infinie. Grâce à la suggestion de Curtis Bechtel , maintenant les sorties sont toutes correctes.


2
vous pouvez ajouter inputs :: [[[Rational]]]pour obtenir des réponses correctes
Curtis Bechtel

4

Wolfram Language (Mathematica) , 20 octets

0<Min@Eigenvalues@#&

Essayez-le en ligne!


Le 4ème cas de test doit-il être faux?
tsh

@tsh Fixed, je suis stupide!
M. Xcoder,

8
C'est amusant de voir comment Mathematica a une fonction intégrée pour cela , mais son nom est plus long que votre solution.
Federico Poloni

@FedericoPoloni: Une solution utilisant NullSpace ou MatrixRank ne serait-elle pas encore plus courte? Si l'espace nul est nul, la matrice est définie positive.
Phil H

@PhilH Non, j'ai bien peur que ça ne marche pas tout seul. Par exemple, le deuxième exemple de falsey (matrice diagonale avec (1, -1,1)) a le rang 3, mais n'est pas défini positif.
Federico Poloni




2

MATL , 6 octets

Il est possible de le faire en utilisant encore moins d'octets, @Mr. Xcoder a réussi à trouver une réponse MATL de 5 octets !

YvX<0>

Explication

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

Essayez-le en ligne!


Échoue sur le premier cas de test de falsification. Voir ma réponse supprimée .
M. Xcoder,

1
@ Mr.Xcoder Oh, vous avez même soumis une réponse avant moi. Je pense que vous devriez annuler la suppression de votre réponse car elle dépend simplement des problèmes d'arrondi. (Je pense que vous pouvez vous attendre à ce que les réponses utilisent une arithmétique de précision limitée - je pense que seuls les langages CAS utilisent des calculs exacts.)
flawr

Suite à vos conseils, je l'ai restitué .
M. Xcoder

1

Érable , 33 octets

(c'est-à-dire mes 2 cents)

with(LinearAlgebra):
IsDefinite(A)

Bonjour et bienvenue chez PPCG; Je ne connais pas Maple, mais la nouvelle ligne est-elle nécessaire?
Jonathan Frech

@JonathanFrech Bonjour et merci. Non ce n'est pas. Je ne l'ai pas compté btw.
polfosol ఠ_ఠ

Pour moi, votre nombre d'octets actuel semble refléter le caractère de nouvelle ligne.
Jonathan Frech

@JonathanFrech Duh, my bad
polfosol ఠ_ఠ

1
Eh bien ... maintenant votre code et votre nombre d'octets ne sont pas d'accord.
Jonathan Frech

0

JavaScript (ES6),  99 95  88 octets

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

Essayez-le en ligne!

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.