Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Stefano Berrone
tel. 011 564 7503
sberrone@calvino.polito.it
http://calvino.polito.it/sberrone
Dipartimento di Matematica
Politecnico di Torino
Cos`
e Matlab?
Matlab `e un linguaggio di programmazione interpretato e non di tipo compilato.
Nei linguaggi interpretati le istruzioni vengono immesse direttamente al prompt (in Matlab
rappresentato dalla stringa > >) ed eseguite una ad una dallinterprete dei comandi.
Esempio.
> > 3+4
ans =
7
(+ tasto invio)
Vantaggi:
Comandi
Nel seguito indicheremo con il generico termine comando diverse operazioni, come ad esempio:
Variabili
Nomi di variabile ammissibili: sequenze di caratteri lunghe da 1 a 32 caratteri, contenenti lettere, numeri
(ma mai un numero in prima posizione) e il carattere (underscore).
Matlab `e case sensitive, ovvero distingue fra maiuscole e minuscole indipindentemente dal sistema
operativo con cui si usa (Linux, Windows...).
Esempio. AB, aB, ab e Ab rappresentano quattro variabili diverse.
N.B. Tutte le funzioni predefinite di Matlab vanno usate con i caratteri minuscoli (nonostante il fatto
che nellhelp in linea i nomi di funzione siano tutti scritti in caratteri maiuscoli).
Tipi di variabile
Tra le variabili numeriche, Matlab usa solamente variabili reali in doppia precisione; non usa variabili
intere, ne logiche (ci`o non significa che non gestisce operazioni di tipo logico).
` possibile definire variabili di tipo stringa (vettori di caratteri).
E
Assegnazioni
Sintassi di una istruzione di assegnazione:
> > nomevariabile = espressione
Esempio.
> > a = 1;
N.B. Le variabili non richiedono una dichiarazione prima dellassegnazione.
Se una assegnazione non `e seguita dal carattere ; Matlab mostra immediatamente come output il
risultato dellespressione o dellassegnazione:
> > a = 1
a =
1
Per definire una variabile di tipo stringa si assegna come contenuto una qualsiasi stringa racchiusa fra
apici:
> > var = pluto;
Costanti predefinite
In Matlab sono a disposizione dellutente alcune variabili speciali e costanti predefinite:
ans `e la variabile a cui viene assegnata la most recent ANSwer, ovvero il risultato di espressioni
valutate al prompt senza che siano precedute da unistruzione di assegnazione;
eps contiene lepsilon di macchina; nel caso di arrotondamento la precisione di macchina `e 0.5*eps;
realmax contiene il pi`
u grande numero di macchina positivo;
realmin contiene il pi`
u piccolo numero di macchina positivo rappresentabile in forma normalizzata
(con denormalizzazione si possono rappresentare anche valori fino a realmin252);
pi contiene il valore approssimato di ;
i,j rappresentano entrambi lunit`a immaginaria;
inf rappresenta il valore speciale infinito; `e il risultato ad esempio della divisione 1/0;
NaN rappresenta il valore speciale Not a Number; `e il risultato, ad esempio, della divisione 0/0.
N.B. Le costanti predefinite possono essere usate dallutente come variabili, ignorando il loro valore e
significato, e usandole in una qualsiasi istruzione di assegnazione (ad esempio, le variabili i e j possono
essere tranquillamente usate in un ciclo for): il contenuto predefinito sar`a recuperato riavviando una
nuova sessione di lavoro.
Errori e warning
Distinzione come in molti altri linguaggi fra errori e messaggi di warning.
Quando si commette un errore (ad esempio, se si tenta di fare riferimento ad una variabile non definita)
lesecuzione si blocca.
Esiste un certo numero di operazioni per le quali viene prodotto sul display un messaggio di warning
mentre lesecuzione prosegue.
N.B. A causa della presenza delle costanti predefinite inf e NaN lutente deve porre estrema attenzione
nellassicurarsi che le operazioni che vengono effettuate siano ben definite. A volte un errore pu`
o
compensarsi con altre operazioni senza che lutente se ne renda conto!
Esempio.
> > 1/0 risultato inf (con warning)
> > 1/inf risultato 0.
> > 1/(1/0) risultato 0! (preceduto da un messaggio di warning per la divisione 1/0).
Devessere cura dellutente inserire controlli per assicurarsi di lavorare sempre in campo reale (se `e
questo che si desidera).
Size
1x1
1x1
Bytes
8
8
Class
double array
double array
10
help !
Uno tra i comandi pi`
u utili di Matlab `e senzaltro il comando help.
Se `e noto il nome di un comando, listruzione
> > help nomecomando
fornisce il cosiddetto help in linea del comando: la sintassi duso, gli effetti, varie opzioni di utilizzo ed
eventuali comandi correlati.
Listruzione
> > doc nomecomando
fornisce in generale dettagli ancora maggiori, attingendo alla documentazione di Matlab.
Il comando help pu`o essere usato anche in modo pi`
u generale. I comandi di Matlab sono raggruppati
per topic (argomenti). Lanciando al prompt il comando help da solo, si ottiene come output la lista
dei vari argomenti.
11
>> help
HELP topics:
matlab/general
matlab/ops
matlab/lang
matlab/elmat
matlab/elfun
matlab/specfun
matlab/matfun
matlab/datafun
matlab/audio
matlab/polyfun
matlab/funfun
matlab/sparfun
matlab/graph2d
matlab/graph3d
matlab/specgraph
...
12
18-May-2001
General information
helpbrowser - Bring up the help browser.
doc
- Complete on-line help, displayed in the help browser.
help
- M-file help, displayed at the command line.
helpwin
- M-file help, displayed in the help browser.
lookfor
- Search all M-files for keyword.
syntax
- Help on MATLAB command syntax.
support
- Open MathWorks Technical Support Web Page.
demo
- Run demonstrations.
ver
- MATLAB, SIMULINK, and toolbox version information.
13
version
whatsnew
Con il comando
> > lookfor stringa
Matlab cerca loccorrenza di stringa nella prima riga dellhelp di ogni funzione.
15
> > pi
ans =
3.14159265358979
> > format short e
> > pi
ans =
3.1416e+00
Per poter eseguire dal prompt di Matlab una istruzione del sistema operativo in uso, `e sufficiente
digitarla preceduta da un punto esclamativo !.
Il simbolo % serve a commentare tutto quanto si trova alla sua destra sulla stessa riga.
y = sin(x); % questo e un commento
Tre punti consecutivi (...) rappresentano un simbolo di continuazione, per proseguire unistruzione
lunga alla riga successiva.
> > y = sin(x)+cos(x)-log(x)...
-exp(x);
17
18
elementon]
I vari elementi possono essere valori costanti, nomi di variabile gi`a assegnati o espressioni.
>
>
>
x
> a = 2;
> b = 3;
> x = [1 a 1 b]
=
1
2
1
3
19
elementon]
20
N.B. Nellassegnazione di un array il carattere spazio `e sempre interpretato come il separatore tra due
elementi. Si osservino ad esempio le seguenti istruzioni:
> >
x =
1
> >
y =
1
> >
z =
1
x = [1 2 3+4]
2
y = [1,2,3+4]
2
z = [1,2,3 +4]
2
Per fare riferimento alla componente di indice i di un vettore si usa la sintassi nomevettore(i). In
Matlab non sono ammessi indici nulli o negativi, per fare riferimento alle componenti di un array.
21
Esempio.
> > A = [ 1 2; 3 4]
assegna
A=
1
3
2
4
> > B = [ 1 , 1, 2; pi pi 7]
assegna
B =
2
7
22
` possibile assegnare matrici rettangolari con un numero arbitrario di righe e di colonne; lunico vincolo
E
`e ovviamente costituito dal fatto che ogni riga (e ogni colonna) deve avere la stessa lunghezza.
Esempio. > > B = [ 1 2; 3] Errore!
Per indicare lelemento ij di una matrice, si usa la sintassi nomematrice(i,j).
trasposizione pu`o ovviamente essere usato anche per matrici.
Loperatore di
Esempio.
> > A = [1 1;2 2]
A =
1
1
2
2
> > B = A
B =
1
2
1
2
Il comando B = transpose(A) ha lo stesso effetto.
23
1 2
B =
1 2
C = [y B; 5 6 7] genera la matrice
0
1
3 1 2
C =@ 4 1 2 A
5 6 7
u = [y x] `e errata!
u = [B; z] `e errata!
24
N.B. Poiche non `e necessario dimensionare a priori gli array (Matlab effettua allocazione dinamica
della memoria), non esiste nessuna contraddizione nelle seguenti due istruzioni, eseguite nellordine:
> > A = 1;
> > A(2,2) = 3;
Ad A verr`a assegnata la matrice
1 0
A=
.
0 3
Se le istruzioni sono immesse nellordine inverso, con la prima si assegna alla variabile A la seguente
matrice:
0 0
A=
0 3
mentre con la seconda si cancella completamente il vecchio contenuto di A e le viene assegnato il
valore scalare 1.
N.B. Se ad un array gi`a allocato si vuole assegnare un array di dimensioni inferiori `e opportuno usare
prima il comando clear.
25
colon Genera vettori di valori equispaziati compresi fra due valori estremi assegnati. La forma
abbreviata usa il simbolo : (due punti).
> > a:b
genera il vettore (a, a + 1, a + 2, ..., a + m), dove m `e la parte intera di b a. Se a > b, il
comando genera un vettore vuoto.
Esempio.
> > x = 3:6
x =
3
4
5
> > y = -4:2
y =
-4 -3 -2
-1
26
Pi`
u in generale, si pu`o specificare la spaziatura da usare tra i valori:
> > a:d:b
genera il vettore (a, a + d, a + 2d, ..., a + md), con m parte intera di (b a)/d; d pu`
o essere
arbitrario (< 0, non intero); se a > b e d > 0 o se a < b e d < 0 viene generato un vettore
vuoto.
Esempio.
> > x
x =
3
> > y
y =
3
> > z
z =
20
> > w
w =
0.0
= 3:2:9
5
7
= 3:2:10
5
7
9
= 20:-5:0
15 10
5
= 0:0.1:0.5
0.1
0.2
0.3
0.4
0.5
27
linspace Genera un vettore di valori equispaziati compresi fra due estremi assegnati; la differenza
con colon `e che a linspace non si specifica il passo ma il numero totale di punti che si desidera.
> > linspace(a,b,n)
genera un vettore di n valori equispaziati compresi fra a e b, estremi inclusi.
Esempio.
> > x = linspace(-2,4,7)
x =
-2 -1 0 1 2 3 4
Se n viene omesso il valore di default usato `e 100.
28
zeros(m,n) genera una matrice di m righe e n colonne i cui elementi sono tutti uguali a 0
> > B = zeros(2,3)
B =
0
0
0
0
0
0
ones(m,n) come zeros, ma tutti gli elementi della matrice sono uguali a 1
rand(m,n) genera una matrice di numeri pseudo-casuali con distribuzione uniforme; senza argomenti
in entrata genera un solo numero pseudo-casuale
29
30
Sottomatrici
Una volta che un array `e assegnato nel workspace, `e possibile fare riferimento ad una qualunque sua
sottomatrice in modo estremamente agevole.
Per estrarre da un array A di m righe e n colonne soltanto certi elementi che formano una sottomatrice,
`e sufficiente usare la sintassi seguente:
> > A(ir,ic)
dove ir ed ic sono due vettori contenenti gli indici che corrispondono, rispettivamente, alle righe e alle
colonne da selezionare per estrarre la sottomatrice.
Esempi.
32
a*B,B*a Se a `e uno scalare e B un array di qualsiasi dimensione, fornisce larray C avente le stesse
dimensioni di B e ottenuto moltiplicando ogni elemento di B per a: cij = a bij .Un discorso
analogo vale per loperazione B/a.
A^m Se A `e una matrice quadrata e m un intero, fornisce il prodotto righe per colonne di A per se
stessa m volte.
AB Se A e B sono due array della stessa dimensione, fornisce la loro somma/differenza A B .
aB,Ba Se a `e uno scalare e B un array di qualsiasi dimensione, fornisce larray C con le stesse
dimensioni di B ottenuto sommando/sottraendo ad a ogni elemento di B : cij = a bij .
Ogni tentativo di usare in modo inappropriato gli operatori (ad esempio, se le dimensioni degli operandi
non sono compatibili) produce un messaggio di errore.
In aggiunta agli operatori precedenti, menzioniamo lutilissimo operatore \ (help slash).
Esercizio Studiare lhelp per capirne il funzionamento.
34
35
A=
2
4
3
5
B =
1
0
0
1
C =
2
4
3
5
D=
2
0
0
5
Certe operazioni (come la somma e la sottrazione) sono in realt`a gi`a applicate elemento per elemento;
luso della sintassi del punto `e in tal caso ridondante, anche se non errato.
Esempio.
Anche loperatore ^ pu`o essere applicato elemento per elemento ad un array eventualmente rettangolare
usando ancora la sintassi del punto: dati un array A di dimensioni arbitrarie e uno scalare m, con
> > A.^m
si genera una matrice con le stesse dimensioni di A il cui elemento di posizione ij `e dato dallespressione
m
aij .
A=
B = A^2 errore
B = A.^2
B =
1
4
1
16
2
5
4
25
3
6
9
36
37
Funzioni elementari
La maggior parte delle funzioni elementari (funzioni trigonometriche, funzione esponenziale, logaritmo
naturale, in base 2 e in base 10...) sono gi`a predefinite in Matlab (help elfun).
Caratteristica comune delle funzioni elementari `e che possono essere applicate direttamente ad un array
di qualunque dimensione. Il risultato in uscita `e un array con le stesse dimensioni di quello fornito in
ingresso, ottenuto applicando la funzione elemento per elemento allarray di partenza.
Esempio.
> > x = 1:10;
> > y = cos(x);
y conterr`a un vettore riga di 10 elementi il cui elemento i-esimo sar`a yi = cos xi, i = 1, ..., 10.
> > x = rand(4,7);
> > y = exp(x);
y conterr`a un array di 4 righe e 7 colonne in cui yij = exij , i = 1, ..., 4, j = 1, ..., 7.
38
Esempio. Il raggio spettrale (A) di una matrice quadrata A di ordine n `e definito come segue:
eig: calcola gli autovalori di una matrice (eig(A)); restituisce in uscita un vettore contenente gli
autovalori;
max: passandogli in ingresso un vettore, calcola il valore della componente massima del vettore;
abs: passando in ingresso un array, calcola il modulo di ogni elemento; restituisce in uscita i valori
calcolati in un array con le stesse dimensioni di quello passato in ingresso.
> > x = eig(A);
> > y = abs(x);
> > rho = max(y);
HELP
Morale:
(che non `e un grido di disperazione ma un aiuto fondamentale...)
41
42
La sintassi corretta `e
for variabile = espressione
blocco istruzioni
end
dove espressione `e in generale un array. Leffetto del costrutto `e di assegnare, ad ogni ripetizione del
ciclo, a variabile una delle colonne di espressione e di ripetere quindi il blocco di istruzioni tante
volte quante sono le colonne di espressione.
Le due sintassi non sono in contraddizione, la prima `e un caso particolare di questa, basta ricordare
che 1:100 genera un vettore riga contenente i numeri da 1 a 100 intervallati di 1!
Esempio. Ricordando che listruzione 0:2:m genera un vettore riga contenente valori compresi fra 0 e
m intervallati di due unit`a, il seguente ciclo ripeter`a il blocco di istruzioni per j = 0, 2, 4, ..., m:
> > for j = 0:2:m
.
.
.
end
43
La logica in Matlab
Premessa: Matlab non ha variabili di tipo logico.
Matlab gestisce espressioni di tipo logico usando le variabili numeriche.
Il valore falso `e rappresentato dal numero 0, mentre qualsiasi numero non nullo (generalmente 1)
rappresenta il valore vero.
` possibile effettuare confronti fra espressioni attraverso i seguenti operatori relazionali (help relop).
E
Simbolo
Nome
Descrizione
==
=
<
>
<=
>=
eq
ne
lt
gt
le
ge
uguale
diverso
minore
maggiore
minore o uguale
maggiore o uguale
45
Il risultato di un confronto fra due valori `e quindi a sua volta un valore numerico.
Esempio. Lespressione 1==2 ha valore 0. Lespressione 1<2 ha valore 1.
Gli operatori relazionali si applicano anche ad array con le stesse dimensioni. Il confronto viene effettuato
elemento per elemento. Il risultato sar`a un terzo array con le stesse dimensioni dei due su cui si `e
operato il confronto, in cui ogni elemento sar`a dato dallesito del confronto corrispondente.
Esempio. Assegnati i vettori x=[1 2 3] e y =[3 3 3], il risultato dellespressione
> > x==y
non `e 0, ma `e il vettore [0 0 1].
Se gli operatori vengono usati fra uno scalare a ed un array B, il risultato sar`a un array con le stesse
dimensioni di B, contente il risultato del confronto fra a e ciascun elemento di B.
Esempio. Se x `e definito come nellesempio precedente, lespressione
> > 2.7>x
avr`a valore [1 1 0].
46
Connettivi logici
(help relop).
Simbolo
Nome
Descrizione
&
|
xor
and
or
not
xor
and
or
negazione
or esclusivo
any applicato ad un vettore restituisce il valore vero se almeno uno degli elementi del vettore `e uguale
a zero. Applicato ad una matrice, opera sulle colonne della matrice (ovvero effettua il confronto
colonna per colonna, restituendo un vettore riga con i corrispondenti risultati).
all come any, ma controlla che tutti gli elementi del vettore siano uguali a zero.
47
Costrutto if
if espressione 1
blocco 1
elseif espressione 2
blocco 2
.
.
.
elseif espressione n-1
blocco n-1
else
blocco n
end
I blocchi elseif possono anche non essere presenti, cos` come pu`
o mancare anche il blocco else.
48
Istruzione while
while espressione
blocco di istruzioni
end
Il blocco di istruzioni viene eseguito finche la condizione `e vera, ovvero fintanto che lespressione ha
valore diverso da 0.
Anche in questo caso si pu`o usare il comando break per interrompere forzatamente il ciclo while
(quindi per uscire dal ciclo anche se espressione continua ad essere vera).
49
M-files
Per ora abbiamo supposto di inserire le istruzioni al prompt.
Come strutturare le istruzioni in file?
I file di istruzioni Matlab vengono chiamati generalmente m-files. Sono di due tipi: script e function.
script
Uno script `e un file di testo contenente una sequenza di comandi.
Lestensione del file deve essere .m, mentre per il nome valgono le stesse regole viste per i nomi di
variabile.
Il file deve essere salvato nella directory di lavoro.
Per usare lo script `e sufficiente digitare al prompt il nome del file, omettendo lestensione .m.
N.B. Le istruzioni contenute nello script devono essere tali e quali quelle che digiteremmo al prompt.
Ogni variabile a cui si fa riferimento nello script deve essere gi`
a attiva prima di eseguirlo.
50
Function
La prima riga di una function ha la seguente struttura:
function [y1,y2,...,yn] = nomefunzione(x1,x2,...,xm)
y1,y2,...,yn: variabili in uscita
x1,x2,...,xm: variabili in ingresso.
` opportuno (obbligatorio, in versioni vecchie di Matlab) salvare ogni function su un file distinto,
E
sempre con estensione .m. Il nome della function deve coincidere con il nome dellm-file (estensione
esclusa).
Dopo lintestazione `e utile inserire delle righe di commento (%). I commenti inseriti immediatamente
dopo lintestazione faranno parte dellhelp in linea di Matlab.
La function al suo interno pu`
o usare anche variabili di appoggio non elencate nellintestazione. Ogni
variabile che non compaia nellelenco dei parametri in ingresso sar`a solo locale.
51
Una function si pu`o usare dal prompt, allinterno di uno script o di unaltra function. Chiamata:
> > [y1,y2,...]
= nomefunzione(x1,x2,...)
Alle variabili y1, y2,... verranno assegnati i valori in uscita e tali valori saranno visibili nel workspace.
I parametri in uscita possono anche essere omessi, in tutto o in parte:
>>
>>
>>
>>
[y1,y2] = nomefunzione(x1,x2,...);
y1 = nomefunzione(x1,x2,...);
nomefunzione(x1,x2,...);
nomefunzione(x1,x2,...)
Esempio. In Matlab sono disponibili le seguenti funzioni predefinite: log(x) (logaritmo naturale),
log2(x) (logaritmo in base 2), log10(x) (logaritmo in base 10). Si vuole scrivere una function che
permetta di calcolare loga x per un qualsiasi a > 0, a 6= 1, e x > 0 sfruttando la formula
logc x
loga x =
logc a
52
53
54
55
56
Grafica
Matlab `e uno strumento versatile per tracciare molti tipi di grafici differenti (curve in 2D, curve in 3D,
superfici in 3D, curve di livello, grafici di tipo statistico...).
figure Apre una nuova finestra.
hold on Permette di tracciare due grafici sovrapposti sulla stessa figura (hold off annulla).
plot Se y `e un vettore, plot(y) traccia in un grafico i punti di coordinate (i, yi), unendoli con una
linea spezzata.
Se abbiamo anche a disposizione il vettore x delle ascisse xi corrispondenti, plot(x,y) traccia i
punti (xi, yi) uniti con una spezzata.
plot(x,y,s) sceglie il colore, tipo di riga, indicatore...
ttraverso la stringa s (es.
plot(x,y,r:o)).
plot(x1,y1,s1,x2,y2,s2,...) traccia pi`
u grafici nella stessa finestra.
subplot Permette di tracciare pi`
u grafici in aree separate di una sola finestra.
loglog,semilogx,semilogy Come plot, ma usano scale (semi-)logaritmiche.
ezplot Si passa in ingresso lespressione della funzione di cui si vuol tracciare il grafico sotto forma di
stringa:
ezplot(log(x))
ezplot(log(x),[2 4]) specifica lintervallo di variabilit`a della x (default: (2, 2)).
57
plot3 Traccia curve: se x, y, z sono tre vettori della stessa lunghezza, plot3(x,y,z) traccia il grafico
ottenuto congiungendo i punti (xi, yi, zi).
ezplot3 Versione facilitata di plot3:
si passano in ingresso le equazioni parametriche
(x(t), y(t), z(t)) della curva, es. ezplot3(cos(t),sin(t),t). Il dominio di default `e
t [0, 2] e pu`o essere cambiato.
ezmesh, ezsurf Tracciano superfici in 3D passando in ingresso una stringa che contiene una funzione
in due variabili.
mesh, surf Tracciano superfici note per punti.
xlabel, ylabel, title, legend... vasta gamma di possibilit`a di intervento per migliorare laspetto
delle figure.
58
Gli
Esempio.
>> k = 3;
>> s = sprintf(Variabili:\tk=%d,\tpi=%.2f,\teps=%E\n,k,pi,eps);
>> disp(s)
Variabili:
k=3,
pi=3.14,
eps=2.220446E-16
fopen, fclose, fprintf, fscanf: aprono e chiudono file, scrivono e leggono dati formattati su e
da file.
59
tic;
blocco di istruzioni
t = toc;
Nelle versioni di Matlab precedenti alla 6 era possibile usare anche il comando flops, che contava le
operazioni floating point effettuate.
60
Le strutture
` possibile raggruppare variabili di tipo diverso in un unico oggetto detto struttura.
E
Esempio.
>>
>>
>>
>>
>>
parametri.delta_x = 0.01;
parametri.delta_t = 0.001;
parametri.c1 = 3.4;
parametri.alpha = 1;
parametri.choice = test number 1;
I campi non assegnati ma presenti nella struttura vengono visualizzati come matrici vuote ([]).
62