Matrici - Ingegneria Medica

Transcript

Matrici - Ingegneria Medica
1
Matrici: Definizioni e Proprietà.
Definizione: Matrice
Si dice Matrice reale A del tipo (m, n) l’insieme di mxn numeri reali disposti su m righe ed n
colonne come segue:
a11 a12
a21 a22
…
am1 am2
…
…
…
…
a1n
a2n
amn
Definizione: Matrice NULLA
Una matrice A si dice nulla se ha tutti gli elementi uguali a 0. La si indica sinteticamente anche con
A=0
Definizione: Matrici dello stesso tipo
Due matrici A e B si dicono dello stesso tipo se hanno lo stesso numero di righe e di colonne.
Definizione: Matrici EGUALI
Due matrici A e B si dicono eguali se hanno lo stesso numero di righe e di colonne e tutte le
componenti corrispondenti identiche.
La relazione di eguaglinza tra matrici gode delle proprietà Riflessiva A=A, Simmetrica se A=B
segue B=A e Transitiva se A=B e B=C segue che A=C.
Definizione: Matrice RIGA e Matrice COLONNA
Si dice matrice (o vettore) riga/colonna una matrice con un’unica riga/colonna, cioè una matrice del
tipo (1, n)/(m, 1).
Definizione: Matrice quadrata, diagonale principale e secondaria, elementi coniugati.
Una matrice è quadrata se è del tipo (n,n);
a11 a12
a21 a22
…
an1 an2
…
…
…
…
a1n
a2n
ann
Gli elementi a11 , a22 , …, ann costituiscono la diagonale principale, gli elementi an1 , …, a1n quella
secondaria.
Gli elementi aik e a ki, con gli stessi indici ma in ordine inverso si dicono coniugati e i loro posti
sono simmetrici rispetto alla diagonale principale.
Definizione: Matrice Identità (o Unità)
Una matrice Identità è una matrice quadrata del tipo (n,n) con tutti gli elemeti della diagonale
principale uguali a 1 e tutti i restanti nulli.
1
0
0
0
1
…
0
…
…
…
…
0
0
…
1
2
Definizione: Matrice Trasposta
Si dice Matrice trasposta di A del tipo (mxn) e la si indica con AT la matrice ottenuta dalla A
trasformando ordinatamente le righe di A in colonne di AT che sarà del tipo (nxm)
A=
AT =
a11 a12
a21 a22
…
am1 am2
…
…
…
…
a1n
a2n
a11 a21
a12 a22
…
a1n a2n
…
…
…
…
am1
am2
amn
amn
Definizione: Somma di matrici
La matrice somma di due matrici A e B dello stesso tipo mxn e una matrice C del tipo mxn ottenuta
sommando gli elementi corrispondenti delle due matrici A e B.
PROPRIETA’ delle matrici rispetto alla SOMMA
L’insieme delle matrici del tipo (m, n) formano un gruppo commutativo rispetto all’operazione di
somma:
1. La somma è una legge di composizione interna;
2. E’ associativa (A+B)+C = A+(B+C)
3. E’ commutatica A+B = B+A
4. Ha per elemento neutro la matrice Nulla A+ 0 = 0+A=A
5. Ogni matrice è dotata di un’opposta ottenuta da A cambiando il segno di tutte le componenti
e si indica con (–A) tale che A+(-A)=0
Vale inoltre la legge di semplificazione : se A+C = B+C segue che A=B
Definizione: Prodotto di matrici
La matrice prodotto di due matrici A e B è possibile solo se il numero di colenne della prima
matrice coincide con il numero di righe della seconda. In altri termini A deve avere dimensione
mxp, B pxn.
Il prodotto è la matrice C del tipo (m,n) ottenuta moltiplicando i termini di ogni riga di A con i
corrispondenti termini delle colonne di B e sommando i prodotti tra loro nel seguente modo:
a11 a12
a21 a22
x
b11 b12 b13
b21 b22 b23
=
(a 11 .b 11 +a 12 .b 21 ) (a 11 .b 12 +a 12 .b 22 ) (a 11 .b 13 +a12.b23)
(a 21 .b 11 +a 22 .b 21 ) (a 21 .b 12 +a 22 .b 22 ) (a 21 .b 13 +a22.b23)
PROPRIETA’ delle matrici rispetto al PRODOTTO
Se la prima matrice è del tipo (m, p) e la seconda (p, n)
1. il prodotto di due matrici è una legge di composizione interna;
2. E’ associativa (A*B)*C = A*(B*C)
3
INOLTRE
• NON vale la proprietà COMMUTATIVA A * B ≠ B * A
(evidente se di ordini mxp e pxn con m diverso da n, ma non vale anche se le matrici sono nxn)
• NON vale la legge di annullamento del PRODOTTO
A * B = 0 non segue A = 0 ∨ B = 0
 1 0
