Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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).
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).
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