Il sistema MATLAB

Transcript

Il sistema MATLAB
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
Il sistema interattivo MATLAB
L’ambiente Matlab
Matlab (Matrix Laboratory) (www.mathworks.com) è un sistema interattivo di facile utilizzo
per il calcolo scientifico e la visualizzazione grafica di dati. Attualmente è uno dei sistemi
numerici più usati sia in ambito didattico che applicativo. Fu progettato inizialmente (da C.
Moler negli anni ’70) per la risoluzione di problemi di algebra lineare, semplificando
l’utilizzo dei moduli software dei packages LINPACK, LAPACK ed EISPACK. In seguito le
sue capacità si sono estese alla risoluzione di svariati problemi di analisi numerica
(algebra lineare, interpolazione, calcolo di integrali, risoluzione numerica di equazioni
differenziali,…) e di visualizzazione grafica. Può essere corredato da vari toolbooks
applicativi specifici : signal processing toolbox, control system toolbox, etc.
Attualmente è uno standard de facto nella didattica, ricerca ed industria .
Il Matlab è scritto prevalentemente in C, mentre molte routines interne sono scritte in
linguaggio Matlab. Fornisce un linguaggio di programmazione facile da usare, grazie
anche ai numerosi programmi dimostrativi (DEMO) e ad una potente e naturale
documentazione on line. Il Matlab può essere usato
In modalità immediata
Come linguaggio di programmazione (è dotato di un proprio editor)
Mette a disposizione:
Linguaggio di programmazione di alto livello
Algoritmi di calcolo numerico “higt performance”
Grafica 2D e 3D, animazione,suono
Ambiente di calcolo vettoriale
Allocazione dinamica della memoria
Numerose funzioni predefinite e possibilità di crearne altre
Numerosi toolbox in svariate aree applicative
Capacità di interfacciarsi con altri linguaggi (C,C++,Fortran,Java,…) e di
importare ed esportare dati
Un potente HELP on line (help,doc)
Sviluppo di applicazioni dotate di interfaccia utente grafica :GUI – Graphical
User Interface
Per avviare il Matlab in ambiente Windows basta selezionare con il mouse l’icona
corrispondente. Sullo schermo compare il desktop di Matlab. Nella configurazione
standard (v.7) compaiono tre finestre: Command Window (finestra comandi), Command
History (mostra i comandi immessi precedentemente, Current Directory (cartella corrente,
si usa per accedere ai files). Si può attivare anche la finestra Workspace, che visualizza le
variabili in memoria e consente di operare su di esse. La finestra comandi è quella tramite
la quale l’utente comunica con il programma Matlab. Avviato il Matlab compare il prompt
(>>) nella finestra comandi e si potranno eseguire i comandi in modo interattivo. Per
terminare una sessione di lavoro si digita quit. Per conoscere la versione Matlab che si
sta usando si digita version.
La directory principale di Matlab è C: \matlab. Per visualizzare il percorso di ricerca di un
file si usa il comando path. Se il file non è nella directory corrente il Matlab segnala errore;
1
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
per conoscere la directory corrente vi è il comando pwd, per avere un elenco dei file
presenti dir.
Matlab possiede un potente help in linea: il comando help visualizza i toolbox disponibili
(pacchetti dedicati ad una specifica applicazione). Per un’informazione più dettagliata
basta far seguire ad help il nome del comando (toolbox) desiderato:
>> help
HELP topics:
matlab\general
- General purpose commands.
matlab\ops
- Operators and special characters.
matlab\lang
- Programming language constructs.
matlab\elmat
- Elementary matrices and matrix manipulation
…………..
>> help elfun
Elementary math functions.
Trigonometric.
sin
- Sine.
sinh
- Hyperbolic sine.
asin
- Inverse sine.
asinh
- Inverse hyperbolic sine.
cos
- Cosine
……..
>> help sin
SIN Sine.
SIN(X) is the sine of the elements of X.
Il comando lookfor consente invece di identificare tutte le funzioni relative ad un
argomento particolare.
E’consigliabile usare l’help quando si usa per la prima volta un comando o una funzione
Matlab così da verificarne la sintassi.
Il sistema aritmetico usato è lo standard IEEE a doppia precisione.
Le variabili MATLAB
In Matlab non esistono dichiarazioni di tipo: il tipo di una variabile è stabilito al momento
della sua definizione.
La variabile elementare in Matlab è una matrice rettangolare di numeri reali o
complessi, che non richiede un dimensionamento esplicito, ma è dichiarata e definita
attraverso l’assegnazione dei suoi elementi.
Operazioni e funzioni operano per default su matrici. Come casi particolari si ritrovano:
I vettori riga (matrici 1×n) o colonna(matrici n×1)
Gli scalari (matrici 1×1)
Un array può essere di diversi tipi (class):
2
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
Inizializzazione di variabili
Il Matlab opera per espressioni, ossia converte espressioni in variabili. Le dichiarazioni
hanno frequentemente la forma:
variabile = espressione
espressione
E’ possibile comporre espressioni con operatori, caratteri speciali, funzioni e nomi di
variabili. La valutazione
lutazione di un’espressione produce una matrice che viene visualizzata
sullo schermo ed assegnata a:
variabile
ans , una variabile creata automaticamente ed aggiornata dopo la valutazione di
espressione.
>> 8/10
ans =
0.8000
>> r=8/10
r=
0.8000
Il comando who dà una lista delle variabili, whos della quantità di memoria allocata:
>> who
Your variables are:
ans f r
>> whos
Name
Size
Bytes Class
ans
1x1
8 double array
f
1x1
8 double array
r
1x1
8 double array
Grand total is 3 elements using 24 bytes
Le variabili dichiarate sono conservate nello spazio di memoria detto workspace, e restano
in quest’area per tutta la
a durata della sessione.
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
Il comando clear cancella le variabili definite dall’utente. Per cancellarne solo alcune va
seguito dai nomi delle variabili.
Alcune variabili sono predefinite, come ad esempio:
realmin = minimo numero reale positivo, realmax = massimo numero reale positivo, eps
= epsilon macchina , pi = π , i,j = unità immaginaria, NaN = “not a number”, inf =
“infinito”, clock = tempo corrente.
Per la visualizzazione dei numeri sono previsti i seguenti formati, tra cui:
format short (default): 5 cifre significative
format short e : notazione esponenziale con 5 cifre significative
format long : 16 cifre significative
format long e : notazione esponenziale con 16 cifre significative
format hex : esadecimale, visualizza il contenuto della memoria.
Ad esempio per visualizzare 2/7 si ha:
format short (default): 0.2857
format short e : 2.8571e-001
format long : 0.28571428571429
format long e : 2.857142857142857e-001
format hex : 3fd2492492492492
Il format long e è il più fedele al formato interno del calcolatore.
Visualizziamo il valore di 1+eps, che come è noto è diverso da 1. Si ha:
>> 1+eps
ans =
1.000000000000000e+000
Tale risultato apparentemente errato dipende solo dal formato di output, infatti se
visualizziamo l’effettivo contenuto delle locazioni di memoria di 1 e 1+eps si vede che
sono diversi nell’ultima cifra:
>> format hex
>> 1
ans =
3ff0000000000000
>> 1+eps
ans =
3ff0000000000001
Infine, un numero complesso si può definire in maniera diretta : z=a+bi o tramite il
comando complex(a,b).
Generazione di array
L’input di una matrice può avvenire in vari modi:
attraverso la lista esplicita dei suoi elementi
attraverso funzioni intrinseche
attraverso M-file
caricata da un data file esterno
L’input mediante la lista esplicita degli elementi avviene racchiudendo la lista tra parentesi
quadre e separando le righe con il punto e virgola:
A=[1 2 3; 4 5 6; 7 8 9; 10 11 12]
Per accedere alla componente di un array : A(2,3).
4
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
La generazione di un vettore riga è :
x = [1 2 3];
di un vettore colonna :
c= [1;2;3] ;
Per accedere all’ultima componente di un vettore x si può usare x(end).
Per generare un vettore di componenti equispaziate si usa il carattere “:”. Il comando
x=1:5
genera il vettore x= (1, 2, 3, 4, 5).
Se l’incremento è diverso da uno il comando è ad esempio:
x=5:-1:1
che genera x = (5, 4, 3, 2, 1).
Se invece si vuole generare un vettore di n elementi in [a,b] il comando è:
linspace(a,b,n)
Ad esempio si vuole un vettore di 5 elementi in [0,π] :
y=linspace(0, pi,5)
La gestione degli array è dinamica cioè essi possono variare le dimensioni durante il
calcolo. Ad esempio, considerata la precedente matrice A, i comandi seguenti aggiungono
ad A la riga r (concatenazione di array: attenzione alla correttezza delle dimensioni!):
>> r= [13 14 15];
>> A= [A; r];
Il punto e virgola inibisce la visualizzazione del valore della variabile, che altrimenti è
sempre visualizzato.
Le dimensioni di A (date dalla funzione size(A)) sono automaticamente aggiornate:
size(A) produce:
ans =
5 3
Il comando:
A=A(1:3, : )
estrae dalla matrice A la sottomatrice costituita dalle prime 3 righe di A.
A(m:n,l:k) è la sottomatrice di A formata dalle righe tra m ed n e le colonne tra l e k.
Il comando: A=[ ] crea una matrice vuota, che si può utilizzare per eliminare righe o
colonne da una matrice:
>>a =
[1 2 3
4 5 6
7 4 9]
>> a(:,[2 3])=[]
a=
1
4
7
>>a(:,[1 3])=b(:,[4 2])
sostituisce la I e III colonna di a con la IV e II di b.
>> a(:) = -1
sostituisce tutti gli elementi di a con -1.
Vi sono molte funzioni predefinite che generano automaticamente molti tipi di matrici:
matrice identica, matrice nulla,etc.
5
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
Alcune funzioni generatrici di matrici e vettori
linspace(a,b,n)
a:h:b
logspace(a,b,n)
meshgrid(x,y)
eye(n)
zeros(m,n)
ones(m,n)
rand(m,n)
hilb(n)
sparse
repmat
Genera il vettore di n componenti tra a e b
Genera il vettore di n componenti con passo h
Genera il vettore di n componenti a spaziatura logaritmica
Genera reticolo 2D
Matrice identica
Matrice nulla
Matrice di elementi uguali ad 1
Matrice random
Matrice di Hilbert di ordine n
Genera una matrice sparsa
Genera una matrice con righe o colonne uguali
Si può anche costruire una matrice a blocchi:
A= [zeros(2,3),eye(2)]
Variabili di tipo stringa
Le variabili di tipo stringa sono riconosciute se delimitate da apici:
c=’tabella’
La stringa è memorizzata come un vettore di caratteri, ogni componente del vettore
contiene il numero intero corrispondente al codice ASCII del carattere. Sfruttando le
potenzialità nella gestione di matrici, sulle stringhe si possono effettuare operazioni di
concatenazione, estrazione di una sottostringa, e confronto tra stringhe.
Anche sulle stringhe vi sono funzioni predefinite, tra cui ad esempio:
Alcune funzioni relative a stringhe
num2str
int2str
str2num
eval(stringa)
feval(f,x)
Converte da numero a stringa
Converte da intero a stringa
Converte da stringa a numero
Valuta una stringa come comando matlab
Valuta una funzione f data come stringa nel punto x
In alcuni casi ad esempio è utile convertire un risultato numerico in una stringa di caratteri
e viceversa. Il programma:
r=2.5; area=pi*r^2;
t=[‘il cerchio di raggio’,num2str(r),’ha area’,num2str(area)];
disp(t)
produce:
il cerchio di raggio 2.5 ha area 19.36
Input-output
Per definire il valore di una variabile oltre all’assegnazione si può usare il comando input
che visualizza un testo sullo schermo, aspetta che l’utente digiti un valore che registra
nella variabile specificata:
x=input(‘valore di x’)
6
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
>> n=input('digita il valore di n')
digita il valore di n 6
n=
6
>> b=input('digita array b')
digita array b [1 2 3 5]
b=
1 2 3 5
Il comando disp visualizza il valore di una variabile.
>> disp(n)
6
>> disp(b)
1 2 3 5
>> disp('testo')
testo
E’ spesso utile salvare e leggere da disco dati e variabili sotto forma di file sia in ambiente
Matlab che leggibili dall’esterno con programmi scritti in altri linguaggi.
In ambiente Matlab vi sono i comandi save e load:
w=0:0.1:10;
save dati.mat w
clear all
In tal modo si sono cancellate tutte le variabili tranne w, che è memorizzata in formato
matlab nel file binario dati.mat. Per ricaricare w in memoria basta il comando load dati.
Il comando delete nomefile cancella un file, mentre il comando type nomefile visualizza un
file. Il comando save ha delle opzioni che consentono di salvare dati in formato diverso da
quello binario, utili per dati condivisi con programmi scritti in altri linguaggi:
save dati.dat -ascii
salva dati in formato ASCII con 8 cifre
save dati.dat -ascii -double
salva dati in formato ASCII con 16 cifre
Si possono leggere file scritti con programmi diversi dal matlab, ad esempio excel. I
comandi per leggere diversi tipi di file sono nella tabella seguente:
Tipo di dato Lettura
scrittura
Excel .XLSX xlsread
xlswrite
Testo .TXT
dlmread
dlmwrite
Immagine
imread
imwrite
audio
.AU .WAV
auread
wavread
auwrite
wavwrite
Film .AVI
aviread
Funzioni matematiche
Il Matlab possiede molte funzioni matematiche predefinite. Molte di esse possono essere
applicate anche a variabili matriciali. Tra le più usate vi sono:
abs(x) = valore assoluto, sqrt(x) = x , sign(x) = segno di x , sin(x) = sen(x), cos(x) =
cos(x) , tan(x) = tang(x) , exp(x) = ex , log(x) = log(x) .
7
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
Il Matlab inoltre consente una semplice gestione dei polinomi. Un polinomio è identificato
dai suoi coefficienti memorizzati in un vettore. Ad esempio il polinomio p(x)=x2+2x+3 è
identificato da:
p=[1 2 3]
vettore dei coefficienti di p(x)
Il valore y del polinomio in uno o più punti x è dato dalla funzione:
y=polyval(p,x)
che memorizza in y i valori del polinomio di coefficienti p nei punti x:
>>p=[1 2 3];x= 0 :5 ;
>>y=polyval(p,x)
y=
3 6 11 18 27 38
Per definire una funzione non predefinita si può usare il comando inline:
>> f=inline(‘1/(1+x)’)
f=
inline function:
f(x)=1/(1+x)
>> y=f(1)
y=
0.5
Un altro modo per definire una funzione non predefinita è l’ anonymous function , che è
una function che si definisce direttamente in uno script:
>>f=@(x)(1./(1+x))
f=
@(x) )(1./(1+x))
>>y=f(1)
y=
0.5000
Operazioni su array
Il Matlab prevede le operazioni di tipo vettoriale, nel senso che sono definite su operandi
che non sono scalari, ma vettori.
Operazioni elementari
Le operazioni elementari in Matlab sono operazioni vettoriali, ossia gli operandi sono
matrici e vettori.
Le operazioni elementari previste sugli array sono:
+
*
^
’
\
/
Addizione
Sottrazione
Moltiplicazione righe-colonne
Elevamento a potenza
Trasposta di una matrice AT
Divisione a sinistra
Divisione a destra
Ad esempio :
>>x=[1:4];
>>y=[1:2];
8
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
>>z=[1 2 3 4];
>>x+z
somma vettori riga
ans =
2468
>> x+y
produce il messaggio di errore
??? error using = = > +Matrix dimension must agree
>>x*y
produce il messaggio di errore
??? error using = = > *Inner matrix dimension must agree
Si può infatti effettuare il prodotto scalare * solo tra un vettore riga ed uno colonna della
stessa dimensione:
>> x*z’
ans =
z’ vettore colonna trasposto di z
30
>> a=[1 2;3 4];b=[5 6;7 8];
>> c=a*b
prodotto righe per colonne
c=
19 22
43 50
I simboli precedenti rappresentano anche le usuali operazioni su scalari.
Date due matrici A e B con lo stesso numero di righe, la notazione X= A\B, con A
quadrata, denota la matrice X contenente i vettori soluzioni del sistema a più colonne
AX=B (algoritmo di Gauss con pivoting). Se A e B (quadrata) hanno lo stesso numero di
colonne si ha che X=A/B=A*inv(B), dove inv è la funzione che calcola l’inversa di B.
E’ anche possibile eseguire operazioni aritmetiche su matrici componente per
componente, facendo precedere l’operatore da un punto, ad esempio:
C=A .* B ⇒ ci,j = ai,jbi,j , i,j=1,…,n.
Inoltre è ammesso l’utilizzo di operazioni su variabili complesse :
>> a=3+2i;
>> b=3.2+2.3i;
>>a+b
ans=
6.2000 + 4.2000i
Operatori relazionali
Su ogni tipo di dato dotato di ordinamento naturale sono definiti i seguenti operatori:
<
>
<=
>=
==
∼=
minore
maggiore
minore o uguale
maggiore o uguale
uguale
non uguale
Il risultato delle operazioni precedenti è 0 (falso) ,1 (vero).
9
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
Applicati ad array (di uguale dimensione) confrontano gli elementi uno ad uno, se si
confronta un array con uno scalare sono confrontati tutti gli elementi con lo scalare. Il
risultato è un array di elementi uguali a 0 o ad 1.
>> x=[5 4 9];
>> y=[14 3 9];
>> z=x>y
z=
0 1 0
>> z=x= =y
z=
0 0 1
>> eps+1= =1
ans =
0
>> 1+eps/2= =1
ans =
1
>> z=x(x>y) elementi di x maggiori dei corrispondenti elementi di y
z=
4
Ad esempio si vuole generare una tabella di valori di f(x) in [0,3π] con f(x)=cos(x), se
cos(x)>0, altrimenti f(x)=0:
>>x=0:pi/20 :3*pi;
>>y=cos(x);
>>y=y.*(y>0);
>>[x’ y’]
L’espressione y>0 genera un vettore con 1 dove cos(x)>0 e 0 altrimenti.
Operatori logici
Il Matlab, associando al valore 0 FALSO ed al valore 1 VERO, consente di usare variabili
di tipo logico, anche non definite esplicitamente, mediante i seguenti operatori:
∼a not array di 1 se gli elementi di a sono 1,altrimenti di 0
a&b and array di 1 se gli elementi di a e b sono≠ 0,altrimenti di 0
a|b or array di 1 se almeno uno dei corrispondenti elementi di a e b
è ≠ 0,di 0 se entrambi sono nulli
>> z=5>3|4==7
z
1
>> x=[5 -2 0 0]&[5 7 0 3]
x=
1 1 0 0
Per le variabili di tipo logico sono definite delle funzioni, tra cui:
funzioni di tipo booleano
10
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
any(A)
all(A)
find(A)
isempty(A)
Vero se almeno un elemento di A è #0
Vero se tutti gli elementi di A sono #0
Indici degli elementi #0
Vero se A è vuoto, falso altrimenti
Ad esempio, se A è una matrice [i,j]=find(A) dà le righe e le colonne degli elementi #0; si
può usare anche con una condizione logica, dà gli indici degli elementi che la soddisfano.
>> x=[3 0 5 7];
>> z=find(x)
z=
1 3 4
>> z=find(x>3)
z=
3 4
>> y=[1 2 4 7];
>> z=find(x>y)
z=
1 3
Cell array, structure array, Map object
In Matlab esistono tipi di dati strutturati : cell array, structure array, Map object.
Un cell array è un array in cui ogni elemento è una cella che a sua volta può contenere
un array. In questo modo si possono raggruppare tipi diversi di array. Un cell array si
può creare direttamente con un’assegnazione tramite indicizzazione delle celle :
>> C(1,1)={'esame'};
>> C(1,2)={'18/2/08'};
>> C(2,1)={30};
>> C(2,2)={'calcolo numerico'};
>> C
C=
'esame' '18/2/08'
[ 30] 'calcolo numerico'
>> C(2,2)={'calcolo numerico,algebra'};
>> C(2,1)={[30 23]};
>> C
C=
'esame'
'18/2/08'
[1x2 double] [1x24 char]
Per visualizzare il contenuto dell’array:
>> celldisp(C)
C{1,1} =
esame
C{2,1} =
30 23
C{1,2} =
18/2/08
C{2,2} =
calcolo numerico,algebra
11
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
Per visualizzare il contenuto di una cella:
>> C{2,2}
ans =
calcolo numerico,algebra
Per individuare una cella:
>> C(2,2)
ans =
'calcolo numerico,algebra'
Un array di strutture è formato da strutture e consente di memorizzare dati di tipo
diverso. Una struttura è una serie di dati di natura diversa. Un array di strutture è un
insieme di strutture sotto lo stesso nome. Per accedere agli elementi si usano i nomi dei
campi. Per inizializzare e dare i valori si assegnano semplicemente i valori ai campi:
>> studente.nome='Mario Rossi';
>> studente.matricola='34001234';
>> studente.voti=[18 21 25];
Ho creato una struttura di nome studente con tre campi. Per espanderlo ad array:
>> studente(2).nome='Carlo Esposito';
>> studente(2).matricola='34001235';
>> studente(2).voti=[23 27 24];
Digitando il nome dell’array ottengo:
studente =
1x2 struct array with fields:
nome
matricola
voti
Per accedere agli elementi di un campo:
>> studente(1).voti(2)
ans =
21
Per aggiungere un campo all’array:
>> studente(1).telefono='081233456';
>> studente
studente =
1x2 struct array with fields:
nome
matricola
voti
telefono
Per cancellare un campo:
>> studente=rmfield(studente,'telefono')
studente =
1x2 struct array with fields:
nome
matricola
12
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
voti
E’ possibile applicare gli operatori e le funzioni di Matlab in modo tradizionale :
>> max(studente(1).voti)
ans =
25
>> mean(studente(2).voti)
ans =
24.6667
MAP Objet
Struttura contenitore di altri dati. Simile ad un array tranne che per il modo di indirizzare i
dati. L’indice, invece di essere un intero, può essere di vario tipo, come una stringa di
caratteri. Un oggetto Map consiste di una chiave(indice) e di un dato corrispondente. Ad
esempio per creare un oggetto Map che associa agli Stati Europei le Capitali:
>> Europa=containers.Map({'Italia','Francia', ‘Inghilterra’},{'Roma','Parigi',’Londra’})
Europa =
containers.Map handle
Package: containers
Properties:
Count: 3
KeyType: 'char'
ValueType: 'char'
Methods, Events, Superclasses
>> values(Europa,{'Italia'})
ans =
'Roma'
Vi sono molte funzioni che si possono usare sugli oggetti Map.
Funzioni elementari di array
Il Matlab possiede molte funzioni elementari che consentono di manipolare matrici e
vettori e di risolvere alcuni tra i principali problemi di algebra lineare, come ad esempio il
calcolo del determinante, dell’inversa di una matrice, del rango di una matrice, e così via.
Alcune funzioni di vettori e matrici
det(A)
rank(A)
inv(A)
eig(A)
lu(A)
diag(A)
Determinante di A
Rango di A
Inversa di A
Autovalori ed autovettori di A
Fattorizzazione PA=LU
Crea una matrice diagonale da un vettore o
13
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
estrae diagonali da una matrice
triu(A),tril(A)
Estrae il triangolo superiore o inferiore da A
sum(A)
Somma degli elementi di un vettore; applicato ad
una matrice dà un vettore con la somma delle colonne
max(A),
Max(min) degli elementi di un vettore; applicato ad
min(A)
una matrice dà un vettore con il max(min) delle colonne
norm(A)
Calcola la norma2 di A
cond(A)
Calcola l’indice di condizionamento di A
diff(x)
Vettore delle differenze tra elementi successivi di x
length(A),size(A) Dimensione di un vettore o di una matrice
spy(A)
Visualizza una matrice sparsa
>> A=[1 2 3;4 5 6;7 8 9];
>> [m,n] = size(A)
m=
3
n=
3
>>d=diag(A)
d=
1
5
9
>>c=diag(d)
c=
100
050
009
>> A=eye(4)+diag(3*ones(3,1),1)+diag(2*ones(3,1),-1)
A=
1 3 0 0
2 1 3 0
0 2 1 3
0 0 2 1
>> a=[1 2 3;4 5 6;7 8 9];
>> m=max(max(a))
m=
9
>> A=[1 2;3 4]; det(A)
ans=
-2.0000
>> B=inv(A)
B=
-2.0000 1.0000
-0.5000
Se A è singolare si ha un messaggio di errore e l’output contiene la variabile inf:
>> A=[0 0;0 1];inv(A)
warning: matrix is singular to working precision
14
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
ans=
inf inf
inf inf
Matlab come linguaggio di programmazione
Il Matlab, oltre ad essere usato in modalità immediata, può essere usato per scrivere
programmi, in cui possono essere usate tutte le funzioni interne. E’ quindi dotato di un
linguaggio di programmazione molto flessibile e semplice da usare.
Costrutti di controllo
I costrutti di controllo ( che regolano il flusso di istruzioni) previsti dal Matlab sono i
seguenti:
for ind=iniz:passo:fin si ripetono le istruzioni per ogni valore assunto
istruzioni
da ind a partire da iniz fino a fin con incremento
end
passo (se omesso vale 1)
for k =1:n
for m = 1:n
A(k,m)=0;
end
end
Si può usare un vettore per indicizzare il ciclo. Ad ogni passo del ciclo, l’indice del for
conterrà il valore successivo del vettore.
>> w=[3 1 9 2 6 2 3];v=[1 3 4];
>> for k=v
x(k)=w(k);
end
>> x
x=
3
0
9
2
Attenzione all’utilizzo di i e j come variabili di ciclo, in quanto rappresentano in Matlab
l’unità immaginaria.
while espressione logica
istruzioni
le istruzioni sono ripetute fino a che
espressione
logica è vera,altrimenti sono saltate
end
if
n=0;
while n < = k
n=n+1;
end
espressione logica
istruzioni 1
se espressione logica è vera si eseguono
istruzioni1,se è
falsa si saltano
end
if x<0
15
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
disp(‘x negativo’)
end
if espressione logica
se espressione logica è vera si eseguono
istruzioni1,se è falsa istruzioni2;
istruzioni 1
alla fine di ogni blocco istruzioni si va
else
ad end.
istruzioni2
end
if n = = k
x(n)=a;
else
x(n)=b;
end
if
espressione logica 1
se espressione logica1 è vera si eseguono
istruzioni1,se è falsa si testa espressione
istruzioni 1
logica2: se è vera si eseguono
elseif espressione logica2 istruzioni2 se è falsa istruzioni3; alla fine di
istruzioni2
ogni blocco istruzioni si va ad end.
else
istruzioni3
end
switch expr
case valore 1
istruzioni
case valore2
istruzioni
...
otherwise
istruzioni
end
switch a
case 2
y=2*a;
case 3
y=3*a;
case 5
y=5*a;
otherwise
y=a;
end
Il comando break consente l’uscita da un ciclo for o while:
for k= 1:10
x=50-x^2
if x<0 , break, end
16
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
end
Il comando error(‘testo’) scrive un messaggio ed arresta i calcoli.
Si possono digitare più comandi sulla stessa linea separati da
indicano la continuazione di un comando sulla linea successiva.
; mentre tre punti …
Script files e function files
Appare evidente l’esigenza di salvare su file un programma, con un’eventuale passaggio
di parametri di input-output, così da poterlo eseguire più volte per dati diversi, o modificare
senza doverlo riscrivere. Si chiamano M-files i files contenenti programmi scritti in
linguaggio Matlab. Gli M-files devono avere un’estensione .m. Un M-file può richiamare se
stesso .
Per creare un M-files si usa l’Editor/Debugger. Si seleziona New> M-file dal menù File
della finestra comandi; a questo punto si apre la finestra dell’editor, nella quale si digita, ad
esempio, il seguente programma, che calcola il fattoriale di n:
>> n=input(‘valore di n’)
>>k=n;fatto=k;
>>while k>2
k=k-1,
fatto=fatto*k;
>> end
>>disp(‘fattoriale’)
>>disp(n)
Dopodichè lo si salva in un m-file, ad esempio fattoriale.m. Per eseguire il programma
basta semplicemente digitare il suo nome nella finestra comandi:
>>fattoriale
>>valore di n 4
n=
4
fattoriale
24
Gli M-files si dividono in:
script files
function files
non hanno parametri di input/output
hanno parametri di input/output
Gli script files sono files scritti in linguaggio Matlab e memorizzati su memoria di massa.
Contengono una sequenza di comandi che sono interpretati ed eseguiti sequenzialmente
quando si digita il nome del file (senza l’estensione .m). Operano sulle variabili nel
Workspace.
Il seguente programma scrive una tabella di valori di 2exsinx in (0.5,3) ed è memorizzato
nello script file tabella.m:
x=linspace(0.5,3,10);
y=2*exp(-x).*sin(x);
z=[x;y];
17
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
fprintf('ascisse\tvalori funzione\n\n'),
fprintf('%6.2f\t%10.5e\n',z);
digitando il nome del file si ottiene:
>> tabella
Ascissa valori funzione
0.50
0.78
1.06
1.33
1.61
1.89
2.17
2.44
2.72
3.00
5.81573e-001
6.44756e-001
6.05640e-001
5.12400e-001
3.99007e-001
2.87305e-001
1.89632e-001
1.11424e-001
5.35274e-002
1.40519e-002
contengono anch’essi una sequenza di comandi Matlab, ma
I function files
rappresentano delle “procedure” e, come tali, prevedono parametri di input e di output. Il
nome della function deve essere uguale al nome dell’ M-file che la contiene. La prima linea
del file deve contenere la dichiarazione:
function [ ou1,…,outn] = nome(in1,..,inn)
dove:
function = nome chiave che identifica il file come function
nome = nome della function(uguale al nome del file che la contiene)
out1,..,outn = parametri di output
in1,..,inn = parametri di input
Se vi è un solo parametro di output si omettono le parentesi quadre.
La function verrà richiamata tramite:
[ ou1,…,outn] = nome(in1,..,inn)
Il ritorno al programma chiamante avviene dopo l’esecuzione dell’ultimo comando
contenuto nel function file o quando si incontra l’istruzione di return.
All’atto della prima chiamata la function è compilata ed opera su variabili locali , che
esistono solo al suo interno. Le variabili nel workspace non sono in genere accessibili alla
function, a meno che non siano dichiarate globali con il comando global che va inserito
prima di chiamare la function e all’interno di essa prima di ogni istruzione eseguibile.
Gli argomenti di input che sono modificati all’interno della function sono passati per valore,
ossia la modifica non si riflette quando si torna al workspace, a meno che non siano anche
di output, mentre se non sono modificati vengono passati per indirizzo.
Un’altra differenza sostanziale tra uno script file ed un function file è che, mentre uno script
file è reinterpretato ad ogni chiamata, un function file è compilato alla prima chiamata e
memorizzato per tutta la durata della sessione, consentendo una esecuzione più rapida.
Esempio di function file per il calcolo di n!, memorizzato nel file fatto.m:
function nfat=fatto(n)
18
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
%funzione che calcola il fattoriale di n
%parametri di ingresso:
%n= valore di cui si vuole il fattoriale
%parametri di uscita
%nfat= fattoriale di n
k=n; nfat=k;
while k>2
k=k-1;
nfat=nfat*k;
end
Il carattere % identifica una linea di commento. I commenti inseriti all’inizio sono mostrati
digitando help fatto.
Un programma per il calcolo del coefficiente binomiale n!/[k!(n-k)!] è:
>> n=input('valore di n');
valore di n 4
>> k=input('valore di k');
valore di k 3
>> a=fatto(n);b=fatto(k);c=fatto(n-k);
>> binom=a/(b*c)
binom =
4
Due variabili interne interessanti sono nargin e nargout che contano rispettivamente il
numero di parametri di ingresso e uscita di una funzione, consentendo di scrivere funzioni
con numero variabile di parametri, caratteristica questa di molte funzioni interne Matlab.
Ad esempio una funzione che calcola la successione:
n>1
xn+1 = 3xn +1
con x1 intero ed il numero di termini che può essere fissato nel programma chiamante o di
default dalla funzione è:
function x = succ(x1,N)
% il parametro N è opzionale,se omesso N=100
if nargin= =1
N=100;
end
x=zeros(N,1);
x(1)=x1;
for k=1:N-1
x(k+1)=3*x(k)+1;
end
Un file .m può contenere i codici di più function. La funzione primaria è la prima
funzione in un file .m , che ha il nome del file. All’interno dello stesso file si possono
scrivere più sottofunzioni, sono richiamabili solo dalla funzione primaria e dalle altre
sottofunzioni dello stesso file. Il vantaggio è nella riduzione di file .m e quindi dei tempi di
esecuzione della funzione primaria, e anche nella più semplice “lettura” del codice
completo.
19
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
Il Matlab è un linguaggio ricorsivo, ossia una function può richiamare se stessa. Ad
esempio una function ricorsiva per calcolare n! è:
function y=fact(n)
if n>1
y=n*fact(n-1);
else
y=1;
end
Cell Mode
Il Cell Mode è un’utility che consente di dividere un M-file in sezioni, dette celle, che
possono essere eseguite singolarmente. Ciò è utile nello sviluppo di un programma sia in
fase di debug che di test. Per attivare il cell mode si seleziona sulla barra menù dell’editor:
cell→Enable Cell Mode. Per dividere il programma in celle si usa il divisore di celle che è il
simbolo %% seguito da blank. Si ottiene ad esempio:
Esegue la cella corrente.
Esegue la cella corrente e avanza alla successiva.
Il Matlab dalla v.7 consente di convertire un file.m in un documento formato HTML,Word,
pdf, PowerPoint,…. Se il file è strutturato in cell mode si può da esso ottenere un
documento strutturato in modo che è stampata ogni cella con il relativo output grafico
tramite il comando :
publish(‘nomefile’,’formato’).
Di seguito vi è un esempio di documento ottenuto in formato HTML e pdf.
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
Function Handle
Un tipo di dato standard presente dalla v.6.5 è il function handle(@), simile ad un
puntatore del C++ ma più generale. Si genera un handle alla funzione che contiene il path
della funzione, permette di richiamarla indirettamente, memorizza tutte le informazioni per
eseguire la funzione e si può utilizzare come gli altri tipi di dati. Il vantaggio è nella
velocità di esecuzione e nell’aumento delle prestazioni per le operazioni ripetute o i cicli.
La sintassi per generare un handle alla funzione è:
handle=@nome-function
handle=@(arg)anonymous function
>>h=@sin; %h=nome dell’handle alla function sin
>>h(34.5)
ans=
0.0575
Il function handle è inoltre la tecnica ottimale per passare una function come parametro di
input di un’altra function:
function m=somf(fun,x)
y=fun(x)
%calcola la media dei valori di una funzione fun nei punti x
m=sum(y)/length(y);
x=0:0.1:1;
M=somf(@exp,x)
M=
1.7465
%media della funzione esponenziale
Media della funzione f = 1./(1+x), definita nel function file f.m e con una anonymous
function:
m=somf(@f,x)
21
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
m=
0.7047
media=somf(@(x)(1./(1+x)),x)
media=
0.7047
Programmare in Matlab
Il Matlab è stato ideato per svolgere rapidamente calcoli vettoriali. Il suo uso ottimale infatti
non consiste nello scrivere programmi come con un qualsiasi linguaggio di
programmazione, ma nello sfruttare le sue potenzialità nel gestire le matrici e nell’usare le
numerose funzioni interne, così da svolgere molti calcoli con pochi comandi ed in tempo
minore.
Consente una scrittura codice 50 volte più veloce che in C o C++ ,e un codice 10 volte
più veloce che in C o C++ (NASA ).
Per massimizzare la performance dei codici :
vettorizzare il codice
preallocare gli array di lunghezza fissa
evitare variabili non necessarie
gestire gli array per colonne
usare function e non script
Il prodotto scalare della riga i di una matrice per un vettore colonna x scritto in maniera
poco efficiente è:
>> som=0;
>> for j=1 :n
som=som+a(i,j)*x(j);
>>end
Scritto eliminando l’inutile ciclo che opera a livello scalare diventa:
>> som=a(i,:)*x
Di seguito vi sono alcuni esempi con la valutazione dei tempi di codici ottimali e non.
Vettorizzazione del codice:
>> tic
k=0;
for t=0:0.1:10
k=k+1;
y(k)=exp(t)*cos(3*t);
end
>>toc
Elapsed time is 1.532000 seconds.
>> tic
x=[0:0.1:10];
y=exp(x).*cos(3*x);
>>toc
Elapsed time is 0.210000 seconds.
function [somma,som]=testsomma(a)
profile on
%fa partire profile
n=length(a);
somma=som1(a,n);
22
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
som=som2(a);
profile viewer
%genera profile report e lo visualizza
%sottofunzione som1
function somm=som1(a,n)
somm=0;
for k=1:n
somm=somm+a(k);
end
%sottofunzione som2
function som=som2(a)
som = sum(a);
>>a=rand(1000000,1);
>> [somma,somma1]=testsomma(a);
Si ottiene il profile summary, che dà informazioni sui tempi delle varie function richiamate:
Preallocazione di array:
% script file mem.m
n=10e3; x(1)=1000; %test senza allocazione memoria
for k=2:n
x(k)=1.05*x(k-1);
end
%script file mem1.m
n=10^3;x=zeros(n,1); %test con allocazione memoria
x(1)=1000;
for k=2:n
x(k)=1.05*x(k-1);
end
>> t=cputime;
>> mem
>> cputime-t
ans =
0.6309
>> t=cputime;
>> mem1
>> cputime-t
ans =
0.2804
23
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
Evitare variabili non necessarie:
%script file testtempi1.m , variabile non necessaria
n=3000;
x=randn(n);
y=x*1.2;
%script file testtempi2.m , in place
n=3000;
x=randn(n);
x=x*1.2;
>> t=cputime;
>> testtempi1;
>> cputime-t
ans =
2.2532
>> t=cputime;
>> testtempi2;
>> cputime-t
ans =
2.0129
Gestire gli array per colonne:
% script file test righe.m , non è un programma ottimale !
n=3000;x=rand(n);y=zeros(n);
for r=1:n %per righe
for c=1:n
if x(r,c)>0
y(r,c)=x(r,c);
end
end
end
% script file test colonne.m , non è un programma ottimale !
n=3000;x=rand(n);y=zeros(n);
for c=1:n %per colonne
for r=1:n
if x(r,c)>0
y(r,c)=x(r,c);
end
end
end
>> t=cputime;
>> testrighe;
>> cputime-t
ans =
7.3205
>> t=cputime;
>> testcolonne;
>> cputime-t
24
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
ans =
2.4435
Grafica in MATLAB
Il Matlab consente di tracciare in maniera molto semplice grafici bidimensionali e
tridimensionali. Inoltre, una volta creato un grafico, si può modificarlo, aggiungere testi,
frecce, linee, ruotarlo o effettuarne uno zoom mediante Plot editor , che è una interfaccia
grafica molto semplice da usare e si può avviare direttamente dalla finestra grafica.
Grafica a due dimensioni
Il grafico di una funzione f(x) è l’insieme dei punti del piano (x,y) con x∈[a,b] e y=f(x). Su
di un computer tale insieme infinito e continuo non si può rappresentare e va sostituito con
insiemi finiti e discreti. In un grafico bidimensionale in Matlab si rappresentano i punti:
(xi,yi) i=1,..,n
discretizzazione della curva, con a=x1<x2<…xn =b e yi=f(xi) .
Il comando per tracciare un grafico bidimensionale è : plot(x,y)
1
0.8
0.6
>>x=linspace(-pi,pi,100);
>>y=sin(x);
>>plot(x,y)
Produce il grafico della funzione sin(x).
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
-4
-3
-2
-1
0
1
2
3
4
Vi sono molte funzioni che consentono di gestire grafici sulla stessa finestra, di modificare
colore e tratto, di inserire un titolo,una griglia, di assegnare gli assi (axis), etc:
>> x=1:0.1:5;
>> p=[1 2 3];
>>y=polyval(p,x);
>> plot(x,y)
>>title(‘grafico del polinomio’);
>>xlabel(‘assex’);
>>ylabel(‘polinomio’);
>>grid
Su una stessa finestra si possono rappresentare più curve con colori e tratti diversi. Il
seguente programma traccia il grafico di sen(x) con linea rossa e simbolo o, e di cos(x)
con linea verde e simbolo * .
>> x=linspace(-pi,pi,100);
>>y=sin(x);z=cos(x) ;
>>plot(x,y,’ro‘,x,z,’g *’)
25
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
Il comando subplot divide la finestra grafica in più finestre ed in ognuna traccia un grafico:
subplot(m,n,p) divide la finestra in un array m×n di sottofinestre,p è la finestra corrente:
>> x=linspace(-pi,pi,100); y=sin(x);z=cos(x) ;
>> subplot (2,1,1),plot(x,y) ;title(‘senx’);
>> subplot (2,1,2),plot(x,z) ;title(‘cosx’);
Nella figura seguente vi sono tutti i possibili tipi di grafici in due dimensioni:
Curve parametriche
Una curva parametrica è espressa in funzione di un determinato parametro.
La maniera più semplice ed intuitiva per descrivere una curva nel piano è quella di
considerarla come traiettoria di un punto che si muove in un intervallo di tempo(punta della
matita del disegnatore). All’istante t in un intervallo [a,b] di tempo il punto si trova nella
posizione P(t)=(x(t),y(t)); per descrivere il moto di P basta definire x(t),y(t), e la curva sarà
costituita da tutti i punti P(t), tε[a,b], parametro. Le equazioni parametriche della curva :
x=x(t)
y=y(t)
tε[a,b]
Nelle applicazioni sono spesso utilizzate curve e superfici rappresentate in forma
parametrica. Ciò consente semplici ed eleganti procedure di calcolo al computer, e
presenta notevoli vantaggi, tra cui la possibilità di rappresentare curve chiuse o intrecciate,
la possibilità di preservare proprietà di invarianza geometrica utili nella computer graphic(
ad esempio le routines di base per il linguaggio PostScript, in cui semplici trasformazioni
geometriche corrispondono a stili e dimensioni diverse). Alcune forme geometriche sono
esprimibili solo in forma parametrica, ed è la relazione tra i punti dell’oggetto a determinare
la forma.
26
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
%cerchio di centro(2,2)e raggio 3.5
>> t=linspace(0,2*pi,200);
>> x=2+3.5*cos(t);
>> y=2+3.5*sin(t);
>> plot(x,y)
>> axis square
6
5
4
3
2
1
0
-1
-2
-2
-1
0
1
2
3
4
5
6
Grafica a tre dimensioni
Si può fare il grafico di:
Traiettorie
Superfici
Solidi
Nella figura seguente vi sono i possibili tipi di grafici in tre dimensioni.
Le linee nello spazio a 3 dimensioni si possono rappresentare con:
plot3(x,y,z)
>> t=0:pi/50:10*pi;
>> plot3(sin(t),cos(t),t)
40
30
20
10
0
1
0 .5
1
0.5
0
0
-0.5
-0.5
-1
-1
Il grafico di una superficie z = f(x,y) è definito come l’insieme dei punti del piano (x,y,z) con
x∈[a,b], y∈[c,d] e z=f(x,y). Bisogna discretizzare il grafico:
27
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
(xi,yi,zi,j) i=1,..,m;j=1,..,n
discretizzazione
a=x1<x2<…xm =b; c=y1<y2<…ym =d (reticolo o griglia) e zi,j=f(xi,yj). Per generare il reticolo
si usa il comando meshgrid:
>> x=linspace(0,1,50);y=linspace(0,1,50);
>> [X,Y]=meshgrid(x,y) ;
La funzione f sarà valutata in corrispondenza delle matrici X,Y: per tracciarne il grafico si
può usare il comando mesh :
0.5
>> x=-2:0.25:2;
>> y=-1:0.2:1;
>> [X,Y]=meshgrid(x,y);
>> z=X.*exp(-X.^2-Y.^2);
>> mesh(X,Y,z)
0
-0.5
1
0.5
2
1
0
0
-0.5
-1
-1
-2
Vi sono molti altri comandi, ad esempio:
0.5
>> x=-2:0.25:2;
>> y=-1:0.2:1;
>> [X,Y]=meshgrid(x,y);
>> z=X.*exp(-X.^2-Y.^2);
>>surf(X,Y,z)
0
-0.5
1
0.5
2
1
0
0
-0.5
-1
-1
>> x=-2:0.25:2;
>> y=-1:0.2:1;
>> [X,Y]=meshgrid(x,y);
>> z=X.*exp(-X.^2-Y.^2);
>> ribbon(z)
-2
0.5
0
-0.5
15
20
10
15
10
5
5
0
0
Si possono ottenere grafici più raffinati con i comandi:
colormap cambia la colorazione
shading cambia l’ombreggiatura
view
cambia l’orientamento
lighting cambia l’illuminazione
10
material cambia il materiale
colorbar inserisce barra colori
5
>> p=peaks;
>> surfl(p);shading interp
0
-5
-10
60
50
40
40
30
20
20
0
10
0
28
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
0.9
10
>> surfl(p);shading interp
>> colormap(cool);colorbar
0.8
0.7
5
0.6
0
0.5
-5
0.4
0.3
-10
60
0.2
50
40
40
0.1
30
20
20
10
0
0
Si possono poi ottenere grafici a barra, istogrammi e grafici a torta:
grafico a barre
3
x=randn(100,1);subplot(2,1,1);bar(x)
axis([0 100 –3 3]);
title(‘grafico a barre’);
n=hist(x);subplot(2,2,3);bar(n)
title(‘istogramma’);
subplot(2,2,4);pie3
2
1
0
-1
-2
-3
0
10
20
30
40
50
60
70
80
90
100
istogram m a
25
grafic o a torta
20
4% 10%
1%
2%
6%
15
21%
9%
10%
10
18%
19%
5
0
1 2 3 4 5 6 7 8 9 10
Il comando imagesc genera un grafico a densità di colore variabile, cioè una
rappresentazione nel piano di funzioni di 2 variabili dove lo stesso valore corrisponde allo
stesso colore. Molte funzioni producono immagini interessanti e decorative, come si vede
dagli esempi seguenti.
x=-0.5:0.005:.5;y=x;
[X,Y]=meshgrid(x,y);
Z=X.^2+Y.^2;
imagesc(Z);
shading interp
axis('equal','square','off')
Si può applicare ad una matrice:
>> imagesc(hadamard(20))
>> colormap(winter) ;axis('equal','off')
29
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
Se i nodi non sono distribuiti su una griglia cartesiana, non sono equispaziati o sono
casuali(misurazioni), ad esempio bisogna disegnare
disegnare la superficie di un monte partendo
da misure sperimentali delle altitudini in punti che non corrispondono a una griglia
cartesiana, non si può usare mesh ma bisogna generare una griglia non strutturata. Il
Matlab ha delle funzioni che costruiscono una
una mesh di triangoli e disegnano una
superficie partendo da essi : delaunay,trimesh.
delaunay,trimesh
Esempio : (x,y,z) = misure sperimentali.
load seamount
figure(1);plot3(x,y,z,'.','markersize',5);
xlabel('longitudine');ylabel('latitudine');
tri=delaunay(x,y);
figure(2);trimesh(tri,x,y,z);
0
0
-1000
-1000
-2000
-2000
-3000
-3000
-4000
-4000
-5000
-47.8
-5000
-47.8
-48
-48
211.8
211.4
-48.6
-48.6
211
210.8
211.2
-48.4
211.4
211.2
-48.4
latitudine
211.8
211.6
-48.2
211.6
-48.2
211
210.8
longitudine
Si possono poi generare solidi:
>>t=0:pi/10:2*pi;
>>cylinder(2+cos(t)
1
0.8
0.6
0.4
0.2
0
4
2
4
2
0
0
-2
-2
-4
>> cylinder(2+cos(t));
>> shading interp
%modifica il tipo di materiale
-4
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
>> material dull
>> colormap(winter)
>> axis off
Menù a pulsanti
Per creare un semplice menù a pulsanti si può usare la funzione menu:
scelta=menu('intestazione','pulsante1','pulsante2', …)
%Script file sceltamenu
scelta=menu('scegliunafunzione','sin','cos', 'exp','fine');
if scelta==1
x=0:0.1:2*pi;y=sin(x);
plot(x,y);
elseif scelta==2
x=0:0.1:2*pi;y=cos(x);
plot(x,y);
elseif scelta==3
x=0:0.1:2;y=exp(x);
plot(x,y);
elseif scelta==4
close all;
cancella tutte le figure
return;
ritorna alla command window
end
clear scelta;
sceltamenu
nome dello script che contiene il programma
Ho cliccato
su exp
Modifica di un oggetto grafico da programma
Si possono modificare le proprietà degli oggetti creati da plot:
plot(...,'PropertyName',PropertyValue,...)
dove 'PropertyName' è
LineWidth
ampiezza linea
MarkerEdgeColor colore marker o bordo marker
MarkerFaceColor colore di riempimento marker
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
MarkerSize
ampiezza marker
x = -pi:pi/10:pi;
y = sin(x);
plot(x,y,'--rs','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g', 'MarkerSize',10)
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
-4
-3
-2
-1
0
1
2
3
4
Per creare più figure basta anteporre al comando di disegno figure(k),per chiudere tutte
le figure:close all.
Si può modificare in modo più sofisticato l’aspetto di una finestra grafica (colore
sfondo,spessore linee,grandezza e tipo caratteri,assi,titolo, …)e dei grafici in essa
presenti da programma, così da non perdere le modifiche al grafico di base, cosa che
avviene se si modifica in modo interattivo dalla finestra grafica.
Il Matlab ha una gestione dei grafici object-oriented, cioè lo schermo è un albero in cui
ogni nodo è un oggetto, proveniente da un nodo padre e che ha nodi figli(children),a cui
si accede tramite puntatore (handle) ed a cui sono associate delle proprietà modificabili.
La finestra grafica(Figure) attiva è individuata dal puntatore gcf (graphic current
figure).Le proprietà di un oggetto Figure sono ad esempio la posizione, il colore di
sfondo,le dimensioni… Per vederle tutte:
get(gcf)
I figli di un oggetto Figure sono i grafici, menù a tendine, immagini,.. (Axes) nella
finestra.In una Figure vi possono essere più Axes, quello attivo è individuato dal
puntatore gca (grafhic current Axes).I figli di un oggetto axes sono i grafici ed i testi.
Le proprietà di un oggetto Axes sono ad esempio title,color,xlabel,…Per vederle tutte:
get(gca)
>> x=-pi:0.1:pi;
>> y=cos(x);
>> plot(x,y)
il comando set modifica le proprietà.
Modifichiamo il colore di fondo della figura corrente da grigio a giallo e portiamo a 15 la
dimensione dei caratteri negli assi:
>> set(gcf,'color','y')
>> set(gca,'fontsize',15)
32
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
1
0.5
0
-0.5
-1
-4
-2
0
2
4
Una funzione come plot può generare un handle all’oggetto grafico che produce.
L’ handle memorizza la figura e la rende disponibile per un uso futuro.(Un handle di
figura è un tipo speciale di “handle di oggetto”,che può essere assegnato ad altri tipi di
oggetti). Con il comando
>> hsin=plot(x,y);
si crea un handle alla curva e se ne possono modificare le caratteristiche:
>> set(hsin,'linewidth',4)
1
0.8
0.6
0.4
0.2
0
-0.2
-0.4
-0.6
-0.8
-1
-4
-3
-2
-1
0
1
2
3
4
Con il comando axes si può specificare la posizione dell’oggetto nella figura corrente:
axes(‘position’,[a b c d])
c,d = larghezza e altezza del rettangolo in cui inserire la figura
a,b= angolo sinistro in basso della figura rispetto alla finestra.
Funzioni relative al suono e all’animazione
soundsc(y,Fs) converte un vettore in suono
y= segnale discreto di frequenza Fs
Fs frequenza,se omessa Fs=8192Hz
>> y=sin(linspace(0,20000,20000));
>> soundsc(y,15000)
>> soundsc(y)
Matlab include alcuni file audio, ad esempio:
>>load chirp
>>soundsc(y,Fs)
Un modo per ottenere sequenze animate (senza memorizzarle), è quella di cambiarne
posizione e proprietà e ridisegnare l’oggetto:si può animare un oggetto cambiandone le
coordinate e cancellando nella figura corrente l’oggetto precedente. Per fare ciò si cambia
la proprietà EraseMode ponendola xor e si usa il comando drawnow per eseguire
immediatamente il comando grafico. Si può rallentare l’animazione con il comando
pause(n).
La function seguente anima la funzione e-x.
function muoviexp
33
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
%anima la funzione exp
clear;close all;
t=[0:0.1:5];
%crea un handle al plot
p=plot(t(1),exp(-t(1)),'o',...
'EraseMode','xor','MarkerEdgeColor','b','MarkerFaceColor','g','MarkerSize',10);
axis([0 5 0 1]);
hold on
for j=2:length(t)
%specifica I dati da rappresentare in p
set(p,'XData',t(j),'YData',exp(-t(j)))
drawnow
pause(0.05)
end
Si possono anche visualizzare e memorizzare animazioni (“movie”) memorizzando le
immagini come singoli fotogrammi di un film con i comandi,getframe, movie.
La funzione getframe cattura la figura corrente per creare un fotogramma(frame).
F=getframe cattura un frame dalla figura corrente e dà in output una struttura con due
campi:
cdata dati relativi all’immagine
colormap mappa dei colori
Per registrare un’animazione si usa in un ciclo del tipo:
for k=1:n
istruzioni per creare l’immagine
M(k) = getframe salva la figura corrente nell’array M
end
Per vedere quanto registrato tramite il comando getframe più volte, con una velocità
diversa o all’indietro si usa la funzione movie. Per una semplice ripetizione si usa
movie(M).
movie(M,n) visualizza n volte la sequenza di immagini memorizzate nella matrice M, se
n è negativo all’indietro.
movie(M,n,fps) visualizza n volte la sequenza di immagini fps frames per secondo (di
default fps=12).
Lo script seguente crea l’animazione e muove una superficie tridimensionale.
% script file muovifigura.m
clear;close all;
set(gcf,’DoubleBuffer’,’on’) elimina i flash
z=peaks;
funzione demo
surf(z);
axis tight;
setta gli assi nel range dei dati
thisax=axis;
fissa gli assi
for j=1:5
surf(sin(2*pi*j/20)*z);axis(thisax);
F(j)=getframe;
carica le immagini nella matrice F
end
movie(F,5)
visualizza 5 volte il film
34
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
Per visualizzare un fotogramma lo si estrae dalla struttura creata da getframe e si usa il
comando image:
%estrai il terzo fotogramma
>> colori=F(3).colormap;
>> foto=F(3).cdata;
>> colormap(colori);
>> image(foto) %visualizza l’immagine
50
100
150
200
250
300
50
100
150
200
250
300
350
400
Si può vedere il film anche su un computer che non ha a disposizione il Matlab, si può
includere in una pagina web o in una presentazione power point salvando il filmato in un
file di tipo AVI(Audio Video Interleave, il più comune formato per file multimediali). Si crea,
con il comando avifile un oggetto che può contenere un filmato tipo AVI, si creano i frames
con getframe e si aggiungono all’oggetto con la funzione addframe, infine si chiude il file
con la funzione close. Si può anche creare un file AVI con la funzione movie2avi,
partendo da una matrice movie di matlab. Infine la funzione aviread legge un file AVI.
Image processing toolbox
In Matlab vi sono funzioni per leggere,scrivere e visualizzare immagini di formato
diverso(JPEG,BMP,GIF,..).
Modalità Grayscale :l’immagine è rappresentata da un array i cui valori rappresentano
il livello di grigio del pixel corrispondente,Class array :double Є[0,1] , uint8 Є[0,255].
Modalità Indexed : l’immagine è rappresentata da un array X corrispondente ai pixel e
da una colormap matrix (MAP) mx3. I valori di X sono gli indici di riga dell’array MAP
che rappresenta la mappa di colori Є[0,1] : il livello di rosso,verde e blu del pixel
corrispondente .
Modalità Truecolor(RGB) : l’immagine è rappresentata da un array (m,n,3) di uint8 o
double∈[0,1] .La combinazione dell’intensità dei 3 colori base nella posizione(i,j,1:3)
fornisce il colore finale del pixel(i,j)
Per leggere e memorizzare un’immagine:
I=imread(‘filename.ftm’) : legge un’immagine contenuta nel file filename.ftm
[I,map]=imread(‘filename.ftm’) : legge un’immagine indexed
I=imread(‘URL) :Legge un’immagine da un indirizzo URL
imwrite(I,‘filename.ftm’) :Scrive un file contenente un’immagine .
Per visualizzare un’immagine:
imshow(I)
image(I)
imtool(I) :Interfaccia grafica per visualizzare e modificare un’immagine.
Si possono fare operazioni sui singoli pixel, l’immagine si può modificare, filtrare,..
Di seguito alcuni esempi di semplici operazioni:
>> [X,map]=imread('trees.tif');
>> imshow(X,map)
35
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
>> colormap(jet) % cambia i colori
>> [X,map]=imread('trees.tif');
>> j=imrotate(X,35);
>> imshow(j,map)
>>[I,map]=imread('trees.tif');
>> j=ind2gray(I,map);
>> imshow(j)
>> k=imcomplement(j);
>> figure(2)
>> imshow(k)
>> J=imread('cameraman.tif');
>> I=imread('rice.png');
>> K=imadd(I,J);
36
Calcolo Numerico II- CdL Specialistica in Ingegneria Informatica - A.d’Alessio
Il Sistema Interattivo MATLAB
>> imshow(K)
>> A=imread('panorama.jpg');
>> B=imread('ischia.jpg');
>> C=cat(4,A,B);
>> montage(C)
Per creare un’animazione :
mov = immovie(X,map) : Crea un movie struct array
mov = immovie(RGB) :Crea un movie struct array
implay(mov) :Visualizza il film
37

Documenti analoghi

IL PROGRAMMA MATLAB (ver 5.2)

IL PROGRAMMA MATLAB (ver 5.2) programma possono essere richiamate anche da programmi esterni. All'utente medio MATLAB appare comunque come un ambiente integrato di calcolo, è infatti principalmente un programma interattivo di c...

Dettagli

Introduzione a Matlab e Simulink

Introduzione a Matlab e Simulink di strumenti per la modellazione, l’analisi e il controllo di sistemi dinamici (come f.d.t. o in forma di stato) E’ costituito da una collezione di comandi scritti come Mfile, che permettono di  i...

Dettagli

Mini Manuale Matlab

Mini Manuale Matlab singoli elementi aij della matrice A. La matrice risultato è posta in B:

Dettagli

Presentazione MatLab nuova versione

Presentazione MatLab nuova versione Per salvare una cronaca della sessione di lavoro si deve eseguire all'inizio della sessione stessa il comando diary nomefile.txt Il file di testo NON permette di recuperare il contenuto delle varia...

Dettagli

Introduzione a Matlab

Introduzione a Matlab A.2 General purpose commands. . . . . . . . . . . A.2.1 General information . . . . . . . . . . . A.2.2 Managing the workspace. . . . . . . . . A.2.3 Managing commands and functions. . . A.2.4 Mana...

Dettagli