0 0 
0 0 


A =  2 0 ≠ 0 B = 
≠ 0 A * B = 0 0  = 0

3 4 
 −1 0
0 0 
• NON vale la legge di semplificazione
 1 0
1 2
1 2 
1 2
1 2 




A =  2 0 B = 
C=
A * B =  2 4  = A * C =  2 4 


3 4 
1 1 
 −1 0
 −1 −2
−1 −2
• Vale la proprietà (A*B)T = BT *AT
• Vale la proprietà distributiva a sinistra del prodotto rispetto alla somma
A*(B+C)=A*B+A*C
• Vale la proprietà distributiva a destra del prodotto rispetto alla somma
(B+C)*A=B*A+C*A
Definizione: Detrminate di una matrice quadrata
Ad ogni matrice quadrata è associato un numero che si chiama determinante.
Definizione: Minore complementare di un elemento di una matrice quadrata
Si dice minore complementare di un elemento aik di una matrice quadrata A di ordine n e lo si
indica con Mik il determinante della matrice quadrata di ordine n-1 che si ottiene dalla A eliminando
tutti gli elementi della riga e della colonna a cui appartiene aik come segue:
A=
A=
a11 a12 a13
a21 a22 a23
a31 a32 a33
a11 a12 a13
a21 a22 a23
a31 a32 a33
il minore compl. di a11 è
il minore compl. di a12 è
M11 =
[ M12 ] =
a22 a23
a32 a33
a21 a23
a31 a33
Definizione: Complemento algebrico di un elemento di una matrice quadrata
Si dice complemento algebrico di un elemento aik di una matrice quadrata A di ordine n e lo si
indica con Aik il minore complementare Mik preceduto dal segno positivo se i+k è pari, negativo se
dispari.
Aik =(-1)i+k .Mik
Il calcolo del determinante può essere definito ricorsivamente nel seguente modo:
• Il determinante di una matrice A del tipo(1,1) è il valore della sua unica componente e si
indica con A = aik
4
•
Il determinante di una matrice A del tipo(n,n) lo si ottiene come somma dei prodotti di
ciascun elemento di una linea qualsiasi per il determinante del rispettivo complemento
algebrico.
Definizione: INVERSA di una matrice quadrata
Si dice inversa di una matrice quadrata A, se esiste, la matrice A-1 tale che:
A* A-1 = A-1 *A=I
Teorema: di esistenza dell’inversa di una natrice quadrata.
Ogni matrice quadrata con determinante non nullo ammette un’unica matrice inversa A-1 .
Regola per calcolare l’inversa di una matrice:
Si determina una matrice [aik ] tale che ogni elementoα IK =
AIK
e si esegue la sua trasposta [a ki]. In
A
altri termini
A-1 =[ a ki ]. Esempio:
1
A= 1 2
A =3
[a ik ]= 3
-1 1
2
−
3
-1
Verificare eseguendo A*A =I
−
−1
3
1
3
1
A-1 =[a ki]= 3
1
3
−2
3
1
3
Definizione: Matrice diagonale
Si dice matrice diagonale una matrice quadrata che ha tutti i termini nulli tranne quelli della
diagonale principale.
Definizione: Matrice tringolare superiore (inferiore)
Si dice matrice triangolare superiore (inferiore) una matrice quadrata che ha nulli i termini aik=0 se
i>k (aik =0 se i<k)
a11 0
Mat. Diagonale  0 a22
 0
0
0 
a11 a12

0  Mat. Tringolare sup.  0 a22
 0
a33 
0
a13 
a11 0

