I sistemi lineari, se
possiedono una soluzione determinata, possono essere
risolti da metodi diretti o da metodi
iterativi. I metodi diretti permettono di
trovare la soluzione esatta con un numero di operazioni
finito e predicibile che dipende dall'ordine del sistema
n. I metodi iterativi producono invece
soluzioni approssimate ma con un numero di operazioni
che è approssimativamente indipendente dall'ordine del
sistema. Per piccoli sistemi (n<100) i metodi diretti
sono più veloci mentre per sistemi di ordine più
elevato è preferibile usare metodi iterativi.
|
METODI DIRETTI
|
|
Con il metodo di Cramer si risolve
direttamente un sistema di n equazioni a n incognite
mediante il calcolo di n+1 determinanti di ordine n.
Tale metodo tuttavia è impraticabile perchè il numero
delle operazioni richieste è elevato. I metodi
di eliminazione invece offrono un numero
relativamente basso di operazioni. Essi sono basati nel
produrre combinazioni lineari delle equazioni in modo
opportuno in modo da pervenire ad una equazione
con una sola incognita. Poi, ripercorrendo i passi
percorsi all'indietro, si trovano via via tutte le altre
incognite
.
Se si scrive il sistema di equazioni in forma matriciale
si può osservare che, quando si finiscono le
eliminazioni, si deve ottenere una matrice di
coefficienti di tipo triangolare
. I sistemi di questo tipo
si chiamano sistemi lineari triangolari.
|
|
RISOLUZIONE DEI SISTEMI
LINEARI TRIANGOLARI. I sistemi lineari del tipo:
sono detti sistemi triangolari. Il primo è triangolare
superiore ed è risolvibile con il metodo di
sostituzione all'indietro (back substitution),
il secondo è triangolare inferiore ed è risolvibile con
il metodo di sostituzione in avanti (forward
substitution). In ambedue i casi i sistemi
sono risolvibili solo se tutti gli elementi diagonali
della matrice dei coefficienti sono diversi d un a 0.
È possibile ricavare delle espressioni generali per le
sostituzioni
- ALGORITMO PER LA FORWARD SUBSTITUTION.
- ALGORITMO PER LA BACK SUBSTITUTION
.
Con le espressioni degli algoritmi è possibile scrivere
dei segmenti di codice che li implementano.
ESEMPIO: CODICE IN FORTRAN PER LA BACK
SUBSTITUTION:
x(nd)=b(nd)/a(nd,nd)
backsubstitution: DO i=nd-1,1, -1
sum=0.
DO
j=i+1,nd
sum=sum+a(i,j)*x(j)
END
DO
x(i)=(b(i)-sum)/a(i,i)
END DO
backsubstitution
|
ELIMINAZIONE DI
GAUSS. Il metodo di eliminazione successiva
delle incognite è detto metodo di Gauss.
Il metodo di eliminazione di Gauss consiste quindi nel
produrre ripetutamente combinazioni lineari delle
equazioni in modo da trasformare il sistema assegnato in
un sistema a matrice triangolare superiore.
Considderiamo un sistema di n equazioni a n incognite.
Il primo passo consiste nell'eliminare gli elementi
della prima colonna al di sotto della diagonale
principale. Per questo fine:
- sottraiamo la prima equazione moltiplicata con m12=
a21/a11 dalla seconda
equazione :
________________________________________________________
Abbiamo ottenuto un'equazione in cui x1 è
stata eliminata.
-
ora sottraiamo la prima equazione
moltiplicata con m 13= a 31/a 11
dalla terza equazione:
________________________________________________________
Ecco una seconda equazione dove manca x1 .
- ........
........
- sottraiamo la prima equazione moltiplicata con m1n=an1/a11
dalla n-esima equazione. Ecco una n-1-esima
equazione dove manca x1.
Come risultato si avrà la nuova matrice con elementi
nulli sulla prima colonna, dalla seconda riga in
poi.
Il sistema diventa:
Ora consideriamo il sistema ridotto (n-1)x(n-1)
che si ottiene scartando la prima riga e la prima
colonna:
A questa sottomatrice applichiamo lo stesso procedimento
di prima, sottraendo la prima equazione della
sottomatrice moltiplicata con
dalla seconda equazione della sottomatrice, e così via
come prima fino ad eliminare la n-1 esima incognita.
Dopo tutti questi passi, rimettendo insieme le prime
righe di tutti i sottosistemi che si formano, si
ottiene il sistema triangolare superiore cercato :
CODICE IN FORTRAN PER L'ELIMINAZIONE DI GAUSS:
eliminavariabili: DO i=1,nd-1
righe:
DO j=i+1,nd
factor=a(j,i)/a(i,i)
colonne:
DO k=1,nd
a(j,k)=a(j,k)-factor*a(i,k)
END DO colonne
b(j)=b(j)-factor*b(i)
END DO righe
END DO
eliminavariabili
|
L'eliminazione di Gauss è un
algoritmo che può essere implementato solo se gli
elementi sulla diagonale principale sono diversi da
zeri, altrimenti nel calcolo dei coefficienti accade di
dividere con zero.
Se si incontra questo problema si può cerca scambiare
righe sottostanti alla riga presa in considerazione in
modo da evitare elementi diagonali nulli. Questa
operazione di scambio è nota come tecnica di
pivoting.
Esempio:
Sembra che il metodo di eliminazione non funzioni.
In realtà il sistema ha soluzione se scambiamo la
seconda e la terza riga:
Anzi si ottiene subito il sistema triangolare.
|
LA TECNICA DEL PIVOTING. In
generale, se si ottiene un elemento pivotale k-esimo
nullo, akk = 0, con la tecnica del pivoting
si cerca una riga i sotto la riga k-esima che
abbia un elemento non nullo nella colonna k e poi si
scambiano queste due righe e se la matrice dei
coefficienti è invertibile questa riga sicuramente
c'è. La scelta è sempre tra le equazioni che
seguono la k-esima. Tuttavia la strategia di permutare
equazioni/righe viene usata anche se si incontrano
elementi pivot diversi da zero per aumentare la
stabilità dell’eliminazione gaussiana. Si può infatti
dimostrare che per aumentare la stabilità è opportuno
evitare moltiplicatori troppo grandi, poiché amplificano
gli errori di arrotondamento, con conseguente
instabilità dell’algoritmo. Per prevenire la crescita
dei moltiplicatori è necessario prevenire elementi pivot
troppo piccoli (perchè poi, nei moltiplicatori, sono un
quoziente). Per raggiungere questo obiettivo possiamo
applicare la strategia del pivoting parziale
ammettendo scambi di righe anche se al passo k
l’elemento pivot akk non è nullo. Più
precisamente, al passo k si determina l’elemento di
modulo massimo fra tutti gli elementi ark ,
con r ≥ k e, una volta individuato l’indice r
corrispondente all’elemento di modulo massimo, si
scambiano fra loro la riga k-esima e r -esima. Se
l’elemento più grande in modulo si cerca tanto nelle
colonne quanto nelle righe allora il metodo prende il
nome di pivoting totale.
Un codice che implementi l'eliminazione di Gauss deve
contenere tre moduli:
- eliminazione in avanti
- pivoting
- sostituzione all’indietro.
Ma prima si deve monitorizzare il termine
diagonale durante la fase di pivoting per rilevare la
presenza di uno zero (o di un numero minore di una
tolleranza predefinita) e quindi avvertire che il
sistema è singolare. Se ciò avviene la ricerca
delle soluzioni termina (det=0)
|
METODO DI GAUSS-JORDAN. Il
metodo di Gauss-Jordan è molto simile all'eliminazione
di Gauss per le matrici quadrate, ed è un metodo che
tramite operazioni elementari (quali lo scambio di
righe, combinazioni lineari, ecc...) opera la seguente
trasformazione della matrice completa associata :
Una volta eseguita la trasformazione, la soluzione del
sistema è rappresentata dal vettore colonna dei termini
noti.
La trasformazione della matrice è basata sul fatto
che se si applicano a un sistema lineare una o più delle
tre operazioni elementari seguenti:
- Scambiare fra loro due equazioni.
- Moltiplicare ambo i membri di una equazione per
uno stesso numero diverso da zero.
- Sostituire a una equazione la sua somma con una
qualsiasi combinazione lineare di alcune altre.
(Nel caso più semplice: sommare a una equazione
un’altra equazione moltiplicata per un numero)
si ottiene un sistema equivalente al precedente, (cioè
che ammette tutte e sole le soluzioni di quello di
partenza).
Un algoritmo che, passo per passo, dalla prima riga alla
n-esima, trasforma la matrice incompleta in matrice
unitaria è :
Qui k non indica un esponente ma l'indice di ogni passo
del processo di trasformazione.
Esempio. Consideriamo il sistema lineare:
La
matrice completa è:
e
k=0. Si inizia con k=1 (primo passo), i=1,2,3 e
j=1,2,3,4 Secondo
passo: k=2, i=1,2,3, j=2,3,4 Terzo
passo: k=3, i=1,2,3, j=3,4 Il
metodo di Gauss –Jordan e quello di Gauss possono
sembrare simili, ma quello di Gauss-Jordan richiede un
pò di più tempo di calcolo. Si può dimostrare che il
numero di operazioni con Gauss-Jordan è dato
da
mentre con Gauss è
che
aumenta con n ma Gauss-Jordan ne ha il 33% in più.
Tuttavia il metodo di Gauss-Jordan ha il vantaggio di
una maggiore semplicità di programmazione.
|
SISTEMI TRIDIAGONALI. Per
ottenere le soluzioni numeriche delle equazioni
differenziali ordinarie e alle derivate parziali e anche
in certi metodi di interpolazione (es: spline) si
ha la necessità di risolvere il sistema lineare della
forma generale:
nel quale in ogni equazione tutti i coefficienti sono
nulli eccetto quelli nella diagonale principale e nelle
diagonali adiacenti. Questi sistemi si dicono tridiagonali
e possono essere risolti mediante algoritmi di
eliminazione. Una versione semplificata
dell'eliminazione di Gauss per i sistemi
tridiagonali è l'algoritmo di Thomas .
|
|
METODI
ITERATIVI
|
I metodi iterativi non sono
solo usati quando il sistema è di ordine elevato ma
anche quando si ha un sistema con un buon numero di
coefficienti uguali a zero, come, per esempio, nella
matrice completa:(queste
matrici si dicono "sparse").
Un metodo iterativo, tenendo conto dall'inizio degli
zeri, può dare risultati più rapidi rispetto ad un
metodo diretto.
In un metodo iterativo si trasforma il sistema
iniziale: nella
forma equivalente:
con
e
vettore colonna nx1 e C una matrice nxn.
Si inizia l'iterazione fissando ad arbitrio un
valore per l'approssimazione iniziale x0,
prendendo, per esempio, per approssimazione iniziale la
colonna dei termini noti: Successivamente
costruiscono le matrici colonne:
e così via, l'approssimazione si calcola in generale con
la formula:
Se la successione delle approssimazioni
possiede un limite :
questo limite è la soluzione del sistema. Esistono
diverse formulazioni nei vari metodi iterativi tutti che
si differenziano nella scelta della matrice C. I più
importanti sono il metodo di Jacobi e il metodo
di Gauss-Siedel.
|
METODO DI JACOBI. Il metodo
funziona se
.
Dato il sistema ,
consideriamo le tre seguenti matrici:
La
matrice D è una matrice diagonale avente, nell'ordine,
sulla diagonale gli elementi della diagonale principale
di, le matrici E ed F sono rispettivamente la
triangolare inferiore e la triangolare superiore. Si ha
evidentemente che : A= D + E + F.
Sostituendo questa scomposizione di A nel sistema
si ottiene
da cui:
ed
essendo
esiste l'inversa
, per cui moltiplicando a sinistra per
,
ambo i membri si ottiene:che
fornisce il metodo iterativo di Jacobi nel quale ogni
i+1 esima approssimazione si calcola con la formula:
|
|
METODO DI GAUSS-SIEDEL. Con le
stesse posizioni del metodo di Jacobi possiamo scrivere
la
nella forma:
Essendo
la matrice D + E non è singolare e quindi si può
ricavare direttamente il vettore
:che
fornisce il metodo iterativo di Gauss-Siedel nel quale
ogni i+1 esima approssimazione si calcola con la
formula:
|
|