DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Strumenti per il calcolo numerico
Matlab/Octave
Marco D. Santambrogio – [email protected]
Ver. aggiornata al 24 Agosto 2015
Obiettivi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Benvenuti nel fantastico mondo di
Matlab/Octave!
2
Matlab
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Cos’è Matlab:
• strumento (e corrispondente linguaggio) per elaborazioni di
calcolo numerico
• NB: sta per MATrix LABoratory
» centrato sulle matrici (ma include generiche funzionalità matematiche)
• usato nei successivi corsi di calcolo numerico
• MATLAB è uno strumento commerciale
 distribuito, su licenza NON gratuita, da “The MathWorks Inc”
• Student edition disponibile quando si è al Politecnico
 Esiste un altro strumento di nome Octave
• identico nella concezione, molto simile per gli aspetti operativi
• disponibile gratuitamente, vedi www.gnu.org/software/octave/
3
Caratteristiche del linguaggio di
Matlab/Octave (1)
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Linguaggio di alto livello
 simile a linguaggi di programmazione C, Java, Pascal
 possiede comandi sintetici per effettuare complesse
elaborazioni numeriche
• Linguaggio interpretato, comandi e istruzioni
• NON tradotti in codice eseguibile dall’hardware
• MA manipolati da un programma (l’interprete) che li analizza ed
esegue azioni da essi descritte
• Linguaggio dinamico
 NON occorre dichiarare le variabili
• risultano definite dal punto in cui vengono introdotte
– e vengono incluse in una struttura detta tabella dei simboli
 il tipo delle variabili è dinamico
• a una variabile si possono assegnare, successivamente, valori
di tipo diverso (scalari, stringhe, vettori, matrici...)
4
Caratteristiche del linguaggio di
Matlab/Octave (2)
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• In Matlab/Octave tutto è un array
 ci sono casi particolari significativi di array
•
•
•
•
array 1x1 sono gli scalari
array con una sola riga o colonna sono i vettori
array con due dimensioni sono le matrici
array con >2 dimensioni: matrici
multidimensionali
5
Per macchine PoliMI
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
https://virtualdesktop.polimi.it
6
Screenshot interfaccia MATLAB
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Mostra le variabili
nel workspace
Contenuto della
directory corrente
Storia dei
comandi
Finestra dei
comandi
Lancia i tool di MATLAB ed
altro…
- 7 -- 7 7
Screenshot dell’interfaccia OCTAVE
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Linea di comando
dell’interprete
8
GUI di Octave
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Contenuto della
directory corrente
Finestra dei
comandi
Storia dei
comandi
9
Comandi in Matlab
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Matlab accetta comandi che l’utente scrive di
seguito al “prompt”: >>
 es. >> a = 10;
 Assegna alla variabile a il valore 10
• Esempio di alcuni comandi:
 help richiama la guida in linea
 diary può essere utilizzato per salvare la sessione
di lavoro
 who, whos e workspace mostrano l’elenco delle
variabili definite
 save permette di salvare in un file le variabili
definite. Load le ricarica
 clear cancella tutte le variabili
