• Non ci sono risultati.

Sistemi lineari: metodo diretti

N/A
N/A
Protected

Academic year: 2022

Condividi "Sistemi lineari: metodo diretti"

Copied!
23
0
0

Testo completo

(1)

Sistemi lineari: metodo diretti

Ana Alonso

University of Trento

3-10 ottobre 2013

(2)

Sistemi triangolari

a1,1 0 0 . . . 0 0

a2,1 a2,2 0 . . . 0 0

a3,1 a3,2 a3,3 . . . 0 0 ..

. ..

. . .. ...

an−1,1 an−1,2 an−1,3 . . . an−1,n−1 0 an,1 an,2 an,3 . . . an,n−1 an,n

x1

x2

x3

.. . xn−1

xn

=

b1

b2

b3

.. . bn−1

bn

Sostituzione in avanti:

x1= b1/a1,1

For i = 2 : n xi = a1

i ,i



bi −Pi −1 j =1ai ,jxj

(3)

Sistemi triangolari

x1= b1/a1,1

For i = 2 : n xi = a1

i ,i



bi −Pi −1 j =1ai ,jxj Implementazione:

[c1, c2, c3]

 d1 d2

d3

= c1d1+ c2d2+ c3d3=

3

X

j =1

cjdj

Pi −1

j =1ai ,jxj A(i,1:i-1)*x(1:i-1,1) Esercizio. Scrivere una funzione di Matlab che implementi il metodo della sostituzione in avanti.

(4)

Sostituzione in avanti

function [x]=forward(L,b)

% x=forward(L,b)

% Risolve il sistema triangolare inferiore Lx=b.

% Usa il metodo della sostituzione in avanti.

[n,m]=size(L);

if n~=m, error(’Solo sistemi quadrati’); end

if min(abs(diag(L)))==0, error(’Sistema singolare’); end x(1,1)=b(1)/L(1,1);

for i=2:n

x(i,1)=(b(i)-L(i,1:i-1)*x(1:i-1,1))/L(i,i);

end return

(5)

Sistemi triangolari

a1,1 a1,2 a1,3 . . . a1,n−1 a1,n

0 a2,2 a2,3 . . . a2,n−1 a2,n

0 0 a3,3 . . . a3,n−1 a3,n

... ... . .. ... 0 0 0 . . . an−1,n−1 an−1,n

0 0 0 . . . 0 an,n

x1

x2

x3

... xn−1 xn

=

b1

b2

b3

... bn−1 bn

Sostituzione all’indietro:

xn= bn/an,n

For i = n − 1 : −1 : 1 xi = a1

i ,i



bi −Pn

j =i +1ai ,jxj



Esercizio. Scrivere una funzione di Matlab che implementi il metodo della sostituzione all’indietro.

(6)

Sostituzione all’indietro

function [x]=backward(U,b)

% x=backward(U,b)

% Risolve il sistema triangolare superiore Ux=b.

% Usa il metodo della sostituzione all’indietro.

[n,m]=size(U);

if n~=m, error(’Solo sistemi quadrati’); end

if min(abs(diag(U)))==0, error(’Sistema singolare’); end x(n,1)=b(n)/U(n,n);

for i=n-1:-1:1

x(i,1)=(b(i)-U(i,i+1:n)*x(i+1:n,1))/U(i,i);

end return

(7)

Istruzione condizionale

I Se r `e no negativo calcola la radice quadra

if r >= 0

radice=sqrt(r);

end

I Se r `e no negativo calcola√

r altrimenti scrive “r negativo”.

if r >= 0

radice=sqrt(r);

else

disp(’r negativo’) end

I ax2+ b x + c = 0 disc = b2− 4ac

if disc > 0

disp(’Due radici reali diverse’) elseif disc==0

disp(’Una radice reale doppia’) else

disp(’Due radici complesse coniugate’) end

(8)

Operatori e altro

I Operatori relazionali:

< <= > >= == ~=