a23  inferiore a21 a22
a31 a32
a33 
0 
0 
a33 
PROPRIETÀ dei determinati
• Una matrice quadrata e la sua trasposta hanno lo stesso determinante.
•
Se una riga (o una colonna) di una matrice quadrata ha tutti gli elementi nulli il determinante
è 0.
•
•
Scambiando fra loro due righe (o due colonne) il determinante cambia di segno
Se in una matrice quadrata due righe o due colonne hanno gli elementi proporzionali il
determinante è nullo
•
Se si moltiplicano gli elementi di una riga o colonna per una costante reale k, il determinante
della matrice resta moltiplicato per k.
•
Il determinante di una matrice non cambia se ad una linea si aggiuge una linea parallela
moltiplicata per un numero k
5
•
Il determinanate della matrice prodotto è uguale al prodotto dei determinanti
•
Una matrice con determinate nullo si dice singolare o degenere viceversa non singolare o
regolare
•
Il determinante di una matrice diagonale o triangolate è uguale al prodotto degli elementi
della diagonale.
PROPRIETA’ delle matrici quadrate di ordine n con determinate NON nullo rispetto al
PRODOTTO
L’insieme delle matrici del tipo (n, n) formano un gruppo non commutativo rispetto
all’operazione di moltiplicazione:
3. il prodotto di due matrici del tipo (n,n) è una legge di composizione interna;
4. E’ associativa (A*B)*C = A*(B*C)
5. Ha per elemento neutro la matrice Identità A*I = I*A=A
6. Ogni matrice con determinante non nullo è dotata di un’inversa che si indica con A-1 tale che
A-1 *A=A*A-1 =I
INOLTRE (per le matrici quadrate)
• NON vale la proprietà COMMUTATIVA
• NON vale la legge di annullamento del PRODOTTO
• se de terminante di C non è nullo vale la legge di semplificazione :
A*C = B*C segue che A=B
Infatti C-1 esiste, quindi A*C*C-1 =B*C*C-1 da cui A*I=B*I da cui A=B
• Vale la proprietà (A*B)-1 =B-1 *A-1
• Vale la proprietà distributiva a sinistra del prodotto rispetto alla somma
A*(B+C)=A*B+A*C
• Vale la proprietà distributiva a destra del prodotto rispetto alla somma
(B+C)*A=B*A+C*A
6
Progetto della classe matrici
Sulla base delle proprietà elencate si potrebbe realizzare la seguente classe:
Quali attributi:
Quali costruttori:
Quali metodi
Statici e/o dinamici
Matrice
- double[][] A;
+Matrice(double[][] a) ;
+Matrice(double[]a, int c) ;
+Matrice(int r, int c, double mn, double mx) ;
+Matrice(int r, int c) ;
+toString() :String ;
+sum(Matrice b) : Matrice;
+static sum(Matrice a, b) : Matrice;
+per(Matrice b) : Matrice;
+static per(Matrice a, b) : Matrice;
+opp() : Matrice;
+det() : double;
+inv() : Matrice;
+mco() : Matrice;
Esempio di metodo ricorsivo:
metodo Fattoriale di N.
Se N=0; fat(0)=1; (oppure N=1; fat(1)=1);
Se N>1; fat(N)=N*fat(N-1);
Ecco il metodo statico fattoriale in Java:
Nella classe Mia codifico il metodo statico:
public class Mia{
public static long fat(long n) {
if (n==0) return 1;
else return n*fat(n-1);
}
}
esempio di invocazione nel main()
long R=Mia.fat(7);
System.out.println( R );
7
Soffermianoci sul determinante:
Definizione ricorsiva di determinante
Se n=1 segue det(A,1) = A[0][0];
se n>1 segue det(A,n) =
n −1
∑ (−1)
0+k
⋅ A[0][k ] ⋅ det( A0 k , n − 1)
k =0
ATTRIBUTO CLASSE:
double[][] A;
public double det() {
// metodo dinamico della classe Matrice
double d=0 ;
if (A.length != A[0].length) { System.out.print("Dim. Illegittima"); System.exit(1); }
else if (A.length==1) d=A[0][0] ;
else for (int c=0 ; c<A.length; c++)
if (c%2==0) d=d+A[0][c]*(mco(0,c)).det();
else d=d - A[0][c]*(mco(0,c)).det();
return d;
}
public Matrice mco(int r, int c) {
// restituisce la matrice coniugata di a(r,c) ;
int R=A.length; int C=A[0].length;
double[][] m=new double[R-1][C-1];
if (r<R && c<C) {
for (int i=0; i<R; i++) {
for (int j=0; j<C; j++){
if (i<r && j<c) m[i][j]=A[i][j];
else if (i>r && j>c) m[i-1][j-1]=A[i][j];
else if (i>r && j<c) m[i-1][j]=A[i][j];
else if (j>c && i<r) m[i][j-1]=A[i][j];
}
}
} else {
System.out.println("parametri illegittimi.");
System.exit(1);
}
Matrice Ris=new Matrice(m);
return Ris;
}
Esempio di invocazione nel main();
double[][] a={{1,3},{2, 5}};
Matrice M=new Matrice(a);
double D=M.det();
System.out.println(D);
8
Sistemi lineari come modello applicativo per le matrici:
Rappresentazione di un sistema con matrici.
Un sistema lineare di n equazioni in n incognite
a11 x1 + a12 x2 + ... + a1n xn = b1