10
Esempi
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Input
Output
Commento
1234/6
ans = 205.67
calcolo di un valore scalare
a=1234/6
a = 205.67
assegnamento alla
risultato di 1234/6
eps
eps =
variabile predefinita: la più piccola
differenza rappresentabile tra due
numeri
2/5
ans = 0.40000
divisione “destra”
5/0
ans = Inf
divisione per zero
5^2
ans = 25
potenza
real(4+5j)
ans = 4
real è una funzione predefinita che
restituisce la parte reale di un numero
complesso
1+1==2
1+1~=2
ans = 1
ans = 0
1 = vero, 0 = falso, “==” uguale, “~=”
diverso (codice ASCII di ‘~’: 126)
2.2204e-16
variabile
a
del
11
Esempi con gli array
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
a=[1 2; 3, 4]
a =
1
3
a
2
4
a =
restituisce il valore della variabile a
1
3
2
4
x=[-1.3
sqrt(3)
(1+2)/5]
x =
-1.30000 1.73205
x(5)=abs(x(1))
x =
-1.30000
1.73205
1.30000
b=a’
c=a+b
x=[-1 0 2]; y=x'
a ora è una matrice 2x2, “;” separa
le righe; virgola opzionalmente
separa elementi (ma basta lo
spazio)
b =
1
2
3
4
c =
2
5
5
8
elementi possono essere espressioni
0.60000
0.60000
0.00000
Notazione con () per accedere a elementi
di una matrice; abs valore assoluto; NB:
vettore x esteso per includere nuovo
elemento; elementi non assegnati sono
nulli
matrice trasposta (scambiate righe
e colonne)
somma di matrici, elemento per
elemento (sottrazione con “-”
simile)
y =
-1
0
2
il “;” blocca l’output, ma non
impedisce la valutazione
- 12 -
12
Altre operazioni con gli array
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
a = []
x=1:5
a =
x =
1
[]
array vuoto, convenzionalmente
rappresenta valore nullo
2
operatore “:” per produrre vettori di
numeri
3
y=0:pi/4:pi
y =
0.00000
1.57080
3.14159
v=10:-4:-3
v =
10
6
4
5
operatore “:” con passo di
0.78540
incremento e valori non interi (pi
2.35619
è pigreco)
2
-2
sin(y)
ans =
0.00000
1.00000
0.00000
x=[0:pi/100:pi/2]';
[x sin(x)]
ans =
0.00000 0.00000
0.03142 0.03141
......
1.53938 0.99951
1.57080 1.00000
valori negativi del passo e degli
estremi
funzioni predefinite si applicano ai
0.70711
vettori
0.70711
produce la tabella di sin(x), 0xp/2
13
Diagrammi a due dimensioni
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
•
Diagramma = insieme di coppie che rappresentano coordinate di punti
Si usano vettori per contenere sequenze ordinate dei valori di ognuna
delle coordinate
plot(x,y) disegna digramma cartesiano dei punti che hanno


•
valori delle ascisse in x, delle ordinate in y
e li congiunge con una linea, per dare continuità al grafico
funzioni xlabel per visualizzare nome asse ascisse, ylabel per ordinate,
title per il titolo
cubica
1000
800
>> x = -10:0.1:10;
>> y=x.^3;
>> plot(x,y);
>> xlabel('ascisse');
>> ylabel('ordinate');
>> title('cubica');
600
400
200
ordinate
•
•
0
-200
-400
-600
-800
-1000
-10
-8
-6
-4
-2
0
ascisse
2
4
6
8
10
14
Diagramma in GUI-Octave
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
15
Un esempio di cinematica
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Due treni partono da due stazioni
adiacenti, che distano 15km, viaggiando a
velocità di 50m/s e 30m/s in direzione
opposta
• Costruire un grafico che mostra il loro
movimento, fino a quando il più veloce
raggiunge la destinazione
 Il più veloce impiega 15000/50=300s
• DistanzaTreno1=50·t;
• DistranzaTreno2=15000-30·t; (per mostrare la
provenienza dalla direzione opposta)
16
Soluzione
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
t=0:1:300;
p1=50 * t;
p2=15000 – 30 * t;
plot(t,p1);
hold on %adesso è possibile inserire nuove curve sul grafico
plot(t,p2)
hold off
17
Risultati ottenuti con l’esempio
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
18
Istruzioni e ‘;’ – Non come in C
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Le istruzioni possono essere seguite da
‘;’ ma non è obbligatorio
• Il ‘;’ blocca la visualizzazione del valore
delle variabili coinvolte nell’istruzione
 Maggiore velocità di esecuzione
• Regola di buona programmazione
 Inserire sempre il ‘;’, a meno che non si
voglia ispezionare il valore di una variabile a
scopo di debugging
19
Commenti
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Il simbolo di commento può essere messo
in qualsiasi punto della linea.
• MATLAB ignorerà tutto quello che viene
scritto alla destra del simbolo %.
• Per esempio:
>>% This is a comment.
>>x = 2+3 % So is this.
x=
5
20
Array e variabili
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• L’unità fondamentale di dati in MATLAB è l’array
• Una variabile in MATLAB è una regione di memoria che
contiene un array
• Ha un nome definito dall’utente
 Per i nomi valgono regole simili a quelle del C
• C è un linguaggio a tipizzazione forte
 Le variabili vanno dichiarate prima dell’uso
• MATLAB è un linguaggio a tipizzazione debole
 Le variabili vengono create assegnando ad esse dei valori
 Il loro tipo è determinato dal tipo dei valori assegnati
