Risposte:
Per matrici piccole, il numero di condizione può essere calcolato in modo affidabile utilizzando la decomposizione del valore singolare. Fai un KSPSolve()
con la matrice e corri con -pc_type svd -pc_svd_monitor
.
Per matrici più grandi, è possibile stimare il numero della condizione utilizzando un metodo Krylov. Ad esempio, l'iterazione di Arnoldi eseguita da GMRES calcola in modo incrementale una decomposizione di Hessenberg. I valori singolari e gli autovalori estremi della matrice di Hessenberg sono buone approssimazioni a quelli della matrice originale. Per avere gli autovalori di stima PETSc in questo modo, eseguire con
-ksp_monitor_singular_value -ksp_type gmres -ksp_gmres_restart 1000 -pc_type none
Queste opzioni dicono di stimare i valori singolari estremi su ogni iterazione di Krylov. GMRES è usato per calcolare lo spazio di Krylov (potresti anche usare CG) con un grande riavvio. Al riavvio, GMRES scarta l'attuale spazio di Krylov, quindi tutti i progressi nelle stime di valori singolari vengono persi in un riavvio. L'ultima opzione -pc_type none
dice di eseguire questa iterazione sulla matrice non condizionata. Per impostazione predefinita, verrebbe utilizzato l'operatore precondizionato ( o ), quindi si otterrebbe una stima per l'operatore precondizionato.
Questo sarà generalmente accurato per i valori singolari più grandi, ma può sopravvalutare il valore singolare più piccolo a meno che il metodo non sia convergente. Se si dispone di un solutore per la matrice (ad es. Utilizzando KSPSolve()
), è possibile stimare il valore singolare più piccolo di utilizzando la stessa procedura applicata ad .
Utilizzare SLEPc se sono necessarie stime più accurate del valore singolare più piccolo (e per tutti gli altri problemi di autovalore e valore singolare).