/ / Determina se il determinante è esattamente zero - python, matematica, numpy, algebra lineare

Determina se il determinante è esattamente zero - python, matematica, numpy, algebra lineare

Ho un sacco di matrici da 10 a 10 (0,1) e vorrei determinare quali hanno esattamente il determinante 0 (cioè che sono singolari). utilizzando scipy.linalg.det Ricevo un numero in virgola mobile che devo testare per vedere se è vicino a zero. È possibile fare il calcolo esattamente così posso essere sicuro di non trovare falsi positivi?

D'altra parte, forse c'è qualche garanzia sul più piccolo autovalore che può essere usato per assicurarsi che il metodo a virgola mobile non abbia mai un falso positivo?

risposte:

3 per risposta № 1

Finché utilizzi i float, non puoi garantire che otterrai esattamente zero. Lo userei:

scipy.allclose(det, 0)

Puoi controllare la tolleranza con i kwargs.


Nel tuo caso (matrici 10x10 con 0,1 elementi) non dovresti preoccuparti dei falsi positivi.

Non ho una prova per questo, ma è giustointuizione geometrica: il gruppo di 10 vettori con elementi 0/1 non può essere "quasi" linearmente dipendente dal modo in cui sarebbe necessario ottenere un falso positivo usando i float. Come vettori le loro "direzioni" sono necessariamente discreti / atomici se gli elementi sono in 0,1.

Pensa al caso 3D e generalizza i tuoi pensieri allo spazio 10-dimensionale;)


3 per risposta № 2

Puoi usare l'eliminazione gaussiana per portare ilmatrice a una forma triangolare. Dal momento che i tuoi elementi sono tutti 0 o 1, il calcolo anche usando l'aritmetica in virgola mobile sarà esatto (stai solo moltiplicando / dividendo / aggiungendo / sottraendo per -1, 0 e 1, che è esatto).

Il determinante è quindi 0 se un elemento della diagonale è zero e diverso da zero.

Quindi per questo algoritmo specifico (eliminazione gaussiana), il calcolo del determinante sarà esatto anche in aritmetica in virgola mobile.

Anche questo algoritmo dovrebbe essere abbastanza efficiente. Può anche essere implementato usando interi, che è più veloce e mostra anche in un modo più ovvio che il problema è esattamente risolvibile.

MODIFICARE: il punto è che un algoritmo che opera sulla matrice 0,1 può essere esatto. Dipende dall'algoritmo. Vorrei verificare come è implementato det () e forse, non c'è problema con il rumore numerico, e, in effetti, potresti semplicemente provare per det (M) == 0.0 e non ottenere né falsi negativi né falsi positivi.


1 per risposta № 3

Penso che dovresti considerare di esaminare il numero di condizione piuttosto che il determinante. In pitone che vorresti

numpy.linalg.cond(x, p=None)

Riferimento http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.cond.html.

Questo era il consiglio del professore di matematica applicata al corso di coursera sull'informatica scientifica. Essenzialmente il numero di condizione ti darà la migliore indicazione di instabilità numerica per operazioni come l'inversione di una matrice ecc., Che è probabilmente ciò che ti interessa. Vedi questa risposta su scicomp stackexchange per tutti i dettagli.


0 per risposta № 4

per quanto riguarda i lotti di prova mentre si gioca con la tolleranza arg, quindi decidere sulla tolleranza massima accettabile, risciacquare e ripetere: http://docs.scipy.org/doc/numpy/reference/generated/numpy.allclose.html


0 per risposta № 5

Poiché le voci nelle matrici sono 1 o 0, il più piccolo valore assoluto non zero di un determinante è 1. Quindi non c'è bisogno di temere un vero valore diverso da zero che sia molto vicino a 0.

In alternativa si può apparentemente usare sympy per ottenere una risposta esatta.