Sei sulla pagina 1di 4

Errori

Indice di condizionamento
Stabilisce se una matrice è ben condizionata (variazione quasi nulla o prossima ad 1), o
mal condizionata (piccola variazione dei dati iniziali corrisponde ad una grande variazione
dei dati finali).
Data una matrice densa si calcola con c = cond(A, inf) a seconda del tipo di norma in cui
lo si vuole calcolare.
Data una matrice sparsa si calcola con c = condest(sA), norma infinito.

Errore Teorico
Rappresenta le cifre significative corrette che noi ci aspettiamo di avere nella soluzione.
Si calcola errTeo = c*2*eps. (c = indice di condizionamento, eps = ε di macchina).

Errore Relativo\Effettivo
Stabilisce le cifre significative corrette. Si calcola con errRel = norm(x-xS, inf)/norm(x, inf)
(x è la soluzione, xS è quello che ci calcoliamo noi con i metodi).

Residuo Relativo
resRel = norm(b-A*xS, inf)/norm(b, inf); (xS è la soluzione che ci calcoliamo noi con i
metodi).

Errore Assoluto
Stabilisce le cifre decimali corrette. Si calcola con errAss = norm(x - xS, inf); (x è la
soluzione, xS è quello che ci calcoliamo noi con i metodi).

Metodi Diretti
Eliminazione di Gauss senza pivoting
Dato un sistema Ax = b, applico la funzione [ x ] = eliminazioneGauss( A, b ) la quale mi
restituisce la mia soluzione.
Dato un sistema Ax = B, applico la funzione [ xj ] = eliminazioneGauss( A, B(:, j)) la quale
mi restituisce tanti vettori soluzione, i quali vanno messi insieme X = [x1,…,xj].
Metodo applicabile solo quando la matrice è: simmetrica definita positiva o a diagonale
dominante per righe o per colonne; matrice densa.
n3
Costo computazionale:
3

Fattorizzazione LU
Dato un sistema Ax = b, applico la funzione [L, U] = fattorizzazioneLU(A) la quale mi da 2
matrici, L(triangolare inferiore) e U(triangolare superiore).
LUx = b
Per trovare la soluzione devo risolvere questo sistema: ⎧Ux = y

⎩Ly = b
Prima trovo la y con y = sostAvanti(L, b), poi trovo x con x = sostIndietro(U, y).

Dato un sistema AX = B, applico la funzione [L, U] = fattorizzazioneLU(A) la quale mi da 2


matrici, L(triangolare inferiore) e U(triangolare superiore).
LUx 1...j = B
Per trovare la soluzione devo risolvere questo sistema: ⎪⎧Ux 1...j = y 1...j

⎩⎪Ly 1...j = B
Prima trovo la y1..j con y1 = sostAvanti(L, B(:, 1), poi trovo x con x1 = sostIndietro(U, y1);
successivamente posso creare il vettore soluzione con X = [x1, … xj].
Metodo applicabile quando i termini noti sono una matrice B; inoltre è applicato da Gauss
con pivoting A\b.
n3 n2
Costo computazionale: , per risolvere il sistema invece si ha + n 2 (sostAvanti e
3 2
n2
sostIndietro ).
2

Cholesky
Dato un sistema Ax = b, applico la funzione [ R ] = chol( A ) la quale mi restituisce una
matrice triangolare superiore.
A = R T R → R T Rx = b
Per trovare la soluzione devo risolvere questo sistema: ⎧Rx = y
⎨ T
⎩R y = b

Prima trovo la y con y = sostAvanti(RT, b), poi trovo x con x = sostIndietro(R, y).

Dato un sistema Ax = B, applico la funzione [ R ] = chol( A ) la quale mi restituisce una


matrice triangolare superiore.
A = R T R → R T Rx 1...j = B
Per trovare la soluzione devo risolvere questo sistema: ⎧⎪Rx 1...j = y 1...j
⎨ T
⎩⎪R y 1...j = B

Prima trovo la y1..j con y1 = sostAvanti(RT, B(:, 1)), poi trovo x con x1 = sostIndietro(R, y1);
successivamente posso creare il vettore soluzione con X = [x1, … xj].
Metodo applicabile quando la matrice è simmetrica e definita positiva.
n3
Costo computazionale:
6
Caso particolare: L = chol(A, ‘lower) genero una matrice triangolare inferiore con Cholesky
A = LLT
⎧Ly = b
LLT x = b ⎨ T
⎩L x = y
Metodi Iterativi
Converge e non converge
Per sapere se una matrice non converge possiamo verificare se |det(P)| ≥ 1 o se la |
trace(P)| ≥ n. Nel caso in cui la matrice A sia diagonale dominante per righe e per colonne
converge sicuramente.

Jacobi
Dato un sistema Ax = b, e abbiamo sA possiamo applicare [x, k, err, P] = jacobiSparse(sA,
sb, toll, itmax, par). Tale funzione mi restituisce: x = soluzione, k = numero iterazioni, err =
errore, P = matrice di permutazione. Tale funzione richiede in input: A = matrice
coefficienti, b = vettore termini noti, toll = errTeo, itmax = n, par = 0 se non so nnt - 1 se so
che converge.
Eseguita la funzione dobbiamo confrontare k con itmax, se k < itmax è un primo segno di
funzionamento; poi err con errTeo se hanno stesso ordine di grandezza è un altro segno
positivo; x = [1,…,1] è un altro segno positivo.
Dato un sistema AX = B si devono calcolare xj soluzioni (es. B(:, j)) e poi mettere tutto
insieme X = [x1,…xj].
Metodo applicabile quando la matrice è sparsa e converge.
Costo computazionale: k * nnz(sA)

Gauss-Seidel
Dato un sistema Ax = b, e abbiamo sA possiamo applicare [x, k, err, P] =
GaussSeidelSparse(sA, sb, toll, itmax, par). Tale funzione mi restituisce: x = soluzione, k =
numero iterazioni, err = errore, P = matrice di permutazione. Tale funzione richiede in
input: A = matrice coefficienti, b = vettore termini noti, toll = errTeo, itmax = n, par = 0 se
non so nnt - 1 se so che converge.
Eseguita la funzione dobbiamo confrontare k con itmax, se k < itmax è un primo segno di
funzionamento; poi err con errTeo se hanno stesso ordine di grandezza è un altro segno
positivo; x = [1,…,1] è un altro segno positivo.
Dato un sistema AX = B si devono calcolare xj soluzioni (es. B(:, j)) e poi mettere tutto
insieme X = [x1,…xj].
Metodo applicabile quando la matrice è sparsa e converge.
Costo computazionale: k * nnz(sA)

Metodi everywhere
Gauss con pivoting
Funziona sempre e si calcola con x = A\b.
n3
Il costo computazionale è: + n 2 perché non è altro che una fattorizzazioneLU +
3
sostIndietro e sostAvanti.
Istruzioni MatLAB
Triangola inferiore
A = tril(ones(n) * valore che vogliamo, -1).

Triangola superiore
A = triu(ones(n) * valore che vogliamo, 1).

Diagonale
A = eye(n) * (valore che vogliamo).
A = A + diag(valore che vogliamo).

Sub2Ind
A(sub2ind(size(A), [righe], [colonne])) = valore che vogliamo;

Cicli for
for i=1:n
A(i,:)=min(i, [1:n])*i.*[1:n];
end
A = (A i,j ) i,j=1,...,n , A i,j = min{i, j} * i * j

Potrebbero piacerti anche