a x + a22 x2 + ... + a2n xn = b2
(1)  21 1
..........
an1x1 + an 2 x2 + ... + ann xn = bn
Può essere rappresentato dalle seguenti matrci
 a11 a12
a
a22
A =  21
 ... ....

an1 an 2
... a1n 
... a2n 
... ... 

... ann 
 x1 
x 
X =  2
 ... 
 
 xn 
 b1 
b 
B =  2
 ... 
 
bn 
A matrice dei coefficienti, X vettore colonna delle incognite, B Vettore colonna dei termini noti.
Si nota che, sulla base delle proprietà del prodotto definito sulle matrici, il sistema (1) può essere
rappresentato dal prodotto
 a11 a12 ... a1n   x1   b1 
a
a22 ... a2n   x2   b2 
*
(2)
A*X=B
infatti  21
=
 ... .... ... ...   ...   ... 

    
an1 an 2 ... ann   xn  bn 
La scrittura del sistema (1) è identica alla (2).
Esempio di sistema lineare in due incognite :
 x+y =3
 1 1  x  3 
(3) 
può essere scritto 
 *   =   eseguendo il prodotto si ottiene:
 −1 −2   y   −5 
−1x − 2y = −5
1x 1y  3 
 −1x − 2y  =  −5  che coincide con (3)

  
Risoluzione del sistema con il metodo della matrice inversa.
Ricordando le proprietà del prodotto e dell’esistenza della matrice inversa si possono eseguire le
seguenti deduzioni:
Se A ≠ 0 ⇒ ∃ A −1 quindi se A * X = B ⇒ A −1 A * X = A −1B ⇒ I * X = A−1 * B ⇒ X = A −1 * B
Da queste deduzioni segue che la soluzione X di un sistema con determinante dei coefficienti A
non nullo lo si ottiene moltiplicando l’inversa A-1 per il vettore dei termini noti B.
9
Esempio soluzione sitema (3)
A
 x+y =3
1 1
determinante A = 
= -1 matrice [α IK ] =  IK


 A
− x − 2y = −5
 −1 −2 
 −2
 AIK   −1
[αIK ] =   =  −1
 A  
 −1
1
−1
 da cui
1
−1
2
[αKI ] = A−1 =  −1

1
da cui
−1

 ovvero

2
[ X ] =  −1

1   3   1
*
=
−1  −5   2
Algoritmo: Progettare un programma (e le classi necessarie) che risolva sistemi lineari nxn
utilizzando il metodo dell’inversa.
Indicazioni per un prototipo della classe Sistema:
Sistema
- MC, MN, MCO :Matrice;
+ Sistema(a[][], b[]:double)
+ Sistema(a, b:Matrice)
+ toString() : String ;
+ solInversa() : Matrice ;
(sai costruire un metodo per eseguire il prodotto di matrici? qual è l’algoritmo “migliore” per
determinare l’inversa di una matrice ? )
Risoluzione del sistema con il metodo di Cramer.
Teorema di Cramer:
Se il determinante A dei coefficienti del sistema è diverso da zero, il sistema ammette una ed una
sola soluzione data da
D
D
D
x1 = 1 x2 = 2 ........ xn = n
A
A
A
Dove Di rappresentano i determinanti che si ottengono dalla matrice dei coefficienti sostituendo la
colonna i-esima con la colonna dei termini noti B.
Esempio soluzione sitema (3)
1 1
 x+y =3
