La matrice è definita positiva?


19

introduzione

Oggi ci occuperemo della rovina degli studenti di algebra lineare del primo anno: la precisione della matrice! Apparentemente questo non ha ancora una sfida, quindi eccoci qui:

Ingresso

  • A n×n simmetrica Matrice A in qualsiasi formato conveniente (puoi anche prendere solo la parte superiore o inferiore della matrice)
  • Opzionalmente: la dimensione della matrice n

Cosa fare?

La sfida è semplice: data una matrice con valore reale n×n matrice decide se è definita positiva emettendo un valore di verità in caso affermativo e un valore di falsità in caso contrario.

Potresti presumere che i tuoi built-in funzionino effettivamente in modo preciso e quindi non debbano tenere conto di problemi numerici che potrebbero portare a comportamenti errati se la strategia / il codice "dimostrabilmente" dovesse produrre il risultato corretto.

Chi vince?

Questo è , quindi vince il codice più breve in byte (per lingua)!


Che cos'è comunque una matrice definita positiva?

Apparentemente ci sono 6 formulazioni equivalenti di quando una matrice simmetrica è definita positiva. Riprodurrò i tre più facili e ti farò riferimento a Wikipedia per quelli più complessi.

  • Se vRn{0}:vTAv>0 allora A è definito positivo.
    Questo può essere riformulato come:
    Se per ogni vettore diverso da zero v il prodotto punto (standard) di v e Av è positivo, allora A è definito positivo.
  • Lascia che λii{1,,n} sono gliautovaloridiA , se orai{1,,n}:λi>0 (ovvero tutti gli autovalori sono positivi), alloraA è definito positivo.
    Se non sai quali sono gli autovalori, ti suggerisco di utilizzare il tuo motore di ricerca preferito per scoprirlo, perché la spiegazione (e le strategie di calcolo necessarie) è troppo lunga per essere contenuta in questo post.
  • Se esiste la decomposizione di Cholesky di A , cioè esiste una matrice L triangolare inferiore tale che LLT=A allora A è definita positiva. Si noti che questo equivale a "false" di ritorno anticipato se in qualsiasi momento il calcolo della radice durante l'algoritmo fallisce a causa di un argomento negativo.

Esempi

Per risultati veritieri

(100010001)

(1000020000300004)

(521211113)

(1222502030)

(7.152.452.459.37)

Per output falso

(almeno un autovalore è 0 / semi-definito positivo)

(322240202)

(gli autovalori hanno segni diversi / indefiniti)

(100010001)

(tutti gli autovalori inferiori a 0 / negativo definito)

(100010001)

(tutti gli autovalori inferiori a 0 / negativo definito)

(230350001)

(tutti gli autovalori inferiori a 0 / negativi definiti)

(7.152.452.459.37)

(tre autovalori positivi, uno negativo / indefinito)

(7.152.451.233.52.459.372.713.141.232.7106.23.53.146.20.56)



Devi fornire una migliore definizione di ciò che dovremmo cercare piuttosto che assumere che tutti possiamo leggere la notazione matematica (o tutti sanno cos'è un "autovalore"). Sarebbe utile anche un esempio funzionante.
Shaggy,

9
@Shaggy Penso che la sfida sia migliore senza tutto lo sfondo per intasarla. Ci sono molte spiegazioni esistenti su cosa sia un autovalore altrove e questo post è già molto ampio.
Mago del grano,

1
La sfida sarebbe stata migliore se non avessi limitato l'input a matrici simmetriche .
polfosol ఠ_ఠ

1
Volevo dire anche solo il controllo del segno di autovalori è noioso. Diversi gusti che conosco;)
polfosol ఠ_ఠ

Risposte:


11

C, 108 byte

-1 byte grazie a Logern
-3 byte grazie a 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));}

Provalo online!

Esegue l'eliminazione gaussiana e verifica se tutti gli elementi diagonali sono positivi (criterio di Sylvester). L'argomento nè la dimensione della matrice meno una.


Forse salvare un personaggio con float anziché doppio?
Jens,


È possibile radere un altro carattere se si rilascia i=0nel ciclo for, si effettua la chiamata ricorsiva f(M,n-1,0)e la chiamata iniziale con 0 come terzo argomento.
Jens,

