Corso di digitalizzazione e reti per segretario amministrativo
Appunti di Elaborazione automatica dei dati: matrici e matlab
1. Appunti d’esame:
le matrici e matlab Visto su: Profland
Appunti di Elaborazione automatica dei dati:
le Matrici ed il Matlab
Si ricorda che:
• l'uso degli appunti qui presenti è consentito per solo uso personale e di studio;
• la consultazione è gratuita ed ogni forma atta a ricavarne lucro è vietata!
• gli appunti sono fatti da studenti che non possono assumersi nessuna responsabilità in merito;
• il materiale qui presente non è sostitutivo ma complementare ai libri di testo:
- devi (e ti consiglio) di consultare e comprare i libri di testo;
• il materiale qui presente è distribuito con licenza Creative Commons
Ti ricordo che se vuoi contribuire mandando degli appunti o quant'altro possa essere utile ad altri puoi farlo
inviando il materiale tramite:
http://profland.altervista.org/mail.htm
Spero che ciò che hai scaricato ti possa essere utile.
Profman
Il file è stato scaricato/visualizzato in forma gratuita da Profland:
http://profland.altervista.org
sezione Profstudio
http://profland.altervista.org/profstudio/profstudio.htm
oppure da qualche mirror, come:
www.profland.cjb.net www.profland.135.it
o dalla pagina dedicata su slideshare.net:
www.slideshare.net/profman
1/18
2. Appunti d’esame:
le matrici e matlab Visto su: Profland
Le Matrici
(autore: jiji from naples)
Riconsideriamo il sistema:
ax + by = c
' ' '
ax+ by = c
Questo è un sistema 2×2, cioè con 2 equazioni in due incognite x ed y.
In generale, un sistema sarà n×m, cioè con n equazioni in m incognite. Infatti, in
generale, non è detto che il numero di equazioni debba essere uguale al numero di
incognite; in tal caso si parla di sistema rettangolare. Un sistema rettangolare avrà
una rappresentazione del tipo:
a11x1 + a12 x2 + + a1m xm = b1
a x + a x + + a x = b
21 1 22 2 2m m 2
an1x1 + an 2 x2 + + anm xm = bn
Come vedete per i coefficienti a si usa una notazione matriciale, mentre le incognite
x sono distinte dal pedice. Ci sono n equazioni cioè n righe ed m incognite cioè m
colonne. Per cui i coefficienti a costituiscono una matrice n×m che possiamo indicare
con A e chiamare matrice dei coefficienti, le incognite x costituiscono un vettore che
indicheremo con x e così pure i termini noti b costituiscono un vettore che
indicheremo con b . Il sistema precedente, allora, può essere scritto sinteticamente in
forma matriciale così:
Ax = b
Noi, per ora, ci occuperemo solo di sistemi quadrati n×n, in cui cioè il numero delle
equazioni è uguale al numero delle incognite.
Nel caso del sistema 2×2 visto all'inizio, la matrice dei coefficienti ed i vettori delle
incognite e dei termini noti si possono scrivere così:
a b x c
A= '
a b'
x=
y b = '
c
Col computer scriveremo i sistemi in forma matriciale, la matrice ed i vettori li
inseriremo con le regole di Matlab, faremo dei calcoli per ottenere il vettore delle
soluzioni. La soluzione, quindi, è un vettore; i numeri che lo costituiscono sono le
componenti del vettore.
Il problema, comunque, può ammettere:
• un'unica soluzione,
• nessuna soluzione,
2/18
3. Appunti d’esame:
le matrici e matlab Visto su: Profland
• infinite soluzioni.
Ogni sistema di equazioni può essere rapportato ad un problema geometrico. Nel caso
2×2 il sistema rappresenta l'intersezione fra due rette e noi sappiamo che due rette
possono:
• intersecarsi in un sol punto (unica soluzione),
• non intersecarsi mai, perché sono parallele (nessuna soluzione),
• intersecarsi in tutti i punti, perché sono sovrapposte, cioè coincidono (infinite
soluzioni).
Se scriviamo il sistema in forma matriciale e se la matrice dei coefficienti è
invertibile, vuol dire che esiste la matrice inversa A-1. Per cui moltiplicando per A-1
primo e secondo membro dell'espressione A x = b otteniamo:
A− 1 A x = A− 1 b
poiché sappiamo che A-1A=I cioè è la matrice identica che moltiplicata per il vettore
x fa x, possiamo scrivere che:
x = A− 1 b
Quindi, dal punto di vista formale qualunque sistema si risolve semplicemente
moltiplicando la matrice inversa dei coefficienti per il vettore dei termini noti. Tale
espressione fornirà un'unica soluzione, perché come sapete se la matrice inversa
esiste essa è unica! Può succedere che la matrice inversa non esista ed, in tal caso, il
sistema potrebbe non ammettere soluzione o avere infinite soluzioni a seconda di
come è fatto il vettore dei termini noti b .
Quello che stiamo dicendo non è un concetto nuovo, perché è simile a quello che si fa
per risolvere un'equazione di primo grado:
ax=b
la soluzione di questa equazione è:
b
x=
a
che si può anche scrivere come:
x=a-1b
in tal caso, come ricordate, la soluzione esisteva ed era unica, purché "a" fosse
diversa da zero! Se, invece, a è uguale a zero l'equazione è del tipo:
0x=b
in tal caso se b è diverso da zero, tale equazione non ammette nessuna soluzione;
mentre se b è uguale a zero, tale equazione ammette infinite soluzioni. Alla luce di
questo possiamo dire che i sistemi di equazioni non sono che una semplice
generalizzazione delle equazioni di primo grado.
Nel caso dei sistemi, però, perché esista soluzione non basta dire che la matrice dei
coefficienti A deve essere diversa dalla matrice nulla, cioè quella fatta di tutti zero.
Infatti, sappiamo che la condizione di esistenza della matrice inversa è una questione
più ampia. Le matrici che non ammettono inversa sono tutte quelle che hanno
determinante nullo. Pertanto, per i sistemi per i quali il determinante di A è diverso
da zero, esiste la matrice inversa A-1 ed esiste un'unica soluzione. Invece, per i sistemi
3/18
4. Appunti d’esame:
le matrici e matlab Visto su: Profland
per i quali il determinante di A è zero potremo dire che o non esiste nessuna soluzione
o esistono infinite soluzioni a seconda di come è fatto il vettore b dei termini noti.
Ricordiamo che per decidere se ci sono o non ci sono soluzioni, si può anche
confrontare il rango della matrice A con quello della matrice che si ottiene prendendo
tutte le colonne di A ed affiancando in fondo a destra il vettore colonna b dei termini
noti:
a11 a12 a1n b1
a 21 a 22 a 2n b2
a an2 a nn bn
n1
Se i due ranghi sono uguali il sistema ammette soluzione, se sono diversi le soluzioni
non ci sono! Per indicare questa matrice userò la notazione [A , b] tipica di Matlab.
In passato voi già avete affrontato questo problema e l'avete risolto facendo degli
esercizi con carta e penna, noi ora ci proponiamo di risolverlo servendoci di Matlab.
Per inserire la matrice dei coefficienti A in Matlab si useranno le regole che
conoscete:
A=[………]
Così pure per il vettore dei termini noti che è un vettore colonna:
b=
Attenzione che se lo scrivete come vettore riga Matlab si offende!
Poi, possiamo controllare se esiste o non esiste l'inversa, calcolando il determinante
di A. Questo Matlab lo fa velocemente e senza problemi. C'è una funzione che ha
come input la matrice e come output produce il determinante. La funzione si chiama
"det". Per cui se in Matlab introduciamo prima una matrice A e poi scriviamo det (A)
lui calcola il determinate e fa uscire un numero. Se questo numero è diverso da zero
c'è l'inversa, se questo numero è zero vuol dire che non esiste l'inversa di A. Se
l'inversa esiste la posso calcolare con un'altra funzione di Matlab che si chiama "inv".
Per cui se in Matlab scriviamo inv (A) lui calcola l'inversa di A e fa uscire una
matrice. Ciò fatto, la soluzione si ottiene semplicemente moltiplicando questa matrice
inversa, così ottenuta, per il vettore colonna dei termini noti. Quindi, dal punto di
vista matematico non c'è alcun problema.
Se il determinante di A è uguale a zero, per capire se non ci sono soluzioni o ce ne
sono infinite dobbiamo confrontare il rango della matrice A con quello della matrice
che si ottiene aggiungendo ad A il vettore dei termini noti b . Per calcolare il rango
possiamo utilizzare un'altra funzione di Matlab che si chiama "rank". Se scriviamo
rank (A), Matlab fornisce un numero che rappresenta il rango di A. Se chiamo C la
matrice ottenuta aggiungendo ad A il vettore dei termini noti b e ne calcolo il rango
con Matlab scrivendo rank (C), otterrò un altro numero che rappresenta il rango di C.
Confronto i due numeri così ottenuti e so che se sono uguali ci sono soluzioni, mentre
se sono diversi non ci sono soluzioni. Se non ci sono soluzioni ho finito, perché il
sistema non ammette soluzioni. Se, invece, ci sono soluzioni non ho finito perché le
devo trovare, vediamo come si fa al livello concettuale.
4/18
5. Appunti d’esame:
le matrici e matlab Visto su: Profland
Torniamo a scrivere:
Ax = b
dove A è una matrice quadrata n×n ed abbiamo detto che siamo nel caso in cui il
determinante di A è nullo:
det (A) = 0
Inoltre, abbiamo detto che se il rango di A è minore di quello della matrice [A , b]
ottenuta aggiungendo ad A il vettore dei termini noti b , non ci sono soluzioni ed ho
finito:
rank (A) < rank (A , b)
Se, invece, trovo che i due ranghi sono uguali:
rank (A) = rank (A , b)
so che ci sono soluzioni, vediamo come possiamo trovarle.
Innanzi tutto, diciamo che la soluzione è il vettore x i cui componenti sono n. Il
rango rappresenta il numero di colonne linearmente indipendenti. Poiché A è una
matrice quadrata con n colonne e siccome il determinante di A è uguale a zero ciò
vuol dire che non tutte le colonne sono linearmente indipendenti; perciò, il rango non
può essere n, deve essere un numero più piccolo di n. Cioè, le colonne di A non sono
tutte linearmente indipendenti, ma ce ne saranno alcune che sono linearmente
dipendenti dalle altre.
Ad esempio, se il rango di A è 100 mentre la matrice A ha 101 colonne, questo
significa che di queste 101 colonne solo 100 sono indipendenti, mentre una è
dipendente dalle altre.
Se il rango fosse 90, ciò significherebbe che delle 101 colonne che compongono la
matrice A, 90 sono indipendenti e le altre 11 sono dipendenti. Concettualmente ciò
vuol dire che le incognite relative a quelle 11 colonne possono essere assegnate in
maniera arbitraria. Assegnate queste 11 incognite in maniera arbitraria, poi calcolo le
rimanenti 90 ed ottengo una possibile soluzione. Se assegno le 11 incognite in modo
diverso otterrò un'altra soluzione e così via. Si scrive ∞11 e si dice che esistono
"infinito a 11" modi di risolvere il sistema. Allora, a livello concettuale se la mia
matrice A ha 101 colonne ed ha rango 90, so che ci sono 11 colonne linearmente
dipendenti; quello che devo fare è trovarle!
Concettualmente è chiaro, poi bisogna vedere in pratica come si fa a trovarle!
L'idea concettuale è che io ho una certa matrice fatta da tante colonne, alcune di
queste sono dipendenti. Poiché, io posso scambiare la disposizione delle colonne
senza alterare la matrice, immaginiamo di portare le colonne dipendenti tutte in fondo
a destra e di lasciare quelle indipendenti tutte a sinistra:
5/18
6. Appunti d’esame:
le matrici e matlab Visto su: Profland
n colonne
Colonne Colonne
indipendenti dipendenti
Tutta la matrice A aveva n colonne ed n righe perché era quadrata, ma il pezzo di
matrice formato dalle colonne indipendenti non è più una matrice quadrata, perché ha
un numero di colonne minore di n ed un numero di righe ancora pari ad n. Dalla
teoria sappiamo, però, che il numero di colonne linearmente indipendenti è
sempre uguale al numero di righe linearmente indipendenti! Cioè, dalla teoria
sappiamo che il rango è un numero che rappresenta contemporaneamente sia il
numero di colonne sia il numero di righe linearmente indipendenti! Nel nostro
esempio vuol dire che se ci sono 11 colonne dipendenti ci saranno anche 11 righe
dipendenti. Che vuol dire che una riga è dipendente? Una riga è una delle equazioni
del sistema, dire che è dipendente, vuol dire che essa non fornisce nessuna
informazione utile, è in più, è ridondante. Perciò si può cancellare! Tutte le righe
dipendenti si possono portare in basso e si possono cancellare, perché tanto non
servono. Otterremo così ancora una matrice quadrata, più piccola di n×n in cui tutte
le colonne e tutte le righe sono linearmente indipendenti, per cui il suo determinante è
necessariamente diverso da zero. Ciò vuol dire che tale matrice può essere invertita.
n colonne
Matrice con
colonne e righe
tutte
indipendenti
Le colonne dipendenti che ho messo in fondo a destra posso portarle fuori dalla
matrice dei coefficienti e metterle nel termine noto del sistema, perché sono
valori che posso assegnare arbitrariamente. Questa è la strategia che si usa. Per
trovare la sottomatrice formata da tutte colonne e righe linearmente indipendenti,
devo andare a valutare le varie sottomatrici estraibili da A, finché non ne trovo una
che ha determinante diverso da zero. Quando l'ho trovata so che questa sottomatrice è
6/18
7. Appunti d’esame:
le matrici e matlab Visto su: Profland
quella su cui devo operare. Ovviamente questa ricerca è possibile su una matrice di
piccole dimensioni, mentre diventa sempre più difficile man mano che crescono le
dimensioni. Quindi, anche se a livello concettuale abbiamo chiaro cosa dobbiamo
fare, il problema resta complesso! Se la matrice fosse molto grande, le possibili
sottomatrici da indagare sarebbero talmente tante che trovare quella giusta sarebbe
un'impresa lunga e complessa. Comunque, si potrebbe lasciare che un calcolatore
trovi tale matrice, è solo una questione di tempo!
Fortunatamente, noi risolveremo solo sistemi che nascono da qualche modello
economico-finanziario progettato per risolvere situazioni concrete. Un modello
viene progettato per risolvere un problema; pertanto, un modello per essere utile deve
necessariamente portare ad un sistema che ammetta una soluzione, cioè deve portare
ad una matrice in cui il determinante sia diverso da zero. Non avrebbe senso costruire
un modello che non porta ad alcuna soluzione! Quindi, noi ci troveremo sempre in
situazioni in cui il determinante è diverso da zero.
Solo, per esercizio, talvolta risolveremo qualche situazione in cui c'è una matrice con
determinante nullo. E vi ho detto come procedere a livello matematico. Fin d'ora,
però, vi deve essere chiaro che quando tratteremo matrici legate a modelli
economico-finanziari, esse avranno sempre determinante non nullo.
Adesso, ritorniamo al discorso di partenza.
Abbiamo il nostro sistema:
Ax = b
e supponiamo che il determinante sia diverso da zero:
det (A) ≠ 0
In queste condizioni, abbiamo detto che la soluzione esiste ed è unica e si può
scrivere così:
x = A− 1 b
Abbiamo detto che, assegnata la matrice A, possiamo calcolare con Matlab il
determinante. Se esso è diverso da zero possiamo calcolare la matrice inversa A -1 e
moltiplicarla per il vettore b ottenendo il vettore x .
Tutto ciò sembra semplice, ma dobbiamo ricordarci che i calcoli eseguiti con un
calcolatore sono inevitabilmente affetti da piccoli errori. La presenza di questi
piccoli errori rende il problema, che appariva semplice, un po' più delicato!
Supponiamo che il determinante sia diverso da zero, ma sia molto piccolo; ad
esempio, supponiamo che sia 10-20. In tal caso, quando Matlab esegue i calcoli
potrebbe commettere un errore, potrebbe addirittura far uscire zero! Oppure, potrebbe
accadere che il determinante è veramente zero, Matlab lo calcola e, invece di zero, fa
uscire 10-20. Come faccio a sapere se quel 10 -20 rappresenta un numero piccolo, ma
7/18
8. Appunti d’esame:
le matrici e matlab Visto su: Profland
diverso da zero oppure è uscito così perché Matlab ha fatto un troncamento? La
matematica distingue in maniera precisa e netta matrici con determinante nullo da
matrici con determinante molto piccolo, ma diverso da zero. Un calcolatore, invece,
potrebbe confondere questi due tipi di matrici!
Oltre a questo problema, ce n'è anche un altro legato alle perturbazioni. Cioè
assegnando i dati in un certo modo piuttosto che in un altro potremmo avere soluzioni
diverse!
Quindi, nei calcoli col calcolatore c'è qualche problema di cui bisogna tener conto in
qualche modo.
Vi dico fin d'ora che alcuni artifici per risolvere questi problemi già sono stati inseriti
in Matlab.
A questo punto vediamo quali sono gli artifici che si possono studiare per risolvere
questi problemi.
Iniziamo a calcolare la matrice inversa A -1. Dalla teoria matematica sappiamo che la
matrice inversa è uguale alla matrice trasposta dei complementi algebrici divisa per il
determinante di A, cioè:
1
A− 1 = ( complementi algebrici ) T
det A
La matrice trasposta dei complementi algebrici è detta comunemente "matrice
aggiunta" di A. Il complemento algebrico A11 è il determinante della matrice che si
ottiene da A cancellando la riga 1 e la colonna 1. In generale, il complemento
algebrico Aij è il determinante della matrice che si ottiene da A cancellando la riga i-
sima e la colonna j-sima.
Vi ricordate in matematica come si fa a calcolare un determinante?
Tenete presente che il determinante è un concetto che si può applicare solo a
matrici quadrate! Il determinante è la somma dei prodotti ottenuti moltiplicando gli
elementi di una riga (o di una colonna) per i rispettivi complementi algebrici. Cioè, si
moltiplica ogni elemento di una riga (o di una colonna) per il determinante di ordine
n-1 che si ottiene cancellando la riga e la colonna cui l'elemento appartiene. Si tratta
di un processo induttivo. Per calcolare un determinate di ordine n devo calcolare dei
determinanti di ordine n-1 e così via a ritroso fino ad arrivare a determinanti di ordine
2. Questi ultimi si calcolano moltiplicando gli elementi della diagonale principale e
sottraendo il prodotto degli elementi della diagonale secondaria:
a a
A = 11 12
a det A = a11 ⋅ a22 − a12 ⋅ a21
21 a22
Per calcolare un determinante di ordine 2 sono necessarie quindi 2 moltiplicazioni.
Ma, per calcolare un determinante di ordine 3 sono necessarie 3 moltiplicazioni per
determinanti di ordine 2, cioè in tutto 3×2 moltiplicazioni. Per calcolare un
determinante di ordine 4 sono necessarie 4 moltiplicazioni per determinanti di ordine
3, cioè in tutto 4×3×2 moltiplicazioni. Per calcolare un determinante di ordine 5
dovremo fare 5×4×3×2 moltiplicazioni. Per calcolare un determinante di ordine n
8/18
9. Appunti d’esame:
le matrici e matlab Visto su: Profland
dovremo fare n! moltiplicazioni. Per cui, come vedete, più grande è la matrice, più
crescono i calcoli. Notate, inoltre, che il numero di moltiplicazioni cresce in maniera
estremamente rapida; pensate che per calcolare il determinante di una matrice di
ordine 14 sono necessarie 14! moltiplicazioni, cioè circa 87 miliardi di
moltiplicazioni; per calcolare il determinante di una matrice di ordine 15 sono
necessarie 15! moltiplicazioni, cioè circa 1300 miliardi di moltiplicazioni.
Le CPU oggi raggiungono i 2Ghz, cioè fanno quasi 2 miliardi di operazioni
elementari al secondo (clock). Il prodotto non è un'operazione elementare, è
un'operazione complessa che coinvolge più passi elementari. Per fare un prodotto ci
vogliono circa 10 clock. Pertanto un calcolatore sarà in grado di fare circa 200
milioni di prodotti al secondo. Perciò per calcolare un determinante di ordine 14 ci
metterà circa 7 minuti. Ricordate che per calcolare un determinante di ordine 15
dobbiamo calcolare un determinante di ordine 14 per ogni elemento della matrice
aggiunta, cioè dobbiamo calcolare 15×15 determinanti di ordine 14, per cui ci
vorranno circa 26 ore! Per calcolare un determinante di ordine 20 ci vorrà più di un
secolo! Invece, se accendiamo Matlab ed inseriamo una matrice di ordine 20
riusciamo ad ottenere velocemente il valore del determinante. Come è possibile?
La verità è che Matlab per il calcolo non utilizza la strategia che abbiamo descritto
che deriva dalla definizione matematica del determinante. Nella matematica si usano
delle formule di rappresentazione che quasi mai coincidono con i metodi utilizzati nei
calcolatori per eseguire i calcoli. Anche la formula di rappresentazione che abbiamo
appena visto per il calcolo della matrice inversa non è quella adottata da Matlab per
eseguire il calcolo. Matlab esegue il calcolo della matrice inversa passando attraverso
un certo numero di sistemi.
Abbiamo il nostro sistema:
Ax = b
la cui soluzione si può scrivere simbolicamente come:
x = A− 1 b
se invece di un vettore b di termini noti avessimo una matrice B di termini noti, al
posto del vettore x delle incognite si avrebbe una matrice X delle incognite.
Avremmo cioè una serie di sistemi che simbolicamente potremmo rappresentare
come:
A = XB
Avremo tanti sistemi per quante sono le colonne della matrice B. Anche la soluzione
è una matrice X fatta da tante colonne per quante sono quelle di B. Ciò posto
utilizziamo come matrice B la matrice identica I, avremo:
A = XI
9/18
10. Appunti d’esame:
le matrici e matlab Visto su: Profland
da cui si ha:
X = A − 1I = A − 1
perché la matrice identica I è l'elemento neutro del prodotto, cioè moltiplicata per
qualsiasi matrice dà la matrice di partenza.
Allora, siamo giunti ad un paradosso. Per calcolare la soluzione del sistema:
Ax = b
devo calcolare la matrice inversa A-1 e per calcolare la matrice inversa devo risolvere
n sistemi. Questo vuol dire che la teoria matematica che passa per il calcolo
dell'inversa è una teoria astratta!
Vediamo allora come si fa a risolvere un sistema senza passare attraverso il
simbolismo della matematica.
Il metodo di Cramer non va bene perché utilizza la divisione per un determinante che
è il problema che ci ha bloccato prima. Il metodo di sostituzione non è applicabile
perché le incognite coinvolte sono troppe. Non resta che il
METODO DI GAUSS
Si tratta di effettuare certi calcoli prendendo la prima riga ed addizionandola
opportunamente alle successive, allo scopo di far diventare zero gli elementi della
prima colonna. Che significa addizionare in maniera opportuna? Vuol dire che per
a
cancellare, ad esempio, l'elemento a21 devo moltiplicare la riga 1 per il rapporto 21 a11
Ad esempio se ho la matrice:
3 2 1
1 3 2
2 4 3
per azzerare l'elemento 1 nella seconda riga devo sommare ad essa la prima riga dopo
averla moltiplicata per -1/3 avrò:
3 2 1
0 73 5
3
2 4 3
per azzerare l'elemento 2 nella terza riga devo sommare ad essa la prima riga dopo
averla moltiplicata per -2/3 avrò:
3 2 1
0 7 5
3 3
0 8 7
3 3
Ripetendo il procedimento posso azzerare l'elemento 8/3 nella terza riga, sommando
ad essa la seconda riga dopo averla moltiplicata per -8/7 avrò:
10/18
11. Appunti d’esame:
le matrici e matlab Visto su: Profland
3 2 1
0 7 5
3 3
0 0 3
7
Quindi, operando in questo modo passo ad un sistema del tipo:
Cx = d
dove la matrice C è una matrice triangolare. In tal caso il sistema è risolto perché
dall'ultima relazione ottengo l'ultima componente. Nota questa posso inserirla nella
penultima relazione ed ottenere la penultima componente e così via a ritroso.
Ovviamente, il meccanismo descritto rappresenta il caso che esista un'unica
soluzione. Il ragionamento fatto si dovrà inceppare da qualche parte quando non ci
sono soluzioni o quando le soluzioni sono infinite. Infatti, il ragionamento si inceppa
quando l'ultimo elemento in basso è zero:
3 2 1
0 73 5
3
0 0 0
in tal caso se il termine noto è zero avrò infinite soluzioni, se il termine noto è diverso
da zero non esistono soluzioni.
In Matlab è implementato il metodo di Gauss.
Ricordiamo che tra le proprietà dei determinanti ce n'è una che afferma che se
prendo una matrice e sommo una riga ad un'altra il determinante non cambia.
Pertanto il determinante della matrice triangolare ottenuta col metodo di gauss è lo
stesso della matrice di partenza. Ma c'è un grosso vantaggio. Il determinante di una
matrice triangolare si calcola semplicemente moltiplicando tra loro gli elementi
della diagonale principale! Il Metodo di Gauss non solo risolve il sistema, ma ci
aiuta anche a semplificare il calcolo del determinante. Ecco perché Matlab riesce a
calcolare rapidamente anche i determinanti di matrici di ordine elevato; le trasforma
prima in matrici triangolari col metodo di Gauss e, poi, fa il prodotto degli elementi
della diagonale principale.
Facciamo un'osservazione importante!
Quando operiamo a mano il processo di Gauss dobbiamo tener conto di un'altra
proprietà dei determinanti che afferma che se si scambiano due righe in una
matrice il determinante cambia segno. Pertanto il valore del determinante dovrà
essere preso con il proprio segno o col segno opposto a seconda del numero di scambi
operati. Matlab conta gli scambi operati e restituisce il valore giusto.
Se strada facendo un elemento lungo la diagonale si annulla il determinate sarà nullo,
per cui siamo nel caso in cui il sistema non ha soluzioni o ha infinite soluzioni.
11/18
12. Appunti d’esame:
le matrici e matlab Visto su: Profland
Andiamo ora a scrivere le formule di Gauss.
Abbiamo una prima riga del tipo:
a11 a12 a1n b1
questa riga viene sottratta dalle successive. In particolare, se consideriamo la seconda
riga che è del tipo:
a 21 a 22 a 2 n b2
il nuovo valore assunto da a21 sarà:
nuovo a 21
a 21 = a 21 − a11
a11
analogamente, il nuovo valore assunto da a22 sarà:
nuovo a 21
a 22 = a 22 − a12
a11
e così via fino a:
nuovo a 21
a 2n = a 2n − a1n
a11
nuovo a 21
b2 = b2 − b1
a11
Il ragionamento va poi ripetuto iterativamente per triangolarizzare la matrice. Si
lascia ferma la prima riga e si utilizza la seconda riga con lo stesso criterio esposto.
La formula sarà strutturata sempre allo stesso modo, essa è basata sostanzialmente su
una differenza ed un prodotto.
I calcoli teorici sono esatti, mentre i calcoli eseguiti dal calcolatore sono affetti da
un errore di troncamento, legato alla precisione della macchina che stiamo
utilizzando. Nel caso di Matlab l'errore interviene sulla 14ª cifra. Tale errore si
trasferisce al calcolo successivo e si può amplificare o ridurre. Se l'errore si riduce, il
calcolo rimane stabile; perché il calcolo successivo avrà anche lui un errore a cui si
somma l'errore precedente, ma poiché l'errore precedente si è ridotto il calcolo rimane
stabile. Se, invece, l'errore si amplifica, avrò una catena di errori che si amplifica che
porterà ad un risultato sballato.
La moltiplicazione può amplificare o ridurre l'errore, a seconda che il
moltiplicatore abbia un valore maggiore di 1 o minore di 1. Il valore di a11, a causa
del troncamento introdotto dal calcolatore, non è esatto, è un a11+ε . Se lo moltiplico
per 100 avrò 100a11+100ε per cui l'errore si è amplificato di 100 volte. Se, invece, lo
moltiplico per 0,01 ottengo 0,01a11+0,01ε per cui l'errore si è ridotto di 100 volte.
a21
Nella formula di Gauss il termine che può amplificare o ridurre l'errore è a11 .
12/18
13. Appunti d’esame:
le matrici e matlab Visto su: Profland
Per cui se tale rapporto assume un valore maggiore di 1 gli errori si propagano
amplificandosi, se tale rapporto assume un valore minore di 1 gli errori si propagano
riducendosi ed il calcolo si stabilizza. Ecco perché in certi casi il metodo di Gauss,
così come lo abbiamo descritto, non funziona e possono uscire dei valori sballati.
Questo fatto ci chiarisce anche perché abbiamo avuto risultati diversi quando ieri
abbiamo considerato l'esempio del sistema in cui abbiamo invertito i dati. Mettendo i
dati in un certo ordine io posso aver moltiplicato per un fattore molto grande.
Scambiando i dati è successo che quello che avevo usato come moltiplicatore l'ho
usato come divisore, per cui è diventato molto piccolo e questo ha stabilizzato il
calcolo. Ora capiamo perché se un sistema lo scrivo con un certo criterio mi dà una
risposta e se lo scrivo con un altro criterio ottengo un'altra risposta.
Capito il problema, vediamo come lo risolviamo.
Il ragionamento che si fa sta alla base di quello che chiamiamo metodo di Gauss
modificato o anche metodo di Gauss con il pivot.
a21
Se riuscissimo a rendere il rapporto a11 sempre minore di 1, il processo di calcolo
sarebbe sempre stabile. Ma per far questo basta fare in modo che il termine a11, oltre
ad essere diverso da zero, sia anche il più grande di tutti. Questo è facile, perché basta
confrontarlo con gli altri elementi della sua colonna: a21, a31, … fino ad an1 e se, per
caso, troviamo un termine più grande possiamo sempre scambiare la riga che lo
contiene con la prima riga. In questo modo la prima riga avrà sempre un a11 che è
diverso da zero ed è il più grande dei termini, per cui tutti i rapporti che hanno al
denominatore a11 saranno minori di 1 ed il calcolo sarà stabile.
Analogamente, quando ripeto il procedimento per la seconda equazione, considero
a22 e verifico che sia diverso da zero e che sia il più grande degli elementi lungo la
sua colonna a scendere, se questo non avviene scambio le righe come prima.
In questa maniera il processo viene stabilizzato per questo tipo di errore.
Purtroppo anche la differenza introduce un errore. L'idea del pivot ci aiuta ad
eliminare l'errore legato alla moltiplicazione, ma non rende il calcolo finale
totalmente immune da errore. Per cui dobbiamo avere la consapevolezza che il
risultato finale non è mai esatto al 100%, ma è sempre affetto da un errore che noi
dovremo cercare di misurare.
Ora, utilizziamo Matlab per fare qualche esercizio su quello che abbiamo visto.
Iniziamo con inserire una matrice. Per inserire una matrice in Matlab dobbiamo
digitare una lettera maiuscola seguita dal segno "=" e racchiudere fra parentesi quadre
una serie di numeri separati da virgole o da spazi; per andare a capo alla fine di una
riga possiamo usare il tasto "Invio" oppure il punto e virgola. Ad esempio scriveremo:
A = [1 2 3
456
7 8 9]
13/18
14. Appunti d’esame:
le matrici e matlab Visto su: Profland
poi premeremo il tasto "invio" e Matlab memorizzerà la matrice. A questo punto
possiamo usare la funzione di Matlab per calcolare il determinante. Scriveremo:
det(A)
premendo il tasto "invio" Matlab ci risponderà con:
ans = 0
ciò vuol dire che se questa fosse la matrice di un sistema di equazioni, noi già
sapremmo che il sistema ha infinite soluzioni oppure nessuna a seconda di come è
fatto il termine noto.
Inoltre, possiamo calcolare il rango di tale matrice. Poiché essa ha tre colonne già
sappiamo che il rango può valere al massimo 3 e siccome abbiamo calcolato che il
determinante è zero già sappiamo che il rango deve essere minore di 3. Infatti, il
rango rappresenta il numero massimo di colonne e di righe linearmente indipendenti
e si calcola considerando i minori estraibili dalla matrice che hanno determinante
diverso da zero. Ma l'unico minore di ordine 3 estraibile dalla matrice A è il
determinante che vale zero, per cui il rango non può essere 3. Quindi, il suo rango è 2
oppure 1. Per saperlo, dovremmo teoricamente estrarre i minori del 2° ordine e
vedere se ce n'è almeno uno che ha determinante diverso da zero, nel qual caso il
rango è 2. Se non se ne trovano il rango è 1. Per la matrice considerata si vede a
occhio che c'è un minore del secondo ordine diverso da zero, per cui il rango è 2.
Quindi, le prime due righe o le prime due colonne sono linearmente indipendenti.
Verifichiamo se Matlab ce lo conferma, scriviamo:
rank(A)
premendo il tasto "invio" Matlab ci risponderà con:
ans = 2
confermando ciò che ci aspettavamo.
Adesso proviamo a calcolare un sistema. Inventiamovi un termine noto, ad esempio:
b=[1 2 3]'
l'apostrofo che mettiamo serve a far capire a Matlab che si tratta di un vettore
colonna. Adesso dobbiamo vedere se il sistema che si può costruire con la matrice A
ed il vettore b considerati ammette soluzioni. Per sapere se ammette o non ammette
soluzioni dobbiamo valutare il rango di A e lo abbiamo fatto; poi, dobbiamo valutare
il rango della matrice che si ottiene aggiungendo ad A il vettore b. Per far questo
potremmo materialmente inserire in Matlab una matrice B in cui scriviamo le prime
tre colonne uguali ad A e l'ultima uguale a b. Oppure, possiamo vedere se esiste una
14/18
15. Appunti d’esame:
le matrici e matlab Visto su: Profland
funzione di Matlab che fonde insieme la matrice A ed il vettore b già inseriti. Basta
scrivere:
B=[A , b]
Premendo il tasto "invio" Matlab creerà la matrice B prendendo le tre colonne di A ed
affiancandoci in fondo a destra la colonna b. Quindi, il separatore virgola "," fa
capire a Matlab che noi vogliamo affiancare due strutture precedentemente
definite. Naturalmente perché ciò sia possibile le due strutture devono essere
affiancabili, cioè devono avere lo stesso numero di righe, se non ce l'hanno Matlab
non le può affiancare. Ad esempio, se scriviamo:
C = [A , [1 2 3]]
In tal caso sto tentando di affiancare alla struttura A la struttura costituita dal vettore
riga [1 2 3]. Ciò non è possibile perché la prima struttura è fatta da tre righe e la
seconda e fatta da una sola riga. Se premiamo il tasto "invio" Matlab ci risponderà
con un messaggio di errore:
??? All matrices on a row in the bracketed expression must have the
same number of rows.
Avvertendoci che le strutture da affiancare devono avere lo stesso numero di
righe.
Oltre ad affiancare due strutture possiamo anche metterne una sotto l'altra, per fare
questo dovremo usare la seguente sintassi:
C = [A ; [1 2 3]]
Quindi, il separatore punto e virgola ";" fa capire a Matlab che noi vogliamo
mettere una struttura sotto un'altra precedentemente definita. Questa volta
stiamo tentando di aggiungere la riga [1 2 3] in fondo in basso alla matrice A, ciò è
possibile perché la riga che stiamo tentando di aggiungere ha lo stesso numero di
colonne di A; se non avesse lo stesso numero di colonne di A, Matlab ci avviserebbe
con un messaggio di errore, avvertendoci che le strutture da mettere una sotto
l'altra devono avere lo stesso numero di colonne.
Torniamo al nostro esempio di partenza. Avevamo la matrice A con determinante
nullo e rango 2. Ed abbiamo costruito la matrice B=[A , b] affiancando il vettore
colonna b ad A. Calcoliamo il rango di B, scriviamo:
rank(B)
premendo il tasto "invio" Matlab ci risponderà con:
15/18
16. Appunti d’esame:
le matrici e matlab Visto su: Profland
ans = 2
Questo significa che A e B hanno lo stesso rango per cui il sistema ammette
sicuramente soluzione. Quante sono le soluzioni?
Se il rango di A fosse stato 3 la soluzione sarebbe stata unica.
Poiché il rango di A è 2, le possibilità che avevamo erano:
• che il sistema non ammetteva soluzione, se il rango di B fosse stato maggiore di 2,
• che il sistema ammetteva infinite, se il rango di B fosse stato anch'esso 2.
Poiché abbiamo verificato che B ha rango 2, le soluzioni sono infinite.
Come si ottengono tali soluzioni?
Per quanto abbiamo detto prima, dobbiamo cancellare una riga di A e spostare una
colonna dal lato del termine noto. Siccome il minore:
12
45
è diverso da zero, le prime due righe sono linearmente indipendenti. Per cui possiamo
3
cancellare l'ultima riga di A "7 8 9" e la colonna che resta a destra 6
la portiamo dal
lato del termine noto. Pertanto, il sistema che in origine era Ax=b, cioè:
1 2 3 x1 1
4 5 6 x2 = 2
7 8 9 x 3
3
si riduce al seguente sistema:
1 2 x1 1 3
4 5 x = 2 − x3 6
2
Per trovare le soluzioni si assegna un valore arbitrario ad x3 e, in dipendenza di questo
valore, si calcolano i valori delle altre due incognite x1 e x2.
Per scrivere tutto ciò in Matlab usiamo la seguente sintassi. La matrice ridotta AA
ottenuta da A cancellando l'ultima riga e spostando l'ultima colonna la scriviamo in
Matlab come:
AA = A(1:2 , 1:2)
Cioè stiamo dicendo a Matlab che AA è la sottomatrice ottenuta da A prelevando i
primi due elementi di riga e di colonna. Questa sottomatrice ha determinante diverso
da zero. Controlliamo che ciò sia vero, scriveremo:
det(AA)
16/18
17. Appunti d’esame:
le matrici e matlab Visto su: Profland
premendo il tasto "invio" Matlab ci risponderà con:
ans = -3
Analogamente, possiamo costruire il nuovo termine noto estraendolo dal vecchio
termine noto, scriveremo in Matlab:
bb = b(1:2)
A questo punto, abbiamo tutti i termini per far calcolare a Matlab le soluzioni.
Ricordiamo che dobbiamo anche assegnare un valore ad x3, per semplicità scegliamo
di porre x3 = 0. In corrispondenza di x3 = 0 calcoleremo i valori delle altre due
incognite. Tra tutte le soluzioni, quella ottenuta ponendo uguali a zero le incognite
arbitrarie è detta soluzione basica. In tal caso, in Matlab potremo scrivere:
x = inv(AA)∗bb
premendo il tasto "invio" Matlab ci risponderà con:
ans = -0.3333
0.6667
La soluzione completa è quindi:
x1 = - 0.3333
x2 = 0.6667
x3 = 0
Per trovare un'altra delle infinite soluzioni, dobbiamo assegnare un altro valore ad x3.
Voglio farvi notare che il modo con cui abbiamo scritto la soluzione, passando per il
calcolo della matrice inversa inv(AA) non è efficiente. Perché il calcolo della matrice
inversa comporta di per sé, come abbiamo già detto, la soluzione di due sistemi. Per
rendere il calcolo più efficiente bisogna dire a Matlab di non passare per la matrice
inversa, per fare questo in Matlab è possibile scrivere:
x = AA bb
premendo il tasto "invio" Matlab ci risponderà con:
ans = -0.3333
0.6667
Il simbolo back slash "" è un comando di Matlab che ci ricorda che questa è una
pseudo-divisione; cioè, è una divisione fra matrici in cui, a differenza di quello che
accade nelle divisioni normali, è importante anche la posizione dei termini.
17/18
18. Appunti d’esame:
le matrici e matlab Visto su: Profland
Il file è stato scaricato/visualizzato in forma gratuita da Profland:
http://profland.altervista.org
sezione Profstudio
http://profland.altervista.org/profstudio/profstudio.htm
oppure da qualche mirror, come:
www.profland.cjb.net www.profland.135.it
o dalla pagina dedicata su slideshare.net:
www.slideshare.net/profman
18/18