Próbuję diagonalizować niektóre gęste, źle uwarunkowane matryce. W precyzji maszynowej wyniki są niedokładne (zwracając ujemne wartości własne, wektory własne nie mają oczekiwanych symetrii). Przełączyłem się na funkcję Eigensystem [] Mathematiki, aby skorzystać z dowolnej precyzji, ale obliczenia są bardzo wolne. Jestem otwarty na dowolną liczbę rozwiązań. Czy istnieją pakiety / algorytmy, które dobrze nadają się do źle uwarunkowanych problemów? Nie jestem ekspertem w zakresie przygotowywania, więc nie jestem pewien, jak bardzo to może pomóc. W przeciwnym razie wszystko, co mogę wymyślić, to równoległe rozwiązania o dowolnej wartości własnej, ale nie znam niczego poza Mathematica, MATLAB i C ++.
Aby przedstawić tło problemu, matryce są duże, ale nie ogromne (maksymalnie 4096 x 4096 do 32768 x 32768). Są rzeczywiste, symetryczne, a wartości własne są ograniczone od 0 do 1 (wyłączne), przy czym wiele wartości własnych jest bardzo bliskich zeru i żaden nie jest zbliżony do 1. Macierz jest zasadniczo operatorem splotu. Nie potrzebuję przekątnej wszystkich moich matryc, ale im większy mogę przejść, tym lepiej. Mam dostęp do klastrów obliczeniowych z wieloma procesorami i możliwościami przetwarzania rozproszonego.
Dziękuję Ci
Odpowiedzi:
Oblicz SVD zamiast rozkładu widmowego. Wyniki są takie same w przypadku dokładnej arytmetyki, ponieważ macierz jest symetryczna, dodatnia, ale w przypadku arytmetyki o skończonej precyzji otrzymacie małe wartości własne z dużo większą dokładnością.
Edycja: Patrz Demmel i Kahan, Dokładne wartości osobliwe macierzy dwudzielnych, SIAM J. Sci. Stat. Comput. 11 (1990) 873–912.
ftp://netlib2.cs.utk.edu/lapack/lawnspdf/lawn03.pdf
Edytuj2; Zauważ, że żadna metoda nie będzie w stanie rozwiązać wartości własnych mniejszych niż normalna razy dokładność zastosowanej maszyny, ponieważ zmiana pojedynczego wpisu o jedno ulp może już tak bardzo zmienić małą wartość własną. Zatem uzyskanie zerowych wartości własnych w miejsce bardzo małych jest właściwe i żadna metoda (oprócz pracy z większą precyzją) nie rozplątuje odpowiadających sobie wektorów własnych, a jedynie zwraca podstawę dla wspólnej numerycznej przestrzeni zerowej.
źródło
Dziękuję za tę sugestię. Wypróbowałem polecenie SVD Mathematiki, ale nie dostrzegam zauważalnej poprawy (wciąż brakuje odpowiednich symetrii, „wartości własne” są niepoprawnie zerowe, gdy wcześniej nieprawidłowo wychodziły ujemne). Może potrzebowałbym zaimplementować jeden z opisanych powyżej algorytmów zamiast wbudowanej funkcji? Prawdopodobnie chciałbym uniknąć kłopotów z użyciem takiej metody, chyba że z góry wiedziałem, że przyniesie to znaczną poprawę.
@JackPoulson, przejrzałem artykuł na temat metody Jacobiego, do której się odwoływałeś, i wygląda to obiecująco. Czy ty lub ktokolwiek może polecić dobry sposób na wdrożenie metody Jacobiego w poszukiwaniu eigensystemów? Zgaduję, że gdybym sam to kodował (w MATLAB), byłoby to bardzo wolne.
źródło