Ci sono una serie di problemi nella tua domanda.
Non utilizzare l'eliminazione gaussiana (fattorizzazione LU) per calcolare il rango numerico di una matrice. La fattorizzazione LU non è affidabile per questo scopo nell'aritmetica in virgola mobile. Invece, usa una decomposizione QR rivelatrice di rango (come xGEQPX
o xGEPQY
in LAPACK, dove x è C, D, S o Z, anche se quelle routine sono difficili da rintracciare; vedi la risposta di JedBrown su una domanda correlata ) o usa un SVD (decomposizione del valore singolare, come xGESDD
o xGESVD
, dove x è di nuovo C, D, S o Z). SVD è un algoritmo più preciso e affidabile per la determinazione del rango numerico, ma richiede più operazioni in virgola mobile.
Tuttavia, per risolvere un sistema lineare, la fattorizzazione LU (con pivot parziale, che è l'implementazione standard in LAPACK) è estremamente affidabile nella pratica. Ci sono alcuni casi patologici per i quali la fattorizzazione LU con pivot parziale è instabile (vedi lezione 22 in Algebra lineare numericadi Trefethen e Bau per i dettagli). La fattorizzazione QR è un algoritmo numerico più stabile per risolvere i sistemi lineari, motivo per cui ti dà risultati così precisi. Tuttavia, richiede più operazioni in virgola mobile rispetto alla fattorizzazione LU di un fattore 2 per le matrici quadrate (credo; JackPoulson potrebbe correggermi su questo). Per i sistemi rettangolari, la fattorizzazione QR è una scelta migliore perché produrrà soluzioni dei minimi quadrati a sistemi lineari non determinati. SVD può anche essere usato per risolvere sistemi lineari, ma sarà più costoso della fattorizzazione QR.
janneb ha ragione che numpy.linalg.svd è un wrapper xGESDD
in LAPACK. Le scomposizioni di valori singolari procedono in due fasi. Innanzitutto, la matrice da scomporre viene ridotta in forma bidiagonale. L'algoritmo utilizzato per ridurre in forma bidiagonale in LAPACK è probabilmente l'algoritmo Lawson-Hanson-Chan, e utilizza la fattorizzazione QR in un punto. La lezione 31 in Algebra lineare numerica di Trefethen e Bau offre una panoramica di questo processo. Quindi, xGESDD
utilizza un algoritmo di divisione e conquista per calcolare i valori singolari e i vettori singolari sinistro e destro dalla matrice bidiagonale. Per ottenere informazioni su questo passaggio, è necessario consultare Matrix Computations di Golub e Van Loan, o Applied Numerical Linear Algebra di Jim Demmel.
Infine, non dovresti confondere i valori singolari con gli autovalori . Queste due serie di quantità non sono uguali. SVD calcola i valori singolari di una matrice. Il calcolo numerico di Cleve Moler con MATLAB offre una buona panoramica delle differenze tra valori singolari ed autovalori . In generale, non esiste una relazione evidente tra i valori singolari di una data matrice e i suoi autovalori, tranne nel caso di matrici normali , dove i valori singolari sono il valore assoluto degli autovalori.
dgesdd
per SVD con valori reali. Quindi la tua vera domanda è probabilmente "come funziona Lapack dgesdd?", Ed è piuttosto fuori tema per StackOverflow.