A =

 = -1
− x − 2y = −5
 −1 −2 
D1 =
x=
3
1
= −1
−5 −2
−1
=1
−1
y=
D2 =
1 3
= −2
−1 −5
−2
=2
−1
Algoritmo: Progettare un programma (e le classi necessarie) che risolva sistemi lineari nxn
utilizzando il metodo di Cramer.
Indicazioni per un prototipo della classe Sistema:
10
Sistema
- MC, MN, MCO :Matrice;
+ Sistema(a[][], b[]:double)
+ Sistema(a, b:Matrice)
- sost(i : int) :Matrice
+ cramer() : Matrice ;
+ toString() :String ;
(sai costruire un metodo per calcolare il determinante di una matrice “qual è il modo più
efficiente”? Sai costruire un metodo che sostituisca un vettore colonna di una matrice A nxn con il
vettore dei termini noti B ? )
Se non ci occupiamo dell’EFFICIENZA il metodo di Cramer potrebbe essere:
public Matrice cramer() {
int N=MC.length;
double D=MC.det() ;
// determinante dei coefficienti
double x[]=new double[N] ;
// vettore delle soluzioni
double dris[]=new double[N] ;
// vettore dei determinanti ott. Sost. I termini noti.
double tutti=0;
// se tutti i dris[]=0, tutti=0;
for (int i=0 ; i<N ; i++){
Matrice M=MC.sost(i);
dris[i]=M.det();
tutti=tutti+Math.abs(dris[i]);
}
if (D!=) {
for (int i=0 ; i<N ; i++)
x[i]=dris[i]/D;
}
else if (tutti==0) { System.out.println(“Sistema indeterminato.”); System.exit(1); }
else { System.out.println(“Sistema impossibile.”); System.exit(1); }
Matrice R=new Matrice(x,1);
Return R;
}
il main(), farebbe uso delle classi Matrice, Sistema e invocherebbe:
double[][] a={{1,2,3 },{1,0,1 },{0,4,-2 } };
double[] b={4,2,1 };
Sistema S=new Sistema(a,b);
System.out.println(S);
Matrice r=S.cramer();
System.out.println( r) ;
11
Risoluzione del sistema con il metodo della matrice Triangolare Superiore
(Gauss).
Regola di costruzione della matrice triangolare superiore:
• Si scrive la matrice dei coefficienti e si aggiunge ad essa la colonna dei termini noti
 a11 a12 ... a1n b1 
a

 21 a22 ... a2n b2 
 ... ... ... ... ... 


an1 an 2 ... ann bn 
1. SE a11 = ZERO
ALLORA Si scambia la 1° riga con una qualsiasi riga con il primo elemento
diverso da ZERO
a21
e si sottrae la riga così ottenuta
2. Si moltiplicano tutti termini della 1° riga per
a11
 a11 a12
 0 a*
22
dalla seconda 
 ... ...

an1 an 2
... a1n
... a2* n
... ...
... ann
b1 
b2* 
... 

bn 
3. Si ripete in generale la moltiplicazione della 1° riga per il termine
•
aK 1
e si sottrae la
a11
riga così ottenuta dalla k.esima riga. Si ottiene:
a11 a12 ... a1n b1 
 0 a * ... a * b * 
22
2n
2

 ... ... ... ... ... 

*
*
*
 0 an 2 ... ann bn 
*
Si ripetono le operazioni (1) (2)(3) per la sottomatrice che inizia con a22
e per le
sottomatrici a*kk successive ottenendo una matrice triangolare superiore:
a11 a12 ... a1n b1 
 0 a * ... a *
b2* 
22
2n

 ... ... ... ... ... 


**
0 ... ann
bn** 
0
• Si ricava xn e si sostituisce a ritroso per ricavare le altre incognite.
bn**
xn = **
ann
Esempio soluzione sitema (3)
1 3 
 x+y =3
1
inizio 


− x − 2y = −5
 −1 −2 − 5 
12
1 1 3 
 0 −1 − 2 