(Il simbolo “ = “ `e un’assegnazione. Possiamo scrivere a=a+1.)

I Operatori logici:

& | ~

I return: uscita incondizionata dalla funzione.

I error: visualizza il messaggio ed esce dalla funzione.

I break: uscita da un ciclo for o while.

(9)

Risoluzione di sistemi lineari

Il comando \ (backslash)

I Se A `e una matrice n × n e b `e un vettore colonna di dimensione n

x=A \ b calcola la soluzione del sistema lineare

A x = b .

I Non calcola l’inversa.

I Usa un algoritmo diverso dipendendo dalla struttura della matrice A.

Il comando inv.

I Calcola esplicitamente l’inversa della matrice A.

I Non `e conveninte usare questo comando per risolvere un sistema lineare perche `e pi`u costoso.

(10)

Altri comandi per matrici (e vettori)

I det(A) calcola in determinante della matrice A.

I v=diag(A) se A `e una matrice calcola il vettore con la diagonale di A.

I D=diag(v) se v calcola la matrice diagonale che ha nella diagonale i valori di v.

I M=tril(A) restituisce la parte triangolare inferiore di A.

(Provare anche tril(A,1) o tril(A,-2)).

I M=triu(A) restituisce la parte triangolare superiore di A.

Analogo a tril.

I v=eig(A) calcola gli autovalori di A.

I [M,v]=eig(A) calcola gli autovettori e gli autovalori di A.

I norm(A) calcola la norma 2 di A.

I cond(A) calcola il condizionamento in norma 2 di A.

(11)

Metodo di eliminazione di Gauss (senza pivotazione)

Ax = b ⇔ Ux = c U matrice triangolare superiore.

for k = 1 : n − 1 for i = k + 1 : n

mi ,k = ai ,k(k)/a(k)k,k for j = k + 1 : n

a(k+1)i ,j = ai ,j(k)− mi ,k∗ a(k)k,j end

b(k+1)i = b(k)i − mi ,k∗ bk(k) end

end

U = A(n) c = b(n).

(12)

Metodo di eliminazione di Gauss (senza pivotazione)

Implementazione:

A=[A b];

for k=1:n-1

A(k+1:n,k)=A(k+1:n,k)/A(k,k);

A(k+1:n,k+1:n+1)=A(k+1:n,k+1:n+1)-A(k+1:n,k)*A(k,k+1:n+1);

end

. .. . . .

ak,k(k) a(k)k,k+1 . . . a(k)k,n b(k)k mk+1,k a(k+1)k+1,k+1 . . . a(k+1)k+1,n b(k+1)k+1

... ... ...

mn,k a(k+1)n,k+1 . . . an,n(k+1) b(k+1)n

(13)

Metodo di eliminazione di Gauss (senza pivotazione)

Implementazione:

A=[A b];

for k=1:n-1

A(k+1:n,k)=A(k+1:n,k)/A(k,k);

A(k+1:n,k+1:n+1)=A(k+1:n,k+1:n+1)-A(k+1:n,k)*A(k,k+1:n+1);

end

Osservazione:

c1 c2

ce

[d1, d2, d3, d4] =

c1d1 c1d2 c1d3 c1d4 c2d1 c2d2 c2d3 c2d4

c3d1 c3d2 c3d3 c3d4

(14)

Metodo di eliminazione di Gauss (senza pivotazione)

function [x]=Gauss(A,b)

% x=Gauss(A,b)

% Risolve il sistema lineare Ax=b.

% Usando il metodo di eliminazione di Gauss senza pivoting.

[n,m]=size(A);

if n~=m, error(’Solo sistemi quadrati’); end A=[A b];

for k=1:n-1

if A(k,k)==0, error(’Elemento pivotale nullo’); end A(k+1:n,k)=A(k+1:n,k)/A(k,k);

A(k+1:n,k+1:n+1)=A(k+1:n,k+1:n+1)-A(k+1:n,k)*A(k,k+1:n+1);

end

if A(n,n)==0, error(’Sistema singolare’); end x(n,1)=A(n,n+1)/A(n,n);

for i=n-1:-1:1

x(i,1)=(A(i,n+1)-A(i,i+1:n)*x(i+1:n,1))/A(i,i);

end return

(15)

Metodo di eliminazione di Gauss (senza pivotazione)

function [x]=Gauss(A,b)

% x=Gauss(A,b)

% Risolve il sistema lineare Ax=b.

% Usando il metodo di eliminazione di Gauss senza pivoting.

[n,m]=size(A);

if n~=m, error(’Solo sistemi quadrati’); end A=[A b];

for k=1:n-1

if A(k,k)==0, error(’Elemento pivotale nullo’); end A(k+1:n,k)=A(k+1:n,k)/A(k,k);

A(k+1:n,k+1:n+1)=A(k+1:n,k+1:n+1)-A(k+1:n,k)*A(k,k+1:n+1);

end

x=backward(A(:,1:n),A(:,n+1));

return

(16)

Pivotazione parziale per righe

1 2 3 1 0 0 4 1 0 5 6 1 0 1 2 1

 x1

x2 x3 x4

=

 7 5 12

4

m3,2 = 5/0 m4,2 = 1/0 !!!

Per risolvere il sistema lineare bastascambiare due equazionie poi andare avanti col metodo di eliminazione.

Scambio di righe:

A([k,i],:)=A([i,k],:);

(17)

Pivotazione parziale per righe (solo se necessario)

function [x]=Gauss(A,b)

% x=Gauss(A,b)

% Risolve il sistema lineare Ax=b.

[n,m]=size(A);

if n~=m, error(’Solo sistemi quadrati’); end A=[A b];

err=0;

for k=1:n-1 if A(k,k)==0

err=1;

for i=k+1:n if A(i,k)~=0

A([k,i],:)=A([i,k],:);

err=0;

break end end end

if err, error(’Matrice singolare’); end A(k+1:n,k)=A(k+1:n,k)/A(k,k);

A(k+1:n,k+1:n+1)=A(k+1:n,k+1:n+1)-A(k+1:n,k)*A(k,k+1:n+1);

end

if A(n,n)==0, error(’Matrice singolare’); end x=backward(A(:,1:n),A(:,n+1));

return

(18)

Pivotazione parziale per righe

function [x]=Gauss(A,b)

% x=Gauss(A,b)

% Risolve il sistema lineare Ax=b.

[n,m]=size(A);

if n~=m, error(’Solo sistemi quadrati’); end A=[A b];

for k=1:n-1

npivot=abs(A(k,k));

r=k;

for i=k+1:n

if abs(A(i,k))>npivot npivot=abs(A(i,k));

r=i;

end end

if npivot==0, error(’Matrice singolare’); end if r~=k, A([k,r],:)=A([r,k],:); end

A(k+1:n,k)=A(k+1:n,k)/A(k,k);

A(k+1:n,k+1:n+1)=A(k+1:n,k+1:n+1)-A(k+1:n,k)*A(k,k+1:n+1);

end

if A(n,n)==0, error(’Matrice singolare’); end x=backward(A(:,1:n),A(:,n+1));

return

(19)

Il comando lu e il comando chol

[L,U,P]=lu(A)

I L U = P A

I L triangolare inferiore con gli elementi diagonali uguali a 1.

I U triangolare superiore.

I P matrice di permutazioni.

[L,U]=lu(A)

I L U = A

I L non `e triangolare inferiore ma una permutazione di righe la rende triangolare inferiore con tutti gli elementi diagonali uguali a 1.

I U triangolare superiore.

R=chol(A)

I A deve essere simmetrica definita positiva

I RTR = A

I R triangolare superiore con tutti gli elementi diagonali positivi.

(20)

Il metodo di Gauss e la fattorizzazione LU

A =

u1,1 u1,2 u1,3 . . . u1,n−1 u1,n c1 m2,1 u2,2 u2,3 . . . u2,n−1 u2,n c2 m3,1 m3,2 u3,3 . . . u3,n−1 u3,n c3

.. .

.. . mn,1 mn,2 mn,3 . . . mn,n−1 un,n cn

L =

1 m2,1 1 m3,1 m3,2 1

.. .

.. . ..

.

.. . mn,1 mn,2 mn,3 . . . mn,n−1 1

U =

u1,1 u1,2 u1,3 . . . u1,n−1 u1,n u2,2 u2,3 . . . u2,n−1 u2,n u3,3 . . . u3,n−1 u3,n

...

.. . ...

.. . un,n

L=tril(A,-1)+eye(n) U=triu(A(:,1:end-1))

I Senza pivotazione A = LU.

I Con pivotazione PA = LU essendoP unamatrice di permutazione.

(21)

Esercizio

Partendo dal programma che implementa il metodo di eliminazione di Gauss senza pivotazione scrivere una funzione di Matlab che calcoli la fattorizzazione LU di una matrice A.

function A=mylu0(A) [n,m]=size(A);

if n~=m, error(’Solo matrici quadrate’); end for k=1:n-1

if A(k,k)==0, error(’Elemento pivotale nullo’); 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

(22)

Esercizio

Partendo dal programma che implementa il metodo di eliminazione di Gauss senza pivotazione scrivere una funzione di Matlab che calcoli la fattorizzazione LU di una matrice A.

function A=mylu0(A) [n,m]=size(A);

if n~=m, error(’Solo matrici quadrate’); end for k=1:n-1

if A(k,k)==0, error(’Elemento pivotale nullo’); 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

(23)

LU=PA

function [A,p]=mylu1(A) [n,m]=size(A);

if n~=m, error(’Solo matrici quadrate’); end p=1:n;

for k=1:n-1

npivot=abs(A(k,k));

r=k;

for i=k+1:n

if abs(A(i,k))>npivot npivot=abs(A(i,k));

r=i;

end end

if npivot==0, error(’Matrice singolare’); end

if r~=k, A([k,r],:)=A([r,k],:); p([k,r])=p([r,k]); 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

Riferimenti

Documenti correlati

All’aumentare di X la funzione − F (X) 1 esce dal diagramma polare completo della funzione G(jω) e questo ´e indice del fatto che il ciclo limite presente all’interno del

[r]

Scrivere la funzione Matlab find_val che riceva in input un vettore v e una variabile stringa tipo che puo' assumere solo i valori 'min' e 'max' e restituisca in output il

I Scrivere una funzione di Matlab che implemeti il metodo della sostituzione all’indietro.

I Scrivere una funzione di Matlab che implemeti il metodo della sostituzione in avanti.. I Scrivere una funzione di Matlab che implemeti il metodo della

[r]

I Scrivere una funzione di Matlab che implementi il metodo iterativo del gradiente per l’approssimazione della soluzione di un sistema lineare A x = b.Usare il test d’arresto basato

A titolo di esempio, la figura mostra il caso di un relè ideale con un luogo delle frequenze che determina tre intersezioni P, Q, R e quindi tre cicli limite aventi