Sei sulla pagina 1di 6

Operatore \

In Matlab loperatore \ (backslash)


indica la risoluzione di un sistema

Metodi per sistemi lineari


Algoritmi di sostituzione e
metodo di Gauss

>> A = [6 2 3; 4 6 1; 1 1 3];
>> b = [11; 11; 5];
>> x = A\b
x =
1
1
1

Viene applicato lalgoritmo pi


conveniente (doc mldivide)

Algoritmo di sostituzione
allavanti

Algoritmi di sostituzione 1
versione
function x = ltrisol(r,b);
n = length(b);
x = zeros(size(b));
for j=1:n
s = 0;
for i=1:j-1
s = s + r(j,i)*x(i);
end
x(j) = (b(j)-s)/r(j,j);
end

Verifica

Per controllare la correttezza del


codice scritto si pu fare nel modo
seguente:
1. Definire una matrice dei coefficienti
2. Definire un vettore-soluzione
3. Calcolare il termine noto
corrispondente alla soluzione fissata
4. Calcolare la soluzione con la function
e confrontare il risultato con il vettore
definito al punto 2.

Osservazione
Il secondo ciclo equivale ad un
prodotto riga-colonna

s = 0;
for i=1:j-1
s = s + r(j,i)*x(i);
end

Esempio
>>
>>
>>
>>
>>

A = [6 2 3; 4 6 1; 1 1 3];
R = tril(A);
sol = ones(length(A),1);
b=R*sol;
x = ltrisol(R,b);

Se la function opera correttamente,


a questo punto devo trovare x uguale a sol

Algoritmo di sostituzione 2
versione
function x = ltrisol2(r,b);
n = length(b);
x = zeros(size(b));
for j=1:n
x(j) = (b(j)- r(j,1:j-1)*x(1:j-1))/r(j,j);
end

s = r(j,1:j-1)*x(1:j-1)

Osservazione
La regola di aggiornamento si pu
scrivere anche per colonne

Esercizio
Scrivere le function relative alle tre
versioni dellalgoritmo di sostituzione
allindietro.

Algoritmo di sostituzione 3
versione
function x = ltrisol3(r,b);
n = length(b);
x = zeros(n,1);
for j=1:n
x(j)
= b(j)/r(j,j);
b(j+1:n) = b(j+1:n) - r(j+1:n,j)*x(j);
end

Soluzione (per colonne)


La regola di aggiornamento si pu
scrivere anche per colonne

Algoritmo di sostituzione
allindietro per colonne

Fattorizzazione di Gauss
Algoritmo

function x = rtrisol(r,b);
n = length(b);
x = zeros(n,1);
for j=n:-1:1
x(j)
= b(j)/r(j,j);
b(1:j-1) = b(1:j-1) - r(j+1:n,j)*x(j);
end

Si memorizzano i moltiplicatori nel triangolo


inferiore
Si sovrascrivono gli elementi di R nel triangolo
superiore

La funzione Matlab di libreria che calcola


la fattorizzazione di Gauss lu

Fattorizzazione di Gauss 1
versione
function [L,R] = gauss1(a)
n = length(a);
for k = 1:n-1
if abs(a(k,k))<eps
error(Fattorizzazione non eseguibile);
end
for i=k+1:n
a(i,k) = a(i,k)/a(k,k);
for j=k+1:n
a(i,j) = a(i,j) - a(i,k)*a(k,j);
end
end
end
L = tril(a,-1); L = L + eye(n);
R = triu(a);

Fattorizzazione di Gauss 2
versione
function [L,R] = gauss2(a)
n = length(a);
for k = 1:n-1
if abs(a(k,k))<eps
error(Fattorizzazione non eseguibile);
end
for i=k+1:n
a(i,k) = a(i,k)/a(k,k);
a(i,k+1:n) = a(i,k+1:n) - a(i,k)*a(k,k+1:n);
end
end
L = tril(a,-1); L = L + eye(n);
R = triu(a);

Aggiornamento tramite diadi

Esempio

Una diade data dal prodotto


colonna-riga

Ad ogni passo dellalgoritmo si


aggiorna la sottomatrice con una
diade

Fattorizzazione di Gauss, 3
versione
function [L,R] = gauss3(a)
n = length(a);
for k = 1:n-1
if(abs(a(k,k))< eps)
error('\n Fattorizzazione non eseguibile);
end
a(k+1:n,k) = a(k+1:n,k)/a(k,k);
a(k+1:n, k+1:n)=a(k+1:n,k+1:n) - a(k+1:n,k)*a(k,k+1:n);
end
L = tril(a,-1);
L = L + eye(n);
R = triu(a);

In generale

Osservazione
Gli algoritmi per i sistemi lineari possono
essere espressi tramite operazioni di base
di algebra lineare come
prodotti scalari
prodotti matrice-vettore
diadi

Esistono librerie standard, dette BLAS


(Basic Linear Algebra Subroutines) di
sottoprogrammi relativi a ciascuna
operazione

Pivoting parziale
Al passo k si individua il massimo
elemento (in val. assoluto)
Si scambiano le righe
Si tiene traccia della permutazione
effettuata

Soluzione del sistema

Esempio
>>
>>
>>
>>
>>

A = [2 -1 -1; 1 -1 2; -5 -1 3];
b = [0; 2; -3];
[L,U p,s] = gauss3(A);
y = ltrisol(L,b(p));
x = rtrisol(R,y);

Fattorizzazione di Gauss con


pivoting parziale

function [L,R,p,s] = gauss_piv(a)


n = length(a);
p = [1:n];
s = 1;
for k = 1:n-1
[m,r] = max(abs(a(k:n,k)));
r = r + k-1;
if r ~= k
t
= p(k);
p(k) = p(r);
p(r) = t;
tmp = a(k,:);
a(k,:) = a(r,:);
a(r,:) = tmp;
s = -s;
end
if(abs(a(k,k))< eps)
error('\n Matrice singolare');
end
a(k+1:n,k) = a(k+1:n,k)/a(k,k);
a(k+1:n, k+1:n)=a(k+1:n,k+1:n) - a(k+1:n,k)*a(k,k+1:n);
end
L = tril(a,-1);
L = L + eye(n);
R = triu(a);

Esercizi proposti
Scrivere una function che calcola il
determinante di una matrice,
segnalando se singolare
Scrivere una function che calcola la
fattorizzazione di Gauss con pivoting
totale
Scrivere una function che calcoli la
fattorizzazione di Gauss per matrici
tridiagonali