y=
−2
= 2 sostituendo 2 nella 1° riga (1 1*2
−1
3) e ricavando si ha x=3-2=1
Algoritmo: Progettare un programma (e le classi necessarie) che risolva sistemi lineari nxn
utilizzando il metodo di Gauss.
Indicazioni per un prototipo della classe Sistema:
Sistema
- MC, MN, MCO :Matrice;
+ Sistema(a[][], b[]:double)
+ Sistema(a, b:Matrice)
+ gauss() : Matrice ;
((1)sai costruire un metodo per ottenere da una matrice COMPLETA (n,n+1) una matrice
triangolare superiore, applicando correttamente le proprietà? (2) Sai sostituire a ritroso da una
matrice triangolare superiore per ottenere le soluzioni ? )
(1) in quale classe collocare il metodo (MATRICE o SISTEMA) (?).triangolaGauss():Matrice;
(2) IDEM (?).sostRitroso() : Matrice;
13
Risoluzione del sistema con il metodo della matrice Diagonale (Gauss-Jordan).
Regola di diagonalizzazione:
•
Si scrive la matrice dei coefficienti e si aggiunge ad essa la colonna dei termini noti
 a11 a12 ... a1n b1 
a

 21 a22 ... a2n b2 
 ... ... ... ... ... 


an1 an 2 ... ann bn 
1. SE a11 = ZERO
ALLORA Si scambia la 1° riga con una qualsiasi riga con il primo elemento
diverso da ZERO
ALTRIMENTI Si divide la 1° riga per a11
*
 1 a12
... a1*n b1* 


a21 a22 ... a2n b2 
 ... ... ... ... ... 


an1 an 2 ... ann bn 
2. Si moltiplicano tutti termini della 1° riga per a21 e si sottrae la riga così ottenuta
*
 1 a12
... a1*n b1* 


*
0 a22
... a2* n b2* 

dalla seconda
 ... ... ... ... ... 


an1 an 2 ... ann bn 
3. Si ripete in generale la moltiplicazione della 1° riga per il termine aK 1 e si sottrae la
riga così ottenuta dalla k.esima riga. Si ottiene:
*
 1 a12
... a1*n b1* 

*
*
*
 0 a22 ... a2n b2 
... ... ... ... ... 

*
*
*
 0 an 2 ... ann bn 
•
•
*
Si ripetono le operazioni (1) (2)(3) per la sottomatrice che inizia con a22
e per le
sottomatrici a*kk successive e precedenti ottenendo una matrice diagonalizzata:
 1 0 ... o b1** 

** 
 0 1 ... 0 b2 
... ... ... ... ... 

** 
 0 0 ... 1 bn 
L’ultima colonna contiene il vettore delle soluzioni X
Esempio soluzione sitema (3)
1 3 
 x+y =3
1
inizio 


− x − 2y = −5
 −1 −2 − 5 
1) Si divide la prima riga per a11 =1 (nulla cambia).
2) Si moltiplica la 1° riga cosi ottenuta per a21= –1 ottenendo (-1 -1 –3).
14
3) La si sottrae dalla seconda ottenedo
1 1 3 
 0 −1 − 2 


1) Si divide la seconda riga per a22 = –1, e si ottiene (0, 1, 2).
2) Si moltiplica la seconda riga per a12=-1 (nulla cambia).
3) Si sottrae la seconda riga cosi ottenuta (0, 1, 2) dalla prima ottenedo (1 0 1).
La matrice diagonalizzata sarà
 1 0 1
0 1 2 


