• Non ci sono risultati.

PereseguirlainMatlabeseguiamoleseguentiistruzioni: Laseguentefunzionerisolveisistemitriangolariinferiori 1 FrancescaMazziaDipartimentoInteruniversitariodiMatematicaUniversit`adiBariMATLAB:SoluzioneSistemiLineari. functionb=soll(L,b)%%%%datidiinput%%Lmatri

N/A
N/A
Protected

Academic year: 2021

Condividi "PereseguirlainMatlabeseguiamoleseguentiistruzioni: Laseguentefunzionerisolveisistemitriangolariinferiori 1 FrancescaMazziaDipartimentoInteruniversitariodiMatematicaUniversit`adiBariMATLAB:SoluzioneSistemiLineari. functionb=soll(L,b)%%%%datidiinput%%Lmatri"

Copied!
26
0
0

Testo completo

(1)

Francesca Mazzia

Dipartimento Interuniversitario di Matematica Universit` a di Bari

MATLAB:Soluzione Sistemi Lineari.

Soluzione sistemi triangolari

La seguente funzione risolve i sistemi triangolari inferiori function b = soll(L,b)

%%

%% dati di input

%% L matrice triangolare inferiore

%% b termine noto

%% output

%% b soluzione

n = length(b);

b(1) = b(1)/L(1,1);

for i=2:n

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

end

Per eseguirla in Matlab eseguiamo le seguenti istruzioni:

>> L = [ 1 0 0 0

2 4 0 0

3 6 5 0

(2)

1 2 3 4]

L =

1 0 0 0

2 4 0 0

3 6 5 0

1 2 3 4

>> b = [1;2;3;4]

b = 1 2 3 4

>> x=soll(L,b) x =

1.0000 0 0 0.7500

>> L*x ans =

1 2 3 4

>> b

(3)

b = 1 2 3 4

>> L*x-b ans =

0 0 0 0

>> norm(L*x-b,’inf’) ans =

0

>>

Algoritmo di eliminazione di Gauss.

Eseguiamo in Matlab tutti i passaggi per costruire la fattorizzazione

>>A = [0 2 4 2

6 8 9 8

4 0 0 5

6 2 4 7];

>>A0 = A;

>>P = eye(4);

(4)

>>b = [ 1; 2; 3; 4];

% scegliamo il pivot

>>[elm,indm]=max(abs(A(1:4,1))) elm =

6

indm = 2

% scambiamo le righe di A

>>A([1 indm],:)=A([indm,1],:) A =

6 8 9 8

0 2 4 2

4 0 0 5

6 2 4 7

% scambiamo le righe di P e di b

>>P([1 indm],:)=P([indm,1],:) P =

0 1 0 0

1 0 0 0

0 0 1 0

0 0 0 1

>>b([1 indm])=b([indm,1])

b =

(5)

2 1 3 4

% calcolo gli elementi di L : L(2:4,1)=A(2:4,1)/A(1,1)

>>L(2:4,1)=A(2:4,1)/A(1,1) L =

0 0 0.6667 1.0000

% aggiorno la matrice A

% aggiorno la seconda riga

>>A(2,:)=A(2,:)-L(2,1)*A(1,:) A =

6 8 9 8

0 2 4 2

4 0 0 5

6 2 4 7

% aggiorno la terza riga

>>A(3,:)=A(3,:)-L(3,1)*A(1,:) A =

6.0000 8.0000 9.0000 8.0000 0 2.0000 4.0000 2.0000 0 -5.3333 -6.0000 -0.3333 6.0000 2.0000 4.0000 7.0000

% aggiorno la quarta riga

>>A(4,:)=A(4,:)-L(4,1)*A(1,:)

(6)

A =

6.0000 8.0000 9.0000 8.0000 0 2.0000 4.0000 2.0000 0 -5.3333 -6.0000 -0.3333 0 -6.0000 -5.0000 -1.0000

% aggiorno il vettore b

>>b(2:4)=b(2:4)-L(2:4,1)*b(1) b =

2.0000 1.0000 1.6667 2.0000

% adesso ripeto il procedimento sulla sottomatrice A(2:4,2:4)

% scelgo l’elemento pivotale

>>[elm,indm]=max(abs(A(2:4,2))) elm =

6

indm = 3

>>indm=indm+1 indm =

4

%scambio le righe di A

(7)

>>A([2 indm],:)=A([indm 2],:) A =

6.0000 8.0000 9.0000 8.0000 0 -6.0000 -5.0000 -1.0000 0 -5.3333 -6.0000 -0.3333 0 2.0000 4.0000 2.0000

% scambio le righe di P

>>P([2 indm],:)=P([indm 2],:) P =

0 1 0 0

0 0 0 1

0 0 1 0

1 0 0 0

% scambio le righe di b

>>b([2 indm],:)=b([indm 2]) b =

2.0000 2.0000 1.6667 1.0000

% scambio le righe di L

>>L([2 indm],1)=L([indm 2],1)

L =

0

1.0000

(8)

0.6667 0

% calcolo gli elementi della seconda colonna di L

>>L(3:4,2)=A(3:4,2)/A(2,2) L =

0 0

0 0

0.6667 0.8889 1.0000 -0.3333

% aggiorno la matrice A: terza e quarta riga

>>A(3:4,:)=A(3:4,:)-L(3:4,2)*A(2,:) A =

6.0000 8.0000 9.0000 8.0000 0 -6.0000 -5.0000 -1.0000

0 0 -1.5556 0.5556

0 0 2.3333 1.6667

% aggiorno il vettore b

>>b(3:4)=b(3:4)-L(3:4,2)*b(2) b =

2.0000 2.0000 -0.1111 1.6667

% eseguo l’ultimo passaggio

% calcolo elemento pivotale

>>[elm,indm]=max(abs(A(3:4,3)))

(9)

elm = 2.3333

indm = 2

>>indm=indm+2 indm =

4

% scambio le righe di A

>>A([3 indm],:)=A([indm 3],:) A =

6.0000 8.0000 9.0000 8.0000 0 -6.0000 -5.0000 -1.0000

0 0 2.3333 1.6667

0 0 -1.5556 0.5556

% scambio le righe di P

>>P([3 indm],:)=P([indm 3],:)

P =

0 1 0 0

0 0 0 1

1 0 0 0

0 0 1 0

% scambio le righe di b

>>b([3 indm],:)=b([indm 3])

(10)

b =

2.0000 2.0000 1.6667 -0.1111

% scambio le righe di L

>>L([3 indm],:)=L([indm 3],:) L =

0 0

1.0000 0

0 -0.3333 0.6667 0.8889

% calcolo gli elementi di L

>>L(4:4,3)=A(4:4,3)/A(3,3) L =

0 0 0

1.0000 0 0

0 -0.3333 0

0.6667 0.8889 -0.6667

% aggiorno la A

>>A(4:4,:)=A(4:4,:)-L(4:4,3)*A(3,:) A =

6.0000 8.0000 9.0000 8.0000 0 -6.0000 -5.0000 -1.0000

0 0 2.3333 1.6667

0 0 0 1.6667

(11)

% aggiorno la b

>>b(4)=b(4)-L(4,3)*b(3) b =

2.0000 2.0000 1.6667 1.0000

% ho ottenuto un sistema triangolare superiore

% completo la matrice L

>>L(:,4)=0 L =

0 0 0 0

1.0000 0 0 0

0 -0.3333 0 0

0.6667 0.8889 -0.6667 0

>>L=L+eye(4) L =

1.0000 0 0 0

1.0000 1.0000 0 0

0 -0.3333 1.0000 0

0.6667 0.8889 -0.6667 1.0000

% verifico la fattorizzazione

>>P*A0 ans =

6 8 9 8

(12)

6 2 4 7

0 2 4 2

4 0 0 5

>>L*A ans =

6.0000 8.0000 9.0000 8.0000 6.0000 2.0000 4.0000 7.0000 0 2.0000 4.0000 2.0000 4.0000 0.0000 0.0000 5.0000

% per esercizio risolvere il sistema triangolare superiore

% costruendo la function solu.m con dati di input U e b

% e dati di output la soluzione x

Costruiamo una funzione Matlab che ci permette di calcolare la fatto- rizzazione LU mediante il metodo di eliminazione di Gauss senza eseguire il pivot

function [L,U] = gauss(A)

% ELIMINAZIONE DI GAUSS

% Dati di input:

% A = matrice quadrata

% Dati di output:

% L = matrice triangolare inferiore

% U = matrice triangolare superiore

% tali che A = LU [n,m] = size(A);

if n ~= m

error(’ERRORE: la matrice di input non e’’ quadrata’)

end

(13)

for k = 1:n-1

% controllo sulla grandezza dell’elemento diagonale:

if abs(A(k,k)) < realmin

disp(’Un elemento diagonale e’’ nullo’)

error(’Non e’’ possibile continuare il procedimento di eliminazione’) 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) + eye(n);

U = triu(A);

Problemi dell’algoritmo di fattorizzazione LU senza permutazioni:

1) Non pu` o essere eseguita su matrici come:

