Indroduzione a MatLab - Dipartimento Metodi e modelli per l

Indroduzione a MatLab
Bernardi Mauro
Sapienza, University of Rome
MEMOTEF Department
April 3rd, 2014
1 / 44
Sommario
Cosa `e Matlab?
Comandi Elementari
Strutture di Dati
Importazione Dati
Grafici
Definizione di funzioni
2 / 44
Che cos’`e Matlab?
Matlab `e un linguaggio di programmazione orientato alla costruzione e
validazione di modelli matematico-statistici applicabili non soltanto in
ambito economico o finanziario, ma anche per la soluzioni di problemi in
fisica, biologia o ingegneria.
Il software `e distribuito da MathWorks. Ulteriori informazioni sulla
licenza del software possono essere ottenute sul sito:
http://www.mathworks.com
Il programma MatLab (Mathematic Laboratory ) `e nato principalmente
come programma destinato alla gestione di matrici. Le versioni successive
sono state completate con serie di funzioni che permettono le pi`
u
complesse analisi numeriche, adatte all’analisi e alla soluzione di problemi
di ottimizzazione, di controllo oppure alla creazione di appositi filtri per
l’estrazione del segnale da un processo osservato con rumore, solo per
citare alcuni esempi.
3 / 44
L’ambiente di Matlab dispone di:
I
un’ampia collezione di funzioni per l’analisi dei dati
I
una grande variet`a di operatori per il calcolo matriciale
I
elevate funzionalit`a grafiche per l’analisi dei dati
I
un linguaggio di programmazione ben strutturato con un editor
interattivo e ottime potenzialit`a di debugging
I
un elevato numero di pacchetti di applicazioni aggiuntive, toolboxes,
come ad esempio il Financial toolbox oppure l’Econometric toolbox
I
ampio supporto da parte della comunit`a degli utilizzatori. A questo
proposito si consulti il sito
http://www.mathworks.com/matlabcentral/).
4 / 44
La riga di comando
La linea di comando di MATLAB `e indicata da un doppio prompt come
nel sistema operativo DOS:
>>
situato all’interno della finestra dei comandi, command window.
La linea di comando accetta dichiarazioni di variabili, espressioni e
chiamate a tutte le funzioni disponibili nel programma di base oppure in
uno dei toolbox installati.
5 / 44
Molte delle funzioni di MATLAB non sono altro che files di testo, con
estensione .m, simili a quelli che l’utente pu`
o generare con un text editor.
Queste funzioni possono essere eseguite semplicemente digitandone il
nome sulla linea di comando oppure possono essere modificate dall’utente
utilizzando il comando edit, come nel seguente esempio:
>> edit var.m
L’esecuzione del comando apre una finestra, ovvero l’editor di matlab,
contenente il codice della funzione che calcola la varianza, unitamente al
commento della stessa funzione.
Matlab permette inoltre di richiamare le ultime righe di comandi inseriti
usando le frecce in alto e in basso.
6 / 44
Help di Matlab
MATLAB presenta un help in linea con informazioni sulla sintassi di tutte
le funzioni disponibili e di tutte le funzioni che sono presenti nei toolbox
installati.
Per accedere a queste informazioni, basta digitare da riga di comando, il
comando help seguito dal nome della funzione di cui si vuole ottenere
informazioni, come nel seguente esempio:
>> help nomefunzione.m
7 / 44
´ anche possibile chiedere informazioni su tutte le funzioni di una certa
E
categoria. Ad esempio per sapere quali sono le funzioni specifiche per
l’analisi ed il controllo di sistemi dinamici, sar`a sufficiente digitare:
>> help control
Infine, per sapere quali sono le varie categorie di funzioni disponibili in
tutti i toolbox installati, basta digitare semplicemente il comando help,
come di seguito:
>> help
8 / 44
I files di Matlab
I files interpretati dal programma sono file di testo ASCII con estensione
.m. Questi files sono generati con un text editor e sono eseguiti in
Matlab semplicemente digitandone il nome, senza l’estensione, sulla linea
di comando. Ad esempio, la seguente successione di comandi:
>>
>>
>>
>>
>>
%
%
n
x
y
Generazione di numeri da una Normale Standard
e calcolo della varianza empirica
= 100;
= randn(n, 1);
= var(x);
genera una sequenza di 100 numeri casuali da una distribuzione
Gaussiana Standard, e ne calcola la varianza empirica. Le prime due righe
di codice non vengono interpretate dal software in quanto precedute dal
simbolo di percentuale %, che consente quindi l’inserimento di commenti.
9 / 44
La punteggiatura in Matlab
Le istruzioni, siano esse contenute in un file .m lanciato da Matlab,
oppure digitate direttamente dalla linea di comando, vanno sempre
terminate con un punto e virgola, altrimenti il risultato dell’applicazione
dell’istruzione viene visualizzato.
Ad esempio il seguente comando;
>> z = z = linspace(-2, 2, 6)
crea una successione deterministica di 6 numeri in cui il primo `e −2
mentre l’ultimo `e 2 e ne visualizza l’output, ovvero il contenuto
dell’oggetto z:
>> z = linspace(-2, 2, 6)
z =
-2.0000
-1.2000
-0.4000
>>
0.4000
1.2000
2.0000
10 / 44
Alcuni costrutti in MATLAB permettono la concatenazione di diverse
istruzioni che vanno separate con delle virgole.
if (flag == 0),
istruzioni separate da virgole;
end;
Le variabili seguono le regole dei linguaggi di programmazione come il
Pascal o il C. Matlab `e case-sensitive e accetta nomi di variabili lunghi
fino ad un massimo di 19 caratteri alfanumerici, con il primo
obbligatoriamente alfabetico.
11 / 44
Per visualizzare il contenuto di una variabile `e sufficiente digitarne il
nome senza punto e virgola sulla linea di comando.
Tutti i calcoli effettuati in Matlab sono eseguiti in doppia precisione, ma
si possono visualizzare in un formato diverso usando i comandi:
I
format short: Virgola fissa con 4 decimali
I
format long: Virgola fissa con 15 decimali
I
format short e: Notazione scientifica 4 decimali
I
format long e: Notazione scientifica 15 decimali
Il risultato dell’ultima operazione `e memorizzato nella variabile ans.
12 / 44
Comandi di uso generale
I
I
who
elenco delle variabili definite in memoria
whos
informazioni su tutte le variabili in memoria
I
clear
cancella tutte le variabili in memoria o una in particolare se
specificata
I
save
salva tutte le variabili in memoria sul file specificato, in vari formati
I
load
richiama in memoria le variabili salvate sul file specificato
13 / 44
I
diary
salva sul file di testo ASCII diary quanto da quel momento in poi
appare sullo schermo
I
what
elenco di tutte le funzioni Matlab nell’area di lavoro (estensione .m)
e dei file di dati che sono stati salvati (estensione .mat)
14 / 44
Comandi Elementari
I comandi elementari consistono in espressioni ed assegnazioni. Le
espressioni vengono valutate e il relativo valore viene visualizzato ma non
resta in memoria. Le espressioni si dividono in due categorie
fondamentali, le espressioni aritmetiche, che coinvolgono operazioni con
numeri (naturali, reali, complessi,...) e le espressioni logiche che invece
coinvolgono proposizioni logiche. Alcuni esempi delle due categorie di
espressioni sono contenute nella seguente tabella.
Aritmetiche
Addizione
Sottrazione
Moltiplicazione
Divisione
Elevamento a potenza
Radice quadrata
>>
>>
>>
>>
>>
>>
1+2
1-2
1*2
1/2
3^2
sqrt(9)
Logiche
Maggiore
Minore
Non inferiore
Non superiore
Uguglianza
Disuguaglianza
>>
>>
>>
>>
>>
>>
1
1
1
1
1
1
> 2
< 2
>= 2
<= 2
== 2
!= 2
15 / 44
Operatori scalari
Gli operatori disponibili sono, solo per citarne alcuni:
I
addizione +, sottrazione −, moltiplicazione ∗, divisione /
I
elevamento a potenza, 24
I
sin, cos, tan
I
asin, acos, atan
I
exp, log (naturale), log 10(in base 10)
I
abs, sqrt, sign
16 / 44
L’unit`a complessa `e i o j ed `e predefinita. Quando si svolgono
operazioni che coinvolgono numeri complessi `e meglio non usare i o j
come variabili o indici nei cicli.
Un numero complesso si scrive nella forma z = a + i ∗ b.
Ai numeri complessi possono essere applicati i seguenti operatori:
I
abs: modulo, es. abs(z)
I
angle: fase, es. angle(z)
I
real: parte reale, es. real(z)
I
imag: parte immaginaria, es. imag(z)
17 / 44
Vettori
Esistono diversi tipi di strutture di dati che possono essere utilizzati in
Matlab. Tra queste, la pi`
u semplice struttura di dati `e il vettore
numerico, che consiste in una n-upla ordinata di numeri. Un generico
vettore z pu`
o essere ottenuto in diversi modi:
>> z = 1:5;
>> z = linspace(1, 5, 5);
Alcune volte un comando pu`
o risultare pi`
u comodo di altri:
>> z = [1, 3, 5, 7, 9];
>> z = linspace(1, 9, 4);
L’inserimento di un vettore in generale viene effettuato utilizzando le
parentesi quadrate [], separando gli elementi delle righe con spazi o
virgole, es. x=[1, 2, 3];.
18 / 44
Operazioni su vettori
Consideriamo i vettori z ed y:
>> z = 1:5
>> y = linspace(2, 10, 5)
Alcune delle possibili operazioni che si possono effettuare utilizzando
questi due vettori sono:
Addizione
Prodotto Scalare
Prodotto Vettoriale
Potenza
Somma
>>
>>
>>
>>
>>
6 + z
y .* z
6 * z
z^2
sum(z)
Lunghezza
Trasposizione
Ordinamento
Minimo
Massimo
>>
>>
>>
>>
>>
length(z)
z’
sort(z)
min(z)
max(z)
Ogni comando ha una sua pagina di aiuto, che pu`
o essere richiamata
tramite il comando help nomecomando.
19 / 44
Una operazione particolare `e l’accesso a sottoinsiemi di elementi. Ad
esempio:
>> z = 5:20
I
Secondo elemento di z:
>> z(2)
I
Elementi dal primo al quinto:
>> z(1:5)
I
Elementi maggiori di 10:
>> z(z > 10)
20 / 44
Matrici e loro operatori
Un altro tipo di struttura utilizzata da Matlab sono le matrici, che
possono essere considerate come delle collezioni di vettori riga (colonna).
L’inserimento di un vettore o di una matrice in generale viene effettuato
utilizzando le parentesi quadrate [], separando gli elementi delle righe
con spazi o virgole, e le diverse righe con punti e virgola (oppure andando
a capo ad ogni nuova riga).
X1
A 1
B 2
C 3
Dati
X2 X3
2 3
3 4
4 5
>> dati = zeros(3, 4)
oppure
>> dati = [1, 2, 3, 4; 5, 6, 7, 8; 9,
10, 11, 12]
21 / 44
Anche per le matrici `e possibile l’indicizzazione:
I
il generico elemento am,n della matrice A, viene indirizzato come
A(m, n ):
>> dati(2,3)
I
la riga m-esima viene indirizzata come A(m, :), dove i due punti
indicano che ci riferiamo a tutte le colonne
>> dati(2,:)
I
la colonna n-esima viene indirizzata come A(:, n ), dove i due punti
indicano che ci riferiamo a tutte le colonne:
>> dati(:,2)
I
la prima e seconda colonna viene indirizzata come A(:, 1 : 2)
>> dati(:,1:2)
I
la sottomatrice avente come estremi gli elementi di riga r1 fino a r2
e di colonna c3 fino a c4 viene indirizzata come A(r1 : r2 , c1 : c2 )
Nota: a differenza del linguaggio C, in Matlab tutti gli indici delle matrici
e dei vettori partono da 1.
22 / 44
Operazioni su matrici
Definite le matrici A e B aventi la stessa dimensione (2, 3), lo scalare c, e
la matrice D di dimensione (3, 2), nel seguente modo:
>> A = [1,2,3;2,3,4];
>> B = [7,2;9,8;4,1];
>> c = 6;
>> D = [13,12;31,12;43,24];
possiamo definire le seguenti operazioni sulle matrici appena definite:
Somma
Prodotto
Prodotto Vettoriale
Divisione a sinistra
Divisione a destra
Trasposizione
Indicizzazione
>>
>>
>>
>>
>>
>>
>>
A + B
c * A
A * D[,1]
A\B = inv(A)*B
B/A = B*inv(A)
A’
A[1:2, 3]
23 / 44
Altre funzioni operanti essenzialmente su vettori (riga o colonna) sono:
max, min, median, sort, sum, prod, length
Esistono poi particolari operatori (.*, ./, .^) che permettono di
effettuare operazioni su vettori elemento per elemento, senza ricorrere a
cicli. Ad esempio, se x `e un vettore, per moltiplicare elemento per
elemento i due vettori sin(x) e cos(x) basta eseguire il seguente comando:
>> y = sin(x) .* cos(x);
24 / 44
Altre funzioni che operano invece essenzialmente su matrici sono:
I
inv, che definisce l’inverse
I
det, che definisce il determinante
I
size, che definisce la dimensione
I
rank, che definisce il rango
I
eig, che definisce la matrice di autovalori (ortonormale), e il vettore
di autovalori
Tutte le funzioni che operano su matrici hanno dei vincoli sugli operandi
introdotti. Ad esempio non si pu`
o invertire una matrice non quadrata.
Per ulteriori spiegazioni sulla sintassi della funzione utilizzare il comando
help.
25 / 44
Esistono infine varie funzioni predefinite per la creazione di matrici:
I
eye(n): matrice identit`a n righe n colonne
I
zeros(m,n): matrice di 0 con m righe e n colonne
I
ones(m,n): matrice di 1 con m righe e n colonne
I
rand(m,n): matrice casuale di valori tra 0 e 1
I
diag(X): se X `e un vettore con n elementi, produce una matrice
quadrata diagonale di dimensione n per n con gli elementi di X sulla
diagonale. Se invece X `e una matrice quadrata di dimensione n per
n, produce un vettore di n elementi pari a quelli sulla diagonale di X.
26 / 44
Esercizi
1. Assegnare al vettore z il valore “radice quadrata di diecimila”.
2. Creare il vettore pari10, sequenza dei primi dieci numeri pari.
3. Creare il vettore dispari100, sequenza dei primi dieci numeri
dispari.
4. Estrarre il terzo valore del vettore pari
5. Estrarre tutti i valori di dispari100 maggiori di cinquanta.
6. Creare mat19, una matrice 3x3 di valori nulli.
7. Riempire la matrice mat19 dei seguenti valori:
1
4
7
2
5
8
3
6
9
27 / 44
Importazione Dati
I dati vengono spesso raccolti in file separati. I file in formato testo
vengono generalmente letti attraverso il comando importdata
>> dati = importdata(’C:/.../ais.txt’)
>> dati
sex
female
female
female
female
...
sport
B_Ball
B_Ball
B_Ball
B_Ball
...
rcc
3.96
4.41
4.14
4.11
...
wcc
7.5
8.3
5.0
5.3
Hc
37.5
38.2
36.4
37.3
Hg
12.3
12.7
11.6
12.6
Fe
60
68
21
69
bmi
20.56
20.67
21.86
21.88
ssf
109.1
102.8
104.6
126.4
Bfat
19.75
21.30
19.88
23.66
lbm
63.32
58.55
55.36
57.18
H
195.
189.
177.
185.
Il file contiene la rilevazione effettuata su un campione di 202 atleti, delle
seguenti variabili: il sesso, l’attivit´a sportiva esercitata, il numero di
globuli rossi, il numero di globuli bianchi, il livello di ematocrito, il livello
di emoglobina, il livello di concentrazione della ferritina nel plasma,
l’indice di massa corporea, l’indice di massa grassa, la percentuale di
grasso, l’indice di massa magra, l’altezza e il peso.
28 / 44
Prime Elaborazioni
I
Estrarre la terza colonna della matrice e assegnarle il nome rcc
>> rcc = dati(:,)
I
Calcolare la media campionaria dei dati contenuti in rcc
n
z=
∑ zi /n
i =1
>> mediarcc = sum(rcc)/length(rcc)
I
Calcolare la varianza campionaria corretta del vettore rcc
2
∑ni=1 (zi − z )
n−1
>> varianzarcc = (sum(rcc-mediarcc)^2)/(length(rcc)-1)
s2 =
29 / 44
Prime Elaborazioni
I
Estrarre la terza colonna della matrice e assegnarle il nome rcc
>> rcc = dati(:,)
I
Calcolare la media campionaria dei dati contenuti in rcc
n
z=
∑ zi /n
i =1
>> mediarcc = sum(rcc)/length(rcc)
I
Calcolare la varianza campionaria corretta del vettore rcc
2
∑ni=1 (zi − z )
n−1
>> varianzarcc = (sum(rcc-mediarcc)^2)/(length(rcc)-1)
s2 =
30 / 44
Prime Elaborazioni
I
Estrarre la terza colonna della matrice e assegnarle il nome rcc
>> rcc = dati(:,)
I
Calcolare la media campionaria dei dati contenuti in rcc
n
z=
∑ zi /n
i =1
>> mediarcc = sum(rcc)/length(rcc)
I
Calcolare la varianza campionaria corretta del vettore rcc
2
∑ni=1 (zi − z )
n−1
>> varianzarcc = (sum(rcc-mediarcc)^2)/(length(rcc)-1)
s2 =
31 / 44
Prime Elaborazioni
I
Estrarre la terza colonna della matrice e assegnarle il nome rcc
>> rcc = dati(:,)
I
Calcolare la media campionaria dei dati contenuti in rcc
n
z=
∑ zi /n
i =1
>> mediarcc = sum(rcc)/length(rcc)
I
Calcolare la varianza campionaria corretta del vettore rcc
2
∑ni=1 (zi − z )
n−1
>> varianzarcc = (sum(rcc-mediarcc)^2)/(length(rcc)-1)
s2 =
32 / 44
Prime Elaborazioni
I
Estrarre la terza colonna della matrice e assegnarle il nome rcc
>> rcc = dati(:,)
I
Calcolare la media campionaria dei dati contenuti in rcc
n
z=
∑ zi /n
i =1
>> mediarcc = sum(rcc)/length(rcc)
I
Calcolare la varianza campionaria corretta del vettore rcc
2
∑ni=1 (zi − z )
n−1
>> varianzarcc = (sum(rcc-mediarcc)^2)/(length(rcc)-1)
s2 =
33 / 44
Prime Elaborazioni
I
Estrarre la terza colonna della matrice e assegnarle il nome rcc
>> rcc = dati(:,)
I
Calcolare la media campionaria dei dati contenuti in rcc
n
z=
∑ zi /n
i =1
>> mediarcc = sum(rcc)/length(rcc)
I
Calcolare la varianza campionaria corretta del vettore rcc
2
∑ni=1 (zi − z )
n−1
>> varianzarcc = (sum(rcc-mediarcc)^2)/(length(rcc)-1)
s2 =
34 / 44
Gli stessi risultati possono essere ottenuti tramite le funzioni mean e var,
che restituiscono rispettivamente la media campionaria e la varianza
campionaria corretta:
>> mean(rcc)
4.718614
>> var(rcc)
0.2097423
Altre statistiche possono essere facilmente calcolate. Ad esempio la
mediana:
>> quantile(rcc, 0.5)
4.755
35 / 44
Grafici
La funzione plot crea grafici bidimensionali: riceve in ingresso due vettori
della stessa lunghezza e stampa i punti corrispondenti alle coordinate
fornite dai due vettori. Ad esempio se si hanno due vettori x e y, il grafico
corrispondente si ottiene come:
>> plot(x, y);
36 / 44
Per tracciare il grafico di una qualsiasi funzione, `e perci`o necessario
crearsi un opportuno vettore da usare come ascisse, passarlo alla funzione
per ricavare un vettore contenente le ordinate, ed usare la funzione plot
sui due vettori cos ottenuti. Ad esempio per tracciare la funzione sin(x)
tra -4 e 4 si pu`
o usare la serie di comandi:
>> x = -4:0.01:4;
>> y = sin(x);
>> plot(x, y);
Se si usa la funzione plot con un solo parametro complesso, il grafico
rappresenter la parte reale e la parte immaginaria degli elementi del
vettore. Ad esempio
>> plot(y);
con y complesso, equivale a:
>> plot(real(y),imag(y));
37 / 44
Per creare grafici di colori diversi o usando caratteri diversi dal punto si
pu`
o specificare dopo le coordinate una stringa di 2 elementi. Il primo `e il
colore del grafico, il secondo il simbolo usato per contrassegnare i punti.
Ad esempio
>> plot(x, y, ’g+’);
crea un grafico in verde usando dei + al posto dei punti. Questa opzione
pu`
o essere usata nei casi di grafici sovrapposti da stampare (se la
stampante a disposizione non `e a colori e se non si cambia il tipo di
simbolo, non si capisce pi`
u nulla ... ).
38 / 44
Per ottenere un istogramma si usa il comando hist, come nel seguente
esempio, nel quale generiamo 10000 osservazioni da una distribuzione
Normale standard:
>> n = 10000;
>> x = randn(n, 1);
>> hist(x, 100);
350
300
250
200
150
100
50
0
−4
−3
−2
−1
0
1
2
3
4
39 / 44
Il precedente grafico non risulta normalizzato, vale a dire che sull’asse
delle ordinate presenta i valori assoluti anzich`e la stima della probabilit`a .
Per ottenere l’istogramma normalizzato possiamo eseguire i seguenti
comandi:
>>
>>
>>
>>
>>
[M,h] = hist(x, 100);
M = M/(h(2) - h(1))/cT;
bar(h, M, 1, ’w’);
h = findobj(gcf,’Type’,’patch’);
title(’Histogram’,’FontName’,’Tahoma’,’FontSize’,9);
40 / 44
Il seguente grafico rappresenta l’istogramma normalizzato dei valori
precedentemente simulati. La linea rossa rappresenta invece la densit`a di
probabilit`a teorica di una distribuzione Normale standard ottenuta
utilizzando il comando normpdf.
Histogram
0.5
0.45
0.4
0.35
0.3
0.25
0.2
0.15
0.1
0.05
0
−4
−3
−2
−1
0
1
2
3
4
41 / 44
Se invece si desidera ottenere una soluzione un po’ pi´
u raffinata possiamo
fare il grafico di un istogramma lisciato che assomiglia molto alla densit´a
di una variabile casuale continua, utilizzando il comando ksdensity.
>> [f, xi] = ksdensity(x);
>> plot(xi, f);
0.45
0.4
0.35
0.3
0.25
0.2
0.15
0.1
0.05
0
−5
−4
−3
−2
−1
0
1
2
3
4
5
42 / 44
Definizione di nuove funzioni
In MATLAB `e possibile creare nuove funzioni. Basta creare un file con
estensione .m e nome del file uguale a quella della funzione desiderata.
La prima riga del file deve contenere il nome della funzione e gli
argomenti di ingresso e di uscita. Ad esempio, in
function z = myfun1(a,b)
oppure in
function [x, y] = myfun2(a,b)
risulta che fun1 e fun2 sono nomi di funzioni; a e b sono argomenti di
ingresso; x, y e z sono argomenti d’uscita.
43 / 44
Il blocco di linee di commento consecutive che eventualmente segue la
prima linea del file viene visualizzato digitando il comando help seguito
dal nome della funzione creata.
Le variabili utilizzate in una funzione sono locali e quindi indipendenti da
´ possibile utilizzare anche variabili
quelle dell’ambiente chiamante. E
globali, a patto che vengano definite come tali sia nell’ambiente
chiamante sia nella funzione, utilizzando il comando global seguito dai
nomi delle variabili, separati da spazi. Ad esempio:
global F G H
44 / 44