Le soluzioni sono nella terza colonna x=1 y=2.
Algoritmo: Progettare un programma (e le classi necessarie) che risolva sistemi lineari nxn
utilizzando il metodo di Gauss-Jordan.
Indicazioni per un prototipo della classe Sistema:
Sistema
- MC, MN, MCO :Matrice;
+ Sistema(a[][], b[]:double)
+ Sistema(a, b:Matrice)
+ gaussJordan() : Matrice
((1) sai costruire un metodo per diagonalizzare una matrice (n,n+1) applicando correttamente le
proprietà? (2)Successivamente sai costruire un metodo per estrarre la colonna delle soluzioni?)
1) in quale classe collocare il metodo (MATRICE o SISTEMA)
(?).diagonaleGaussJordan():Matrice;
2) IDEM
(?).getCol(int i) : Matrice;
15
Complessità di calcolo e instabilità dei sistemi.
La complessità
Definizione : Si chiama complessità di calcolo in tempo di un algoritmo applicato a n dati e lo si
indica con O(n) il numero di operazioni che è necessario eseguire perché l’algoritmo termini. Tale
numero deve essere espresso in funzione di n.
La complessità viene distinta in complessità minima (caso migliore) complessità massima (caso
peggiore) e complessità media (caso medio)
Esempi:
• Se si costruisce un algoritmo di ricerca di un elemento su un array di n componenti la
complessità in tempo sarà:
minima O(n)=1 (eseguo solo una operazione di confronto se l’elemento cercato è il primo)
massima O(n)=n (eseguo n confronti se l’elemento cercato è l’ultimo)
media O(n)=n/2 (se eseguo la ricerca per distribuzioni casuali avrò mediamente n/2 confronti)
•
Se si costruisce un algoritmo di ordinamento bubble sort che si interrompe se dopo n-1
confronti non ho eseguito scambi la complessità in tempo sarà:
minima O(n)=n-1 confronti) + 0 scambi (se i dati sono ordinati)
massima O(n)=(n-1)+(n-2)+ … +(1) (confronti) + (n-1)+(n-2)+ … +(1) (scambi) =(n)(n-1) circa n2
operazioni (se i dati sono in ordine inverso)
media O(n)=sarà un valore mediano ma sempre dipendente da n2 (se eseguo la ricerca per
distribuzioni casuali)
Conclusioni:
Gli algoritmi con complessità proporzionale a n oppure n*log(n) sono “buoni algoritmi”.Se la
complessità di calcolo è proporzionale a (n2 ) o superiore, al crescere di n il tempo di calcolo può
diventare molto pesante.
Se l’algoritmo esegue operazione aritmetiche gli errori di arrotondamento possono diventare molto
sensibili.
Metodi di soluzione dei sistemi e complessità di calcolo:
Il calcolo del determinante di una matrice, facendo uso della definizione ricorsiva, ha una elevata
complessità (e quindi tempo elevato ed errori sensibili al crescere di n).
Operazioni
Somme + prodotti + n*(op_minore)
Detrminante n=2
(2-1)+2+2*0=3
2!=2
n=3
(3-1)+3+3*3=14
3!=6
n=4
(4-1)+4+4*14 =63
4!=24
n=5
(5-1)+5+5*63=324
5!=120
n=6
(6-1)+6+6*324=1955
6!=720
Il metodo della matrice inversa deve fare i conti con il calcolo di molti determinanti (necessari per
trovare l’inversa) quindi, in assenza di metodi diversi (più rapidi) per invertire una matrice,
dobbiamo soprassedere.
Per la complessità di calcolo è opportuno scartare anche Cramer. E’ sempre necessario calcolare
n+1 determinanti.
16
La complessità di calcolo del metodo di Gauss è quella preferibile. Anzi, con il metodo di Gauss si
può anche trovare il determinante di una matrice abbassando notevolmente la complessità di
calcolo rispetto all’utilizzo della definizione ricorsiva di determinante.
Il metodo di Gauss-Jordan esegue un numero circa doppio di operazioni rispetto al metodo di Gauss
ma è molto utile per calcolare l’inversa di una matrice perché riduce notevolmente la complessità
di calcolo rispetto alla definizione matematica di inversa.
L’instabilità
Anche utilizzando il metodo di Gauss si ottengo a volte risultati “errati” ovvero molto distanti da
quelli corretti. In questi casi si dice che il sistema è instabile.
Un sistema è instabile se ha un determinante “molto prossimo” allo ZERO.
Non sempre si riesce ad evitare tale instabilità anche se parte di questa può essere annullata
attraverso i metodi di Gauss e GausJordan calcolando preventivamente il determinante del sistema.
Conclusioni:
Per ragioni di complessità di calcolo si scarta il metodo di Cramer perché è sempre necessario
calcolare n+1 determinanti. Rimangono “accettabili” nell’ordine i metodi di Gauss, Gauss-Jordan e
Inversa (nell’ultimo caso solo se si determina A-1 con il metodo di Gauss-Jordan).
Tecnica per determinare la Matrice Inversa (metodo di Gauss-Jordan)
Il procedimento illustrato ha il pregio di abbassare la complessità di calcolo insita nella
determinazione della matrice inversa, che per la definizione matematica, implica il calcolo di molti
determinanti.
Partendo dalla matrice (3,3) seguente:
1 −1 −1
A = 1 1 2 
1 1 1 
Si procede costruendo la matrice (3, 6) che contiene a destra la matrice identità:
1 −1 −1 1 0 0 
M = 1 1 2 0 1 0 
1 1 1 0 0 1
Ora si opera per ottenere a sinistra la matrice Identità, al termine dei calcoli la matrice (3,3) di
destra conterrà la matrice inversa di quella di partenza.
Ciclo di Colonna (colonna uno):
1 -1 -1 1 0 0
1 1 2 0 1 0
1 1 1 0 0 1
Si fa “perno” su a00 per rendere nulli tutti gli elementi sotto di esso.
1° operazione: se a00 fosse ZERO occorre scambiare tutta la riga con una riga il cui primo
elemento sia diverso da ZERO.
2° operazione: si “normalizza” la riga uno (R0) dividendo tutti gli elementi per a00 in modo
che a00 divenga 1 (in questo caso lo è già)
17
Ciclo di riga: (Seconda riga)
3° operazione: si ottiene la “nuova” seconda riga( R1)=R1-R0*a10
1
0
1
-1
2
1
-1
3
1
1
-1
0
0
1
0
0
0
1
Ciclo di riga: (Terza riga)
4° operazione: si ottiene la “nuova” terza riga( R2)=R2-R0*a20
1 -1 -1 1 0 0
0 2 3 -1 1 0
0 2 2 -1 0 1
Ciclo di Colonna (colonna due):
1 -1 -1 1 0 0
0 2 3 -1 1 0
0 2 2 -1 0 1
Si fa “perno” su a11 per rendere nulli tutti gli elementi sotto e sopra di esso.
1° operazione: se a11 fosse ZERO occorre scambiare tutta la riga con una riga il cui secondo
elemento sia diverso da ZERO.
2° operazione: si “normalizza” la riga due (R1) dividendo tutti gli elementi per a11 in modo
che a11 divenga 1 (in questo caso si divide per 2)
1
-1
-1
1
0
0
0
1
3/2 -1/2 1/2 0
0
2
2
-1
0
1
Ciclo di riga: (Terza riga)
3° operazione: si ottiene la “nuova” terza riga( R2)=R2-R1*a21
1
-1
-1
1
0
0
0
1
3/2 -1/2 1/2 0
0
0
-1
0
-1
1
Ciclo di riga: (Prima riga)
4° operazione: si ottiene la “nuova” prima riga( R0)=R0-R1*a21
1
0
1/2 1/2 1/2 0
0
1
3/2 -1/2 1/2 0
0
0
-1
0
-1
1
Ciclo di Colonna (colonna tre):
1
0
0
0
1
0
1/2
3/2
-1
1/2 1/2
-1/2 1/2
0
-1
0
0
1
Si fa “perno” su a22 per rendere nulli tutti gli elementi sopra di esso.
1° operazione: se a22 fosse ZERO il determinante sarebbe ZERO e il procedimento FINITO.
(NON è possibile calcolare l’inversa di un Determinante NULLO)
2° operazione: si “normalizza” la riga tre (R2) dividendo tutti gli elementi per a22 in modo
che a22 divenga 1 (in questo caso si divide per -1)
1
0
1/2 1/2 1/2 0
0
1
3/2 -1/2 1/2 0
0
0
1
0
1
-1
18
Ciclo di riga: (Seconda riga)
3° operazione: si ottiene la “nuova” seconda riga( R1)=R1-R2*a12
1
0
1/2 1/2 1/2 0
0
1
0
-1/2 -1
3/2
0
0
1
0
1
-1
Ciclo di riga: (Prima riga)
4° operazione: si ottiene la “nuova” prima riga( R0)=R0-R2*a02
1
0
0
1/2 0
1/2
0
1
0
-1/2 -1
3/2
0
0
1
0
1
-1
Si è ottenuta la matrice identità e il procedimento ha termine con il seguente risultato:
1
 1
0
 2
2


1
3
−1

A = −
−1
 2
2


1 −1
 0