>> x = [1 2 3];
>> whos x;
Name
Size
x
1x3
Bytes
24
Class
Attributes
double
21
Tipo char
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Una variabile di tipo char contiene uno scalare
o un array di valori a 16 bit (8 bit in Octave),
ciascuno dei quali rappresenta un carattere
 Es: commento = ‘questa e` una stringa’;
variabile
Array
di 1x21
caratteri
Nome
(NB: della
stringhe
racchiuse tra
apici
singoli)
 whos commento;
Name
Size Bytes Class Attributes
commento
1x21 42
char
22
Alcuni esempi…
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
23
Una piccola nota “italiana”
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
24
Tipo double
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Una variabile di tipo double contiene uno
scalare o un array di numeri espressi in 64 bit
con doppia precisione
• Questi numeri possono essere
 Reali, es var1 = -10.7;
 Immaginari, es var2 = 4i; var3 = 4j;
 Complessi, es var3 = 10.3 + 10i;
• Es: x = [-1.3 3.1+5.3j 0]
• Le parti reali e immaginarie possono essere
positive e negative nell’intervallo di valori [10308, 10308]
25
Creazione e inizializzazione di una variabile
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Le variabili sono create al momento
dell’inizializzazione
• Modi di inizializzazione
 Assegnamento
 Lettura dati da tastiera
 Lettura da file
26
Assegnamento
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• variabile = espressione
contenuto di a
• Esempi
 a = [0 7+1];
 b = [a(2) 5 a];
secondo elemento di a
• Risultato
 a = [0 8]
 b = [8 5 0 8]
27
Assegnamento: NOTA
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Non tutti gli elementi devono essere
specificati alla creazione…
 Ricordiamo: pippo(2) è il secondo
elemento di pippo
 Cosa sarà elemento_matrice_2D(6,3)?
 Ricordiamo: le variabili sono create al
momento dell’inizializzazione
28
Quindi, “unendo” i ricordiamo…
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
29
Assegnamento (2)
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• L’array può essere esteso successivamente …
 d = [2 5]; d(4)=2;
d = [2 5 0 2]
• Operatore di trasposizione
 g = d’;
2
5
0
2
• Creare un vettore enumerando i valori di un
insieme: uso dell’operatore ‘:’
 x = 1:2:10;
 n = 1:3;
 m = [n’ n’]
x = [1 3 5 7 9]
n = [1 2 3]
1
2
3
1
2
3
30
Tabella delle funzioni predefinite
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Funzione
Significato
zeros (n)
Genera una matrice nxn di zeri
zeros (m,n)
Genera una matrice mxn di zeri
zeros (size(arr))
Genera una matrice di zeri della stessa dimensione di arr
ones(n)
Genera una matrice nxn di uno
ones(m,n)
Genera una matrice mxn di uno
ones(size(arr))
Genera una matrice di uno della stessa dimensione di arr
eye(n)
Genera la matrice identità nxn
eye(m,n)
Genera la matrice identità mxn
length(arr)
Ritorna la dimensione più lunga del vettore
size(arr)
Ritorna un vettore [r c] con il numero r di righe e c di colonne
della matrice; se arr ha più dimensioni ritorna array con
numero elementi per ogni dimensione
v(end)
m(end, end)
ultimo elemento di vettore v; ultimo elemento dell’ultima riga
di matrice m; la costante end, come indice in un array, denota il
più alto valore possibile dell’indice
31
Funzioni predefinite
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Esempi
 a = zeros(2);
0
0
0
0
 b = zeros(2,3);
0
0
0
0
 c = [1 2; 3 4];
 d = zeros(size(c));
0
0
0
0
0
0
32
sottoarray: applicazione a vettori
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Si denota un sottoinsieme di un array usando vettori per valori degli indici
>> v=[6 8 4 2 4 5 1 3]
v =
6
8
4
>> v([1 4 7])
ans =
6
2
1
>> v(2:2:6)
ans =
8
>> v(3:end-2)
ans =
4
>> v(v)
ans =
>>
2
2
2
4
1
3
primo, quarto settimo elemento
2:2:6 è il vettore [2, 4, 6]: indica
secondo, quarto, sesto elemento
5
4
5
dal terzo al terz’ultimo elemento
5
i valori di v usati come indice
5
3
2
8
2
4
6
4
33
sottoarray: applicazione a matrici
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
m = 9
8
7
6
5
4
3
2
1
0
11
12
tutti gli elementi sulle righe 1 e 4 e sulle
0
0
0
colonne 2 e 3
>> m([1 4], [2 3])
ans = 8
7
11
12
tutti gli elementi delle righe 1, 3 e 5
>> m(1:2:5, 1:end)
ans = 9
8
7
3
2
1
0
0
0
>>>> m(1:2:5, :)
notazione ‘:’ abbreviata per 1:end, cioè tutti i
ans = 9
8
7
valori di quell’indice
3
2
1
0
0
0
>> m(2:2:4, :) = [-1 -2 -3; -4 -5 -6];
>> m
m =
9
8
7
uso della notazione dei sottoarray per
-1
-2
-3
individuare elementi oggetto di
3
2
1
-4
-5
-6
assegnamento
0
0
0
>>
34
Nota sui sottoarray
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Perchè: temp(2:2:4, :)…
e non temp(2:4, :)?
Perchè temp(2:4, :) sono
le righe 2, 3 e 4!!!
35
Uso di uno scalare per assegnare valori
a un array
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Esempio
 m(1:4, 1:3) = 3
3
3
3
3
3
3
3
3
3
3
3
3
• Il modo con cui uno scalare viene
assegnato a un array dipende dalla forma
dell’array che viene specificata a sinistra
dell’assegnamento
• Esempio 2
 m(1:2, 1:2) = 4
4
4
3
3
4
4
3
3
3
3
3
3
36
Uso dell’array vuoto [] per cancellare elementi
di un array
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
•
Un array vuoto [] assegnato a un elemento di un vettore non crea un
‘buco’ ma cancella un elemento e ricompatta il vettore
•
Un array vuoto [] non assegnabile a singoli elementi di matrici (non si
possono “creare buchi”)
•
Assegnabile a intere righe o colonne di matrici, che vengono cancellate
(ricompattando la matrice)
>> a=[1 2 3 4 5];
>> length(a)
ans = 5
>> a(3)
ans = 3
>> a(3)=[]
a = 1
2
4
>> a(3)
ans = 4
>> length(a)
ans = 4
5
>> m=magic(4)
m = 16
2
3
13
5
11
10
8
9
7
6
12
4
14
15
1
>> m(3,4)=[]
??? Subscripted assignment dimension mismatch.
>> m(3,:)=[]
m = 16
2
3
13
5
11
10
8
4
14
15
1
>> [r,c]=size(m)
r = 3
c = 4
>> m(:,2)=[]
m = 16
3
13
5
10
8
4
15
1
>> [r,c]=size(m)
r =
3
c =
3
37
Array: memorizzazione
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Matrici memorizzate
 per colonna: colonna 1, poi colonna 2, 3, etc.
 ogni colonna memorizzata per indici di riga crescenti
• Array memorizzati in forma lineare nella RAM variando
 più velocemente i primi indici
 più lentamente quelli successivi
• NB: opposto a quanto avviene in C
...
1
3
1
2
3
4
5
6
5
2
4
6
...
38
Array: forma linearizzata
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Si può accedere a un array a più dimensioni
come se ne avesse una sola
• Usando un unico indice si segue l’ordine della
memorizzazione
• Da NON usare nella programmazione
 ma aiuta a capire certi costrutti....
39
Variabili predefinite
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
•
Matlab definisce un insieme di variabili predefinite
(es, pi)
• Queste variabili spesso rappresentano importanti
costanti della matematica (pi è pigreco, i e j sono
sqrt(-1) )
 Attenzione! Il valore di queste variabili può essere
modificato, per esempio
• circ1=2*pi*10;
• pi = 3;
• circ2=2*pi*10;
 Il valore di circ2 non sarà più la circonferenza di un
cerchio
•
E` fortemente sconsigliato modificare il valore di
una variabile predefinita ( evitare di usare
variabili i e j come contatori)
40
Variabili predefinite più comuni
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Variabile
Scopo
pi
contiene 15 cifre significative di p
i, j
contiene il valore i ( 1 )
inf (o Inf)
rappresentazione dell’infinito
(ottenuto di solito come risultato di
una divisione per 0)
nan
Not-A-Number è il risultato di una
operazione matematica non definita,
es 0/0
clock
contiene la data e l’orario corrente.
E` un vettore di sei elementi (anno,
mese, giorno, ora, minuti, secondi)
date
contiene la data corrente sotto
forma di stringa
eps
epsilon: la più piccola differenza
rappresentabile tra due numeri
ans
Variabile speciale usata per
immagazzinare risultati non
assegnati ad altre variabili
41
Operazioni con scalari e array
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Operazioni per gli scalari: + - * / ^
• Operazioni per gli array
Elevamento a
potenza
 Array operation: eseguita sugli elementi corrispondenti degli
array coinvolti (devono avere lo stesso numero di righe e
colonne); si indica aggiungendo un punto prima
dell’operatore aritmetico
a= 1 b=2
3 4
2
5
3 a .* b=
7
2 6
15 28
 Matrix operation: segue le regole dell’algebra lineare
(esempio: prodotto righe per colonne)
a= 1 b=2
3 4
2 =3
a*b
5 7
12 17
26 37
a * bij  k aik * bkj
42
Cosa succede con il .
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
43
Altre funzioni
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Funzione
Scopo
ceil(x)
approssima x all’intero immediatamente maggiore
floor(x)
approssima x all’intero immediatamente minore
fix(x)
approssima x all’intero più vicino verso lo zero
max(x)
se x è un vettore, ritorna il valore massimo in x e, opzionalmente, la collocazione
di questo valore in x; se x è matrice, ritorna il vettore dei massimi delle sue
colonne
min(x)
se x è un vettore, ritorna il valore minimo nel vettore x e, opzionalmente, la
collocazione di questo valore nel vettore; se x è matrice, ritorna il vettore dei
minimi delle sue colonne
mean(x)
se x è un vettore ritorna uno scalare uguale alla media dei valori di x; se x è una
matrice, ritorna il vettore contentente le medie dei vettori colonna di x;
mod(m,n)
mod(m,n) è m - q.*n dove q = floor(m ./ n) se n ~= 0
round(x)
approssima x all’intero più vicino
rand(N)
genera una matrice di NxN numeri casuali
44
funzioni min (e anche max) applicate a
vettori e matrici
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
>> b = [4 7 2 6 5]
b = 4
7
2
>> min(b)
ans = 2
>> [x y]=min(b)
x = 2
y = 3
>>
6
5
(con un solo risultato) dà il valore del minimo
con due risultati dà anche la posizione del minimo
>> a = [24 28 21; 32 25 27; 30 33 31; 22 29 26]
a = 24
28
21
32
25
27
30
33
31
22
29
26
per una matrice dà vettore dei minimi nelle colonne
>> min(a)
ans = 22
25
21
>> [x y]=min(a)
x = 22
25
y = 4
2
>>
21
1
per una matrice, con due risultati dà due vettori dei valori
minimi nelle colonne e della loro posizione (riga)
45
Operazioni tipiche per gli array
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
Operazione
Sintassi Commenti
Matlab
Array addition
a+b
Array e matrix addition sono
identiche
Array subtraction
a–b
Array e matrix subtraction sono
identiche
Array multiplication
a .* b
Ciascun elemento del risultato è
pari al prodotto degli elementi
corrispondenti nei due operandi
Matrix multiplication
a*b
Prodotto di matrici
Array right division
a ./ b
risultato(i,j)=a(i,j)/b(i,j)
Array left division
a .\ b
risultato(i,j)=b(i,j)/a(i,j)
Matrix right division
a/b
a*inversa(b)
Matrix left division
a\b
inversa(a)*b
Array
exponentiation
a .^ b
risultato(i,j)=a(i,j)^b(i,j)
46
Matrix left division
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Serve per risolvere sistemi di equazioni lineari
a11x1+a12x2+a13x3=b1
a21x1+a22x2+a23x3=b2
a31x1+a32x2+a33x3=b3
• può essere espresso come Ax=B con
A=
a11 a12 a13
a21 a22 a23
a31 a32 a33
B=
b1
b2
b3
x=
x1
x2
x3
• di conseguenza, x = A-1B=inversa(A)*b=A\B
47
Fonti per lo studio + Credits
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE
• Fonti per lo studio
 Introduzione alla programmazione in
MATLAB, A.Campi, E.Di Nitto, D.Loiacono,
A.Morzenti, P.Spoletini, Ed.Esculapio
• Capitolo 1
• Credits
 Prof. A. Morzenti
48
Scarica

PPT - V0