@Jens 1. L'uso di float anziché doppi può portare rapidamente a evidenti errori di arrotondamento, quindi non credo che ne valga la pena un byte salvato. 2. L'inizializzazione di una variabile tramite un argomento aggiuntivo mi sembra tradire.
nwellnhof,

@Logern Mi rifiuto di usare il trucco "ometti la dichiarazione di ritorno" nelle mie risposte C. Ma grazie per l'altro byte salvato.
nwellnhof,

9

MATLAB / Octave , 19 17 12 byte

@(A)eig(A)>0

Provalo online!

La funzione eig fornisce gli autovalori in ordine crescente, quindi se il primo autovalore è maggiore di zero, lo sono anche gli altri.


Puoi rilasciare f=all'inizio - le funzioni anonime sono generalmente accettate come risposte.
Delfad0r

Grazie per il consiglio!
Daniel Turizo,

Anche se è un vettore? Interessante
Daniel Turizo,

1
+1. Ho aggiunto un link per provarlo online. Spero non ti dispiaccia. Si noti che sta anche dimostrando che i valori di output nonostante siano array contano come i valori "verità" o "falsità" corretti secondo il link @ Delfad0r pubblicato.
Tom Carpenter,

2
Detto questo, non riesce per il primo caso di test "falso" su TIO. Sto indovinando a causa di un problema di precisione - uno dei valori di Eigen viene emesso 8.9219e-17invece di 0.
Tom Carpenter,

7

Gelatina , 11 10 byte

ṖṖ€$ƬÆḊṂ>0

Usa il criterio di Sylvester .

Provalo online!

Come funziona

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

Provalo online!

Fondamentalmente un porto di risposta nwellnhof . Esegue l'eliminazione gaussiana e controlla se gli elementi sulla diagonale principale sono positivi.

Non riesce il primo output falso a causa di errori di arrotondamento, ma teoricamente funzionerebbe con precisione infinita. Grazie al suggerimento di Curtis Bechtel , ora le uscite sono tutte corrette.


2
puoi aggiungere inputs :: [[[Rational]]]per ottenere risposte corrette
Curtis Bechtel,

4

Wolfram Language (Mathematica) , 20 byte

0<Min@Eigenvalues@#&

Provalo online!


Il quarto caso di test dovrebbe essere falso?
martedì

@tsh Risolto, sono stupido!
Mr. Xcoder,

8
Divertente come Mathematica abbia una soluzione per questo , ma il suo nome è più lungo della tua soluzione.
Federico Poloni,

@FedericoPoloni: una soluzione che utilizza NullSpace o MatrixRank non sarebbe nemmeno più breve? Se lo spazio Null è zero, la matrice è definita positiva.
Phil H,

@PhilH No, temo che non funzioni da solo. Ad esempio, il secondo esempio di falso (matrice diagonale con (1, -1,1)) ha rango 3, ma non è definito positivo.
Federico Poloni,




2

MATL , 6 byte

È possibile farlo utilizzando anche meno byte, @Mr. Xcoder è riuscito a trovare una risposta MATL a 5 byte !

YvX<0>

Spiegazione

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

Provalo online!


Non riesce sul primo caso di test errato. Vedi la mia risposta eliminata .
Mr. Xcoder,

1
@ Mr.Xcoder Oh, hai persino inviato una risposta prima di me. Penso che dovresti ripristinare la tua risposta in quanto dipende solo da problemi di arrotondamento. (Penso che puoi aspettarti che le risposte usino un'aritmetica di precisione limitata - Penso che solo i linguaggi CAS qui usino calcoli esatti.)
Flawr

Seguendo il tuo consiglio, l'ho cancellato .
Mr. Xcoder,

1

acero , 33 byte

(cioè i miei 2 centesimi)

with(LinearAlgebra):
IsDefinite(A)

Ciao e benvenuto in PPCG; Non ho familiarità con Maple, anche se la newline è necessaria?
Jonathan Frech,

@JonathanFrech Ciao e grazie. No non lo è. Non l'ho contato a proposito.
polfosol ఠ_ఠ

Per me il tuo conteggio attuale di byte sembra riflettere il carattere di nuova riga.
Jonathan Frech,

@JonathanFrech Duh, my bad
polfosol ఠ_ఠ

1
Bene ... ora il tuo codice e il conteggio dei byte non sono d'accordo.
Jonathan Frech,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.