W twoim pytaniu jest wiele problemów.
Nie używaj eliminacji Gaussa (faktoryzacja LU), aby obliczyć liczbową pozycję macierzy. Faktoryzacja LU jest w tym celu zawodna w arytmetyki zmiennoprzecinkowej. Zamiast tego zastosuj rozkład QR ujawniający rangę (taki jak xGEQPX
lub xGEPQY
w LAPACK, gdzie x to C, D, S lub Z, chociaż te procedury są trudne do wyśledzenia; zobacz odpowiedź JedBrown na powiązane pytanie ) lub użyj SVD (rozkład wartości w liczbie pojedynczej, taki jak xGESDD
lub xGESVD
, gdzie x oznacza ponownie C, D, S lub Z). SVD jest bardziej dokładnym, niezawodnym algorytmem do określania rangi numerycznej, ale wymaga większej liczby operacji zmiennoprzecinkowych.
Jednak w przypadku rozwiązania układu liniowego faktoryzacja LU (z częściowym obrotem, co jest standardową implementacją w LAPACK) jest wyjątkowo niezawodna w praktyce. Istnieją pewne przypadki patologiczne, w których rozkład na czynniki pierwsze z częściowym przestawieniem jest niestabilny (patrz Wykład 22 w Numerycznej algebrze liniowej)Trefethen i Bau w celu uzyskania szczegółowych informacji). Faktoryzacja QR jest bardziej stabilnym algorytmem numerycznym do rozwiązywania układów liniowych i prawdopodobnie dlatego daje tak precyzyjne wyniki. Wymaga to jednak więcej operacji zmiennoprzecinkowych niż faktoryzacja LU o współczynnik 2 dla macierzy kwadratowych (wierzę; JackPoulson może mnie w tym poprawić). W przypadku systemów prostokątnych lepszym wyborem jest faktoryzacja QR, ponieważ pozwoli ona uzyskać rozwiązania najmniejszych kwadratów w przypadku przesadnie określonych systemów liniowych. SVD może być również stosowany do rozwiązywania układów liniowych, ale będzie droższy niż faktoryzacja QR.
janneb ma rację, że numpy.linalg.svd jest opakowaniem xGESDD
w LAPACK. Rozkłady poszczególnych wartości przebiegają w dwóch etapach. Po pierwsze, matryca, która ma zostać rozłożona, jest redukowana do postaci dwu- kątnej. Algorytmem zastosowanym w LAPACK jest redukcja do postaci dwukierunkowej, prawdopodobnie jest to algorytm Lawsona-Hansona-Chana, który w pewnym momencie wykorzystuje faktoryzację QR. Wykład 31 w Numerycznej algebrze liniowej autorstwa Trefethena i Baua zawiera przegląd tego procesu. Następnie xGESDD
używa algorytmu dziel i zwyciężaj, aby obliczyć wartości osobliwe oraz lewe i prawe wektory osobliwe na podstawie macierzy dwukierunkowej. Aby uzyskać informacje na temat tego kroku, musisz skonsultować obliczenia macierzowe Goluba i Van Loana lub stosowaną numeryczną algebrę liniową autorstwa Jima Demmela.
Wreszcie, nie należy mylić wartości pojedynczych z wartościami własnymi . Te dwa zestawy wielkości nie są takie same. SVD oblicza pojedyncze wartości macierzy. Obliczenia numeryczne Cleve Moler za pomocą MATLAB dają ładny przegląd różnic między wartościami osobliwymi a wartościami własnymi . Zasadniczo nie ma oczywistej zależności między wartościami osobliwymi danej macierzy a jej wartościami własnymi, z wyjątkiem macierzy normalnych , gdzie wartości osobliwe są wartością bezwzględną wartości własnych.
dgesdd
Lapacka w przypadku SVD o wartościach rzeczywistych. Tak więc twoje prawdziwe pytanie brzmi prawdopodobnie: „jak działa Lapack dgesdd?”, I to jest dość nie na temat przepełnienia stosu.