Inversa di una matrice quadrata

Transcript

Inversa di una matrice quadrata
Inversa di una matrice quadrata
L’operatore inv() inverte una matrice quadrata non singolare (cioè in cui il determinate è
diverso da zero).
… richiami di algebra lineare
TRASPOSIZIONE
DI MATRICE
Il calcolo del determinante di una matrice quadrata del 3° ordine si sviluppa secondo gli
elementi di una riga o di una colonna.
Nell’esempio sviluppiamo secondo la prima riga
DETERMINANTE
DI UNA MATRICE
Ogni elemento della prima riga viene moltiplicato con il suo minore complementare, ovvero il
determinante del 2° ordine ottenuto sopprimendo la prima riga e la prima colonna; i prodotti
vengono poi sommati algebricamente tra loro considerando il segno positivo se la somma degli
indici dell’elemento considerato è pari, o negativo se è dispari.
Sviluppando i tre determinanti del 2° ordine, si ottiene:
N.B. Il determinante di una matrice quadrata non cambia se lo sviluppo viene eseguito rispetto
ad una qualsiasi altra riga (non solo la prima) o un’altra colonna.
Una matrice quadrata A (nxn) è detta invertibile se esiste una matrice B (nxn) tale che:
AB=BA=In
dove In denota la matrice identità nxn.
Esistono vari metodi per il calcolo dell’inversa di una matrice quadrata invertibile A.
Consideriamo il metodo della matrice dei cofattori, che risulta rapido quando non interessa
calcolare tutti gli elementi della matrice inversa e quando la matrice è di dimensione contenuta.
MATRICE DEI
COFATTORI (o dei
complementi algebrici)
Il cofattore in posizione i,j è definito come:
dove minor(A,i,j) rappresenta il minore di A che si ottiene cancellando la riga i-esima e la
colonna j-esima.
Il segno (-1)i+j varia nel modo seguente:
Esempio:
La matrice inversa di una matrice 2x2 invertibile
è la seguente
Data invece una matrice 3x3 invertibile
la sua inversa è
Somma di tutti gli elementi per riga o colonna
Un operatore di fondamentale utilizzo è sum(), che somma gli elementi della matrice.
L’operazione di somma avviene di default per colonna, ma è altresì possibile effettuarla per
riga specificando sum(matrice,2).
Prodotto di tutti gli elementi per riga o colonna
Analogo è il comando prod() che applica il prodotto.
Autovalori di una matrice
Data una matrice quadrata A i suoi autovalori, siano essi reali o complessi, sono calcolati
con rapidità e memorizzati in un array tramite la funzione eig().
… richiami di algebra lineare
Data una matrice quadrata A si definiscono autovalori e autovettori rispettivamente quei
valori reali o complessi e quei vettori non nulli che verificano il sistema:
Tale sistema è equivalente al sistema omogeneo:
che ammette soluzioni non banali (u0) se e solo se  è tale che:
Si verifica che tale determinante coincide con un polinomio di grado n (Polinomio
caratteristico):
Pertanto gli autovalori di una matrice, che sono gli zeri di tale polinomio, sono, contando la
molteplicità, n.
L’insieme formato con tali autovalori si denota con (A).
… richiami di algebra lineare
Quindi se A è una matrice quadrata, un autovalore di A è un numero che, se sottratto a
ciascun elemento della diagonale di A, trasforma A in una matrice singolare (determinante
nullo).
Esempio)
Sia data la matrice diagonale A=(2 3; 0 3)
Se sottraiamo 2 a ciascun elemento della diagonale si ottiene la matrice singolare (0 3; 0 1)
Inoltre se si sottrae 3 si ottiene la matrice singolare (-1 3; 0 0)
Quindi 2 e 3 sono autovalori della matrice A
Dimensioni di una matrice
Assegnata la matrice A per sapere le sue dimensioni si usa l’istruzione
>>p = size(A)
Questa fornisce un vettore a due componenti; la prima componente indica il numero di righe, la
seconda quello delle colonne.
Il numero delle righe si può leggere con
>>a = size(A,1)
mentre il numero delle colonne si può leggere con
>>b = size(A,2)
oppure con
>>b = p(2)
Analisi degli elementi di una matrice
Se si vogliono localizzare gli elementi di una matrice che soddisfano una data condizione si usa
l’istruzione find.
Così, indicata con M una matrice, le istruzioni:
• f=find(M) crea un vettore f i cui elementi sono gli indici della matrice M corrispondenti
agli elementi della matrice diversi da zero.
• g=find(M>2) crea un vettore g i cui elementi sono gli indici della matrice M
corrispondenti agli elementi della matrice maggiori di 2.
• s=find(M<0) crea un vettore s i cui elementi sono gli indici della matrice M
corrispondenti agli elementi negativi della matrice.
Vettore con elementi in progressione aritmetica
Un uso frequente è quello di creare una sequenza nel modo
start:step:stop
ossia viene creata in un vettore riga una sequenza di numeri che iniziano dal numero start,
vengono incrementati del valore step e si fermano quando raggiungono lo stop.
Per assegnare un vettore i cui elementi differiscano di una costante, ad esempio il vettore di
componenti 0,1,2,3,4 si può scrivere con uno dei modi equivalenti
Quando lo step non è indicato il passo di default è 1.
Se la costante è diversa da 1 basta scrivere in uno dei modi equivalenti:
Matrici particolari
Le quattro matrici più importanti per la programmazione sono le matrici di zeri, di uno, random
ottenibili con i seguenti comandi:
• zeros(i,j) : permette di creare una matrice di zeri con i righe e j colonne
• ones(i,j) : permette di creare una matrice di tutti uno con i righe e j colonne
• eye(i,j) : permette di creare una matrice di i righe e j colonne con uno sulla diagonale
principale e zero altrove
• rand(i,j) : permette di generare una matrice con elementi a caso con i righe e j colonne
Per generare una matrice 2 x 5 i cui elementi siano tutti nulli si usa l’istruzione
>>P = zeros(2,5);
Per generare una matrice 4 x 3 i cui elementi siano tutti uguali ad uno si usa l’istruzione
>>Q = ones(4,3);
Se per esempio dobbiamo creare una matrice 3x4 con tutti 5 possiamo applicare la
moltiplicazione scalare
>>M=5*ones(3,4);
Per generare una matrice unità 4 x 4 si usa l’istruzione
>>R = eye(4);
Per generare una matrice 3 x 3 con elementi a caso compresi tra zero ed 1 si usa l’istruzione
>>S = rand(3);
Altro uso dei due punti
Il comando “:” è un sostituto del ciclo for . Abbiamo già visto come esso consenta di creare
semplicemente vettori con componenti che differiscono di una costante. Vediamone ora un
secondo utilizzo. Data una matrice A si voglia prelevare da essa una sotto-matrice formata da
alcune righe e alcune colonne. Ricordiamo che, come in matematica, negli elementi ahk di una
matrice il primo indice indica la riga, il secondo la colonna.
Ad esempio se si vuol prelevare la sotto-matrice B formata dalla sola prima colonna di A
basta usare l’istruzione
>>B = A(:,1)
che significa: B è formato da tutte le righe di A ma solo dalla colonna 1.
Si voglia ora prelevare da A la sotto-matrice C formata dalle colonne 2,3
basta usare l’istruzione
>>C = A(:,2:3)
che significa: C è formato da tutte le righe di A ma solo dalle colonne 2 e 3.
Si voglia ora prelevare la sotto-matrice D formata dalle righe 2 e 3 di A
basta usare l’istruzione
>>D = A(2:3,:)
che significa: D è formato dalle righe 2 e 3 di A e da tutte le colonne.
Concatenazione di matrici
Due matrici con ugual numero di righe possono essere concatenate orizzontalmente, cioè
affiancate orizzontalmente per formare una matrice unica.
Definite cioè A (2x3) e B (2x4) possiamo definire C (2x7) come la matrice che otteniamo
affiancandole con le parentesi quadre e lo spazio; quindi le trattiamo come gli elementi di una
matrice:
>>C=[A B];
Due matrici con ugual numero di colonne possono essere concatenate verticalmente, cioè
affiancate verticalmente per formare una matrice unica.
Definite D (2x3) e F (4x3), possiamo definire E (6x3) come la matrice che otteniamo affiancandole
con le parentesi quadre e il punto e virgola.
>>E=[D;F];
Altri comandi fondamentali
length(v): calcolato su di un vettore o su una serie, ne dà la lunghezza
size(m): calcolato su di una matrice, ne dà il numero di righe e di colonne
E’ possibile cancellare righe e colonne di una matrice usando le parentesi quadre [ ],
attribuendole alla riga/colonna che si vuole cancellare
>>m=ones(3,4);
>>m(:,4)=[ ]; %si cancella la quarta colonna di m
Non è possibile scrivere
>>m(2,2)=[ ];
altrimenti cancellerei un solo elemento e m non sarebbe più una matrice
reshape(X,M,N): considera una matrice X e dà come output una matrice di MxN elementi presi
da X partendo dalla prima colonna. Se X non ha ugual numero di elementi (MxN) fornisce un
messaggio di errore.
abs(): calcola il valore assoluto di un numero o la matrice contenente i valori assoluti della matrice
cui è applicato
fix(): tronca un numero all’intero
round(): calcola l’arrotondamento per eccesso/difetto
max() e min(): calcola di un vettore il max o il min elemento; di una matrice produce un vettore
con il max o min degli elementi per colonne
fliplr(): inverte l’ordine degli elementi di un vettore
eig(): calcola gli autovalori di una matrice quadrata
rank(): calcola il rango di una matrice (massimo numero di righe o colonne linearmente
indipendenti)
trace(): calcola la traccia di una matrice (somma degli elementi sulla diagonale principale)
cumprod(x): restituisce un vettore o una matrice con il prodotto cumulato per colonna
cumsum(x): restituisce un vettore o una matrice con la somma cumulata per colonna
Efficienza …
MATLAB è un linguaggio non strutturato e in quanto tale non necessita di allocare variabili,
vettori o matrici prima dell’uso. Questo semplifica il lavoro del programmatore ma può essere
fonte di errori ed inefficienze.
Ad esempio, se vogliamo generare un vettore del tipo x=(1,2,3,4,…,106) è sufficiente digitare:
Ma vi accorgerete che la generazione del vettore x richiede molto tempo. Il motivo di tale
inefficienza risiede nel fatto che MATLAB non conosce a priori la dimensione del vettore, perciò
ad ogni ciclo alloca un nuovo elemento in coda al vettore generato ai cicli precedenti.
Tutti sanno che l’operazione di allocazione ha un costo elevato in quanto coinvolge primitive del
sistema operativo che devono cercare una locazione di memoria libera ecc.
In questo caso MATLAB deve eseguire 106 allocazioni!
Per ovviare a questo inconveniente si può forzare MATLAB ad allocare (ed inizializzare) il vettore
x (o una matrice) prima del suo utilizzo tramite la funzione zeros:
In questo caso la generazione è immediata in quanto l’allocazione avviene in un colpo solo, in
modo analogo alla malloc del C.