>> Q=[0 1 0;0 0 1;1 0 0]

Q =

0 1 0

0 0 1

1 0 0

>> A=[1 2 5;-1 -2 -7;1 1 3]

A =

1 2 5

-1 -2 -7

1 1 3

Infatti se facciamo

(14)

>> [L,U]=gauss(Q)

e

>> [L,U]=gauss(A)

abbiamo

Un elemento diagonale e’ nullo

??? Error using ==> gauss

Non e’ possibile continuare il procedimento di eliminazione

Possiamo risolvere tale problema utilizzando la funzione Matlab che esegue la fattorizzazione LU con pivot che si chiama lu;

>> A=[1 2 5;-1 -2 -7;1 1 3]

A =

1 2 5

-1 -2 -7

1 1 3

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

1 0 0

1 1 0

-1 0 1

(15)

U =

1 2 5

0 -1 -2

0 0 -2

P =

1 0 0

0 0 1

0 1 0

da cui abbiamo

>> P*A ans =

1 2 5

1 1 3

-1 -2 -7

>> L*U ans =

1 2 5

1 1 3

-1 -2 -7

Analogamente:

(16)

>> Q=[0 1 0;0 0 1;1 0 0]

Q =

0 1 0

0 0 1

1 0 0

>> [L,U,P]=lu(Q) L =

