Risolutore lineare sparso per molti lati di destra


12

Devo risolvere lo stesso sistema lineare rado (da 300x300 a 1000x1000) con molti lati di destra (da 300 a 1000). Oltre a questo primo problema, vorrei anche risolvere sistemi diversi, ma con gli stessi elementi diversi da zero (solo valori diversi), ovvero molti sistemi sparsi con un modello di sparsità costante. Le mie matrici sono indefinite.

Le prestazioni della fattorizzazione e inizializzazione non sono importanti, ma lo è la fase di risoluzione. Attualmente sto prendendo in considerazione PaStiX o Umfpack e probabilmente giocherò con Petsc (che supporta entrambi i risolutori) Esistono librerie in grado di sfruttare le mie esigenze specifiche (vettorizzazione, multi-threading) o dovrei fare affidamento su solutori generali, e forse modificarli leggermente per le mie esigenze?

Cosa succede se la matrice sparsa è più grande, fino a ?106×106

Risposte:


10

Senza schierarmi dalla discussione sull'opportunità di utilizzare risolutori diretti o iterativi, voglio solo aggiungere due punti:

  1. Esistono metodi Krylov per sistemi con più lati di destra (chiamati metodi Krylov a blocchi ). Come bonus aggiuntivo, questi hanno spesso una convergenza più veloce rispetto ai metodi Krylov standard poiché lo spazio Krylov è costruito da una più ampia collezione di vettori. Vedi Dianne P. O'Leary, l'algoritmo del gradiente coniugato del blocco e metodi correlati . Algebra lineare e sue applicazioni 29 (1980), pagine 239-322. e Martin H. Gutknecht, Block Krylov metodi spaziali per sistemi lineari con più lati di destra: un'introduzione (2007).

  2. Se si hanno matrici diverse con lo stesso modello di sparsità, è possibile pre-calcolare una fattorizzazione simbolica per la prima matrice, che può essere riutilizzata nel calcolo della fattorizzazione numerica per questa e le matrici successive. (In UMFPACK, puoi farlo usando umfpack di symbolice passando il risultato a umfpack_di_numeric.)


9

O(N)


4
O(N2)O(N4/3)O(N4/3)N

3
O(N)O(N4/3)

2
105n<300k

3

Non sei abbastanza chiaro nella tua affermazione del problema quando parli di "gli stessi elementi diversi da zero (solo valori diversi)" Stai dicendo che la matrice ha un modello di sparsità costante ma i valori effettivi cambiano? Oppure stai dicendo che la matrice è in realtà costante?

PA=LUO(n2)

Per più lati di destra e sistemi di equazioni di queste dimensioni, i metodi iterativi in ​​genere non valgono la pena.

Tutti i pacchetti che hai citato offrono metodi di fattorizzazione diretta (sebbene PetSc sia noto soprattutto per i suoi risolutori iterativi). Tuttavia, i tuoi sistemi sono così piccoli che è improbabile che tu possa ottenere sostanziali accelerazioni parallele, in particolare in un ambiente di memoria distribuita.

Suggerirei di usare Umfpack per questo lavoro: PaStix e PetSc sono eccessivi.


Grazie per la tua risposta. Per chiarire: ho chiesto prima una singola matrice con molti lati di destra, e poi, un altro problema è una raccolta di matrici con la stessa sparsità patern ma i valori cambiano, ognuno di essi deve essere risolto per molti rh. Domanda sussidiaria: cosa succede se la matrice sparsa ora è 10 ^ 5x10 ^ 5 a 10 ^ 6x10 ^ 6?
nat chouf,

2
105

L'uso di un metodo iterativo per i tuoi sistemi più grandi con un solo lato destro potrebbe avere senso, in particolare se non hai bisogno di soluzioni molto precise e in particolare se riesci a trovare un precondizionatore efficace o i tuoi sistemi sono già ben condizionati. Tuttavia, se i tuoi sistemi sono mal condizionati, hai bisogno di soluzioni accurate e non riesci a trovare un buon precondizionatore, probabilmente starai comunque meglio con la fattorizzazione diretta.
Brian Borchers,

N106
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.