Come scegliere un metodo per risolvere equazioni lineari


31

Per quanto ne so, ci sono 4 modi per risolvere un sistema di equazioni lineari (correggimi se ci sono più):

  1. Se la matrice di sistema è una matrice quadrata a pieno titolo, è possibile utilizzare la regola di Cramer;
  2. Calcola l'inverso o lo pseudoinverso della matrice del sistema;
  3. Utilizzare metodi di decomposizione matriciali (l'eliminazione di Gaussian o Gauss-Jordan è considerata come decomposizione LU);
  4. Utilizzare metodi iterativi, come il metodo del gradiente coniugato.

In realtà, non vuoi quasi mai risolvere le equazioni usando la regola di Cramer o calcolando l'inverso o lo pseudoinverso, specialmente per le matrici ad alta dimensione, quindi la prima domanda è quando usare i metodi di decomposizione e metodi iterativi, rispettivamente. Immagino che dipenda dalle dimensioni e dalle proprietà della matrice di sistema.

La seconda domanda è, a tua conoscenza, quale tipo di metodi di decomposizione o metodi iterativi sono più adatti per una certa matrice di sistema in termini di stabilità numerica ed efficienza.

Ad esempio, il metodo del gradiente coniugato viene utilizzato per risolvere equazioni in cui la matrice è simmetrica e definita positiva, sebbene possa anche essere applicata a qualsiasi equazione lineare convertendo Ax=b in ATAx=ATb . Anche per una matrice definita positiva, è possibile utilizzare il metodo di decomposizione di Cholesky per cercare la soluzione. Ma non so quando scegliere il metodo CG e quando scegliere la decomposizione di Cholesky. La mia sensazione è che dovremmo usare il metodo CG per matrici di grandi dimensioni.

Per le matrici rettangolari, possiamo usare la decomposizione QR o SVD, ma ancora una volta non so come sceglierne una.

Per le altre matrici, ora non so come scegliere il risolutore appropriato, come matrici eremitiche / simmetriche, matrici sparse, matrici di bande ecc.


1
Ciao @chaohuang, e benvenuto su SciComp! Potresti voler vedere questa discussione: scicomp.stackexchange.com/questions/81/…
Paul

Ciao @Paul, grazie per i tuoi commenti, quella discussione riguarda solo matrici sparse o qualche matrice?
Chaohuang,

6
La tua domanda ha una portata enorme e potrebbe essere un po 'troppo ampia per il formato di domande e risposte che abbiamo qui sullo stackexchange ... c'è una particolare classe di sistemi a matrice che ti interessano?
Paolo

3
@chaohuang Ci sono numerosi libri su questo argomento. Questa domanda è un po 'come chiedere a un medico come scelgono i trattamenti "in generale". Se vuoi porre una domanda che non è specifica per una determinata classe di problemi, dovresti metterti al lavoro per familiarizzare abbastanza con il campo da porre qualcosa di preciso. Altrimenti, spiega il problema specifico che ti interessa.
Jed Brown,

2
Dalle FAQ: se riesci a immaginare un intero libro che risponda alla tua domanda, stai chiedendo troppo. Ci sono intere riviste e centinaia di libri, associati a questa domanda.
David Ketcheson,

Risposte:


45

La tua domanda è un po 'come chiedere quale cacciavite scegliere in base all'unità (slot, Phillips, Torx, ...): Oltre a esserne troppi , la scelta dipende anche dal fatto che tu voglia semplicemente stringere una vite o assemblare un tutta una serie di scaffali per biblioteche. Tuttavia, in risposta parziale alla tua domanda, ecco alcuni dei problemi che dovresti tenere a mente quando scegli un metodo per risolvere il sistema lineare . Mi limiterò anche alle matrici invertibili; i casi di sistemi sovra o indeterminati sono una questione diversa e dovrebbero in realtà essere domande separate.Ax=b

Ax~

  1. x~x~x~x<103x
  2. Quanto velocemente ne hai bisogno? L'unica metrica pertinente qui è il tempo di clock sulla tua macchina - un metodo che si adatta perfettamente su un enorme cluster potrebbe non essere la scelta migliore se non ne hai una, ma hai una di quelle nuove splendide carte Tesla.

Dato che non esiste un pranzo libero, di solito devi decidere un compromesso tra i due. Successivamente, inizi a guardare la matrice (e il tuo hardware) per decidere un buon metodo (o meglio, il metodo per il quale puoi trovare una buona implementazione). (Nota come ho evitato di scrivere "migliore" qui ...) Le proprietà più rilevanti qui sonoA

  • La struttura : è simmetrico? È denso o scarno? Banded?A
  • Gli autovalori : sono tutti positivi (ovvero, è positivo definito)? Sono raggruppati? Alcuni hanno una grandezza molto piccola o molto grande?A

Con questo in mente, devi quindi cercare la (enorme) letteratura e valutare i diversi metodi che trovi per il tuo problema specifico. Ecco alcune osservazioni generali:

  • Se hai davvero bisogno (quasi) di precisione della macchina per la tua soluzione, o se la tua matrice è piccola (diciamo, fino a righe), è difficile battere i metodi diretti, specialmente per i sistemi densi (poiché in questo caso, ogni moltiplicazione della matrice sarà e se hai bisogno di molte iterazioni, questo potrebbe non essere lontano da bisogno un metodo diretto). Inoltre, la decomposizione LU (con rotazione) funziona per qualsiasi matrice invertibile, al contrario della maggior parte dei metodi iterativi. (Naturalmente, se è simmetrico e definito positivo, useresti Cholesky.)1000O(n2)O(n3)A

    Questo vale anche per le matrici sparse (di grandi dimensioni) se non si verificano problemi di memoria: le matrici sparse in generale non hanno una decomposizione LU sparsa e se i fattori non si adattano alla memoria (veloce), questi metodi diventano inutilizzabili.

    Inoltre, metodi diretti sono stati intorno per un lungo tempo, ed esiste software molto alta qualità (per esempio, UMFPACK, MUMPS, SuperLU per matrici sparse) che possono sfruttare automaticamente la struttura a bande di .A

  • Se hai bisogno di meno accuratezza o non puoi usare metodi diretti, scegli un metodo Krylov (es. CG se è definito simmetrico positivo, GMRES o BiCGStab in caso contrario) invece di un metodo stazionario (come Jacobi o Gauss-Seidel): questi di solito funzionano molto meglio, poiché la loro convergenza non è determinata dal raggio spettrale di ma da (la radice quadrata) del numero di condizione e non dipende dalla struttura della matrice. Tuttavia, per ottenere prestazioni davvero buone da un metodo Krylov, devi scegliere un buon precondizionatore per la tua matrice - e questo è più un mestiere che una scienza ...AA

  • Se è necessario risolvere ripetutamente sistemi lineari con la stessa matrice e diversi lati di destra, i metodi diretti possono comunque essere più veloci dei metodi iterativi poiché è necessario calcolare la decomposizione una sola volta. (Ciò presuppone una soluzione sequenziale; se si hanno tutti i lati della mano destra contemporaneamente, è possibile utilizzare i metodi di blocco Krylov.)

Naturalmente, queste sono solo linee guida molto approssimative: per una qualsiasi delle affermazioni di cui sopra, probabilmente esiste una matrice per la quale è vero il contrario ...

Dal momento che hai chiesto riferimenti nei commenti, ecco alcuni libri di testo e documenti di revisione per iniziare. (Nessuno di questi - né il set - è completo; questa domanda è troppo ampia e dipende troppo dal tuo problema specifico.)


2
Mi piace la tua analogia con il cacciavite!
Paolo

@chaohuang Se questo ha risposto alla tua domanda, dovresti accettarlo. (In caso contrario, sentiti libero di sottolineare cosa manca.)
Christian Clason,

@ChristianClason l'ha accettato. Stavo aspettando e sperando che qualcuno potesse far luce sulla questione delle matrici rettangolari. Dato che è passato molto tempo, suppongo che non ci sarà mai una risposta simile :(
chaohuang

@chaohuang Grazie. Se sei ancora interessato alle matrici rettangolari, dovresti porre una domanda (collegata) su "Come scegliere un metodo per risolvere sistemi sovradeterminati".
Christian Clason,

Qui un riferimento sull'uso di metodi iterativi per risolvere grandi sistemi sparsi di equazioni lineari.
Chaohuang,


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.