1 0 0

0 1 0

0 0 1

U =

1 0 0

0 1 0

0 0 1

P =

0 0 1

1 0 0

0 1 0

da cui

>> P*Q

ans =

(17)

1 0 0

0 1 0

0 0 1

>> L*U ans =

1 0 0

0 1 0

0 0 1

Esercizio.

Costruire una function Matlab: dati di input la matrice A e il vettore b, dati di output soluzione del sistema lineare Ax = b. Il procedimento da utilizzare ` e quello di eliminazione di Gauss senza pivot con le matrici elementari, che trasforma il sistema originario in un sistema triangolare superiore, che poi viene risolto con il procedimento di eliminazione.

Vediamo anche come costruire l’algoritmo per calcolare la fattorizza- zione LU con il metodo di eliminazione di Gauss con il pivot parziale:

function [L,U,P] = gaussp(A)

% ELIMINAZIONE DI GAUSS CON PIVOT PARZIALE

% Dati di input:

% A = matrice quadrata

% Dati di output:

% L = matrice triangolare inferiore

% U = matrice triangolare superiore

% P = matrice di permutazione

% tali che PA = LU [n,m] = size(A);

if n ~= m

(18)

error(’ERRORE: la matrice di input non e’’ quadrata’) end

P = eye(n);

for k = 1:n-1

% ricerca del pivot e permutazione:

% si scambiano le righe k e rp di A e di P [piv,rp] = max(abs(A(k:n,k)));

rp = rp + k - 1;

P([k rp],:)=P([rp k],:) A([k rp],:)=A([rp k],:)

% controllo sulla grandezza dell’elemento pivotale:

if abs(A(k,k)) <= realmin

disp(’Un elemento pivotale e’’ nullo’) error(’La matrice in input e’’ 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) + eye(n);

U = triu(A);

Anche mediante tale funzione possiamo risolvere il problema preceden- te; infatti:

>> A=[1 2 5;-1 -2 -7;1 1 3]

A =

1 2 5

-1 -2 -7

(19)

1 1 3

>> [L,U,P]=gaussp(A) L =

1 0 0

1 1 0

-1 0 1

U =

1 2 5

0 -1 -2

0 0 -2

P =

1 0 0

0 0 1

0 1 0

e

>> Q=[0 1 0;0 0 1;1 0 0]

Q =

0 1 0

0 0 1

1 0 0

(20)

>> [L,U,P]=gaussp(Q) L =

1 0 0

0 1 0

0 0 1

U =

1 0 0

0 1 0

0 0 1

P =

0 0 1

1 0 0

0 1 0

2) La fattorizzazione LU senza pivot Presenta problemi di instabilit` a nume- rica:

