Mam PETSc Mat
i chciałbym oszacować jego numer stanu.
źródło
W przypadku małych macierzy liczbę warunków można wiarygodnie obliczyć przy użyciu rozkładu wartości w liczbie pojedynczej. Zrób KSPSolve()
z macierzą i biegnij z -pc_type svd -pc_svd_monitor
.
W przypadku większych macierzy można oszacować liczbę warunków za pomocą metody Kryłowa. Na przykład iteracja Arnoldi wykonywana przez GMRES oblicza przyrostowo rozkład Hessenberga. Ekstremalne wartości osobliwe i wartości własne macierzy Hessenberga są dobrym przybliżeniem tych pierwotnych. Aby w ten sposób oszacować wartości własne PETSc, uruchom
-ksp_monitor_singular_value -ksp_type gmres -ksp_gmres_restart 1000 -pc_type none
Opcje te mówią o oszacowaniu ekstremalnych wartości pojedynczych na każdej iteracji Kryłowa. GMRES służy do obliczania przestrzeni Kryłowa (możesz także użyć CG) z ogromnym restartem. Przy ponownym uruchomieniu GMRES odrzuca bieżącą przestrzeń Kryłowa, więc cały postęp w szacunkach liczby pojedynczej zostaje utracony po ponownym uruchomieniu. Ostatnia opcja -pc_type none
mówi o wykonaniu tej iteracji na nieprecyzyjnej matrycy. Domyślnie używany byłby operator kondycjonowany ( lub A P - 1 ), więc otrzymałeś oszacowanie dla operatora kondycjonowanego.
Będzie to ogólnie dokładne dla największych pojedynczych wartości, ale może przecenić najmniejszą pojedynczą wartość, chyba że metoda jest zbieżna. Jeśli masz solver dla macierzy (np. Używając KSPSolve()
), możesz oszacować najmniejszą pojedynczą wartość stosując tę samą procedurę, jaką zastosowano do A - 1 .
Użyj SLEPc, jeśli potrzebujesz dokładniejszych oszacowań najmniejszej liczby pojedynczej (i wszystkich innych problemów z wartością własną i wartością pojedynczą).