( 10

−17

x

1

+ x

2

= 1 x

1

+ x

2

= 2

Il problema ` e ben posto, ed ha come soluzione esatta x ' (1, 1)

T

. Infatti ponendo:

>> A=[1e-17 1;1 1]

A =

(21)

1.0000e-17 1.0000e+00 1.0000e+00 1.0000e+00

>> b=[1;2]

b = 1 2 abbiamo:

>> x=A\b x =

1 1

Applicando il metodo di Gauss ed operando in virgola mobile in base 2 in doppia precisione, si ottengono i fattori L ed U seguenti:

>> [L,U]=gauss(A)

L =

1.0000e+00 0

1.0000e+17 1.0000e+00

U =

1.0000e-17 1.0000e+00

0 -1.0000e+17

(22)

Il prodotto LU non ` e A e infatti:

>> A-L*U ans =

0 0

0 1

Ci` o significa che la soluzione numerica ottenuta con il metodo di Gauss senza pivot sar` a totalmente sbagliata.

Infatti risolvendo Ly = b e U xtilde = y abbiamo:

>> y=L\b y =

1.0000e+00 -1.0000e+17

>> xtilde=U\y xtilde =

0 1

Se invece utilizziamo il metodo di Gauss con il pivot parziale abbiamo:

>> A=[1e-17 1;1 1]

(23)

A =

1.0000e-17 1.0000e+00 1.0000e+00 1.0000e+00

>> [L,U,P]=gaussp(A) L =

1.0000e+000 0

1.0000e-017 1.0000e+000 U =

1 1

0 1

P =

0 1

1 0

da cui

>> P*A-L*U ans =

0 0

0 0

>> y=L\P*b y =

2

1

(24)

>> xtilde=U\y xtilde =

1 1

MATRICI DIAGONALI DOMINANTI

Sia A una matrice di ordine n diagonale dominante per colonne. Allora i fattori di A ottenuti con il metodo di Gauss coincidono con quelli che si ottengono con il metodo di Gauss con pivot parziale.

Esempio:

matrice diagonale dominante per righe

>> A=[3 1 1;4 8 2;2 2 5]

A =

3 1 1

4 8 2

2 2 5

I fattori di A ottenuti con il metodo di Gauss sono:

>> [L,U]=gauss(A) L =

1.0000 0 0

1.3333 1.0000 0

0.6667 0.2000 1.0000

(25)

U =

3.0000 1.0000 1.0000 0 6.6667 0.6667

0 0 4.2000

mentre i fattori ottenuti con il metodo di Gauss con pivot parziale sono:

>> [L,U,P]=gaussp(A) L =

1.0000 0 0

0.7500 1.0000 0

0.5000 0.4000 1.0000

U =

4.0000 8.0000 2.0000 0 -5.0000 -0.5000

0 0 4.2000

P =

0 1 0

1 0 0

0 0 1

Nel primo caso L non ` e diagonale predominante, nel secondo caso ` e U a non essere diagonale predominante.

Esercizio.

(26)

Calcolare la fattorizzazione LU con e senza pivot delle seguenti matrici:

B1 =

−9 3 −1 1 2

2 −7 3 1 1

1 2 −8 3 −2

−1 1 −1 −7 3

−2 −1 1 4 −8

,

B2 =

−4 3 0 0 0

2 −5 3 0 0

0 3 −6 3 0

0 0 4 −7 3

0 0 0 5 −8

,

B3 =

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

,

B4 =

4 −1 −2 0 0 0

−2 5 −1 1 0 0

1 −3 8 2 1 0

0 −1 3 −7 −1 1

0 0 −1 2 6 −1

0 0 0 −2 1 4

,

B5 =

3 −1 0 3 0 0 0 0 0

−2 4 −1 0 −2 0 0 0 0

0 −2 5 0 0 −1 0 0 0

2 0 0 −5 1 0 2 0 0

0 5 0 1 6 −1 0 1 0

0 0 4 0 −1 4 0 0 −1

0 0 0 −3 0 0 −7 −1 0

0 0 0 0 4 0 2 6 −1

0 0 0 0 0 −2 0 1 4

,

e osservare in quali casi le matrici L e U conservano la struttura di sparsit´ a

della matrice iniziale.

Riferimenti

Documenti correlati

• Al fine di consentire l’immissione sul mercato di nuovi prodotti ortofrutticoli pronti al consumo, si chiede di verificare la possibilità di aggiornare la normativa

corresponsione degli oneri a seguire. I rilevati saranno computati geometricamente con il sistema delle sezioni ragguagliate, senza tener conto di cali di

Per quanto riguarda invece i dati cosiddetti sensibili, relativi a particolari oneri deducibili o per i quali è riconosciuta la detrazione d’imposta, alla scelta dell’otto per

Sono possibili diverse costruzioni del tetto come tetto piano, tetto piano ricoperto di verde, tetto a due falde, tetto a padiglione ecc.... Per la compatibilità elettromagnetica,

This work provided an important clinical rationale for pursuing brain perfusion SPECT studies in that cognitive development of the child seemed to be related to changes

Potevamo osservare dall’inizio che, poich´e B appartiene al piano di vista, viene trasformato in se stesso dalla proiezione.. 

[r]

La forza magnetica si ottiene sostituendo nella espressione della forza magnetica la nuova espressione della corrente che scorre