qui

Transcript

qui
Introduzione a MATLAB®
Fabio Rossi
[email protected]
Concetti Fondamentali
MATLAB = MATrix LABoratory
• Nato come interfaccia alle librerie di algebra lineare
LINPACK ed EISPACK
• Interprete di comandi
• Linguaggio di programmazione
• Matrix-oriented
– i vettori sono matrici ad 1 indice, gli scalari sono matrici 1x1
– Non è un linguaggio tipizzato: dimensionamento non richiesto
•
•
•
•
Multi-piattaforma (Unix, Mac, Windows)
Portabilità delle applicazioni
Possibilità grafiche
E’ possibile far interagire programmi scritti in C o
FORTRAN con MATLAB
– API, Application Program Interface
Modularità
•
Toolbox (Librerie)
– collezione omogenea di funzioni (m-files) che estende il pacchetto
originario
•
Esempi:
–
–
–
–
–
–
–
–
•
•
statistica
reti neurali
ottimizzazione
elaborazione di immagini
controllo e identificazione di sistemi
equazioni alle derivate parziali (pde)
matematica finanziaria
… e molti altri …
Programmazione grafica per agevolare la modellazzazione e la
simulazione di sistemi complessi (SIMULINK).
Riferimento: www.mathworks.com
Prompt dei comandi
• All’avvio compare:
>>
• Utilizzo come calcolatrice
>> 2+2
ans =
4
• ans è una variabile standard dove viene caricato l’ultimo risultato
>> quit
• … esce dal programma
• Help in linea: help nome-comando
>>help sqrt
>>help help
Prompt dei comandi
• Operazioni standard
– +, -, *, /, ^
• Separazione dei comandi su una stessa linea con una
virgola: ,
• Terminazione di un comando: ;
– Non viene visualizzato l’output
• Per spezzare una linea di comando troppo lunga: …
• Comandi precedentemente inseriti: tasto ↑
• Utilizzo parentesi per modificare la priorità fra le
operazioni
• Variabili, operatore di assegnamento
>> a = 3
Workspace
• Lo spazio di memoria contenente le
variabili presenti
• Lista delle variabili:
>>who
• Lista delle variabili estesa (nome,
dimensioni, occupazione di memoria,
classe, attributi):
>>whos
Salvataggio sessioni di lavoro
>>diary mywork.dat
>>…
>>diary off
• mywork.dat è un semplice file di testo
• Per salvare lo stato della memoria:
>>save <nomefile> [lista variabili]
Produce un .m file
>>save work1
>>save work2 x y
Omettendo [lista variabili] tutto il workspace viene salvato.
Per ricaricare il workspace:
>>load work1
Variabili predefinite
•
•
•
•
•
•
•
•
•
•
ans:
i, j:
pi:
eps:
realmax
realmin
Inf
NaN
version
computer
•
Nota: definizione di un numero complesso:
>> c = 1 + 3*i
Complesso coniugato
>> cj = c’
•
valore ultima operazione eseguita
unità immaginaria, sqrt(-1)
approssimazione di π
precisione di macchina
massimo numero reale positivo rappresentabile
minimo numero reale positivo rappresentabile
∞, ossia un numero maggiore di realmax
indeterminato (Not A Number) (0/0, Inf/Inf, …)
versione di MATLAB
tipo di computer
Variabili
• Anche quelle predefinite possono essere
modificate
>>clear <nome varibile>
– Contenuto per le variabili predefinite, ripristina
il valore di default
– per le altre variabili, elimina la variabile dal
workspace
>>clear
– Reset del workspace
Formato di visualizzazione dei
numeri
• Comando format
>>format
% default - virgola fissa
>>format long
% virgola fissa estesa
>>format long e
% scientifica estesa
>>format short e
% scientifica abbreviata
>>format rat
% numero razionale
• Importante: il formato in cui sono memorizzati i
numeri ed effettuati I calcoli è comunque
double (floating point in doppia precisione).
Vettori e Matrici
Definizione di vettori
• Notazione con parentesi quadre
– Variabile vuota
>> e = []
– Vettore riga (1xn)
>> vr = [1 2 3 4]
– Vettore colonna (nx1)
>> vc = [1; 2; 3; 4]
– Definizione con intervalli
– v= [inizio:incremento:fine] | [inizio:fine]
>> v=[1:10]
% incremento di default = 1
>> v=[-2:0.5:2]
Definizione di matrici
>> m1 = [1 2; 3 4]
m1 =
1 2
3 4
>> m1 = [1 2; 3 4 5] … Errore!
• Composizione di matrici e/o vettori:
>> m2 = m1; m3 = [m1 m2]
>> m4 = [1:3; 4:6; 7:9]
Indicizzazione
• Vettori (sia riga che colonna)
– v(k): elemento di indice k
(n.b.: si conta a partire da 1)
– v(vettore_indici)
• Matrici
–
–
–
–
–
m(l,k), elemento in riga l-esima, colonna k-esima
m(l, :), riga l-esima
m(:, k), colonna k-esima
m(indici_riga, indici_colonna)
m(:), tutti gli elementi vengono estratti in un vettore
colonna di dimensioni nxm
Indicizzazione – Esempio 1
•
>> mi
mi =
1
1/2
1/3
1/4
1/5
1/2
1/3
1/4
1/5
1/6
>> mi([1 3 5], [2 4])
ans =
1/2
1/4
1/6
1/4
1/6
1/8
1/3
1/4
1/5
1/6
1/7
1/4
1/5
1/6
1/7
1/8
1/5
1/6
1/7
1/8
1/9
Indicizzazione – Esempio 2
•
•
Cancellazione di una colonna da una matrice:
>> m(:,k) = [ ]
rimuove la colonna
k-esima
Ridimensionamento di vettori
– Indicizzando in scrittura un elemento non presente nella matrice (o
vettore), la matrice viene, se possibile, ridimensionata in modo da
comprendere tale elemento ed il valore assegnato
– Esempio:
>> v=1
v=
1
>> v(3)=2
v=
1 0 2
>> v(2,4)=3
v=
1 0 2 0
0 0 0 3
>> v(11) = 4
??? In an assignment A(I) = B, a matrix A cannot be resized.
Dimensioni
• Matrici:
>> size(m1)
ans =
2
• Vettori:
>>length(b)
ans =
4
2 % vettore contenente
% numero di righe e colonne
Operazioni su matrici
• Somma “+”/Sottrazione “-” (dimensioni congrue)
– Caso particolare: +,- con uno scalare, viene applicata
elemento per elemento
• Moltiplicazione riga-colonna “*”(matrice nxk *
matrice kxm = matrice nxm)
– Stesso caso particolare, moltiplicazione per uno
scalare
• Trasposta coniugata
>> b = a’
• Trasposta non coniugata
>> b = a.’
Moltiplicazione fra matrici Esempio
>> a = 1:4
a=
1
2
3
4
>> b = 2:5
b=
2
3
4
5
4
6
8
10
6
9
12
15
8
12
16
20
>> b * a'
ans =
40
>> b' * a
ans =
2
3
4
5
Operazioni su matrici,
per elemento
•
Facendo precedere l’operatore da “.”, ad esempio:
>> m1
m1 =
1
3
2
4
>> m2
m2 =
1
3
2
4
>> m1.*m2
ans =
1
9
4
16
Operazioni su matrici,
per elemento
• Altro esempio
>> m1
m1 =
1
2
3
4
>> m1^2
ans =
7
15
10
22
>> m1.^2
ans =
1
9
4
16
Nota: ^ è definito solo per matrici quadrate ed esponenti interi
Divisioni
• Divisione fra matrici non definita in
matematica
• In MATLAB:
– A / B = A * inv(B)
– A \ B = inv(A) * B
Matrici predefinite
• rand(n)
•
•
•
•
zeros(n)
ones(n)
eye(n)
hilb(n)
matrice di nxn numeri
random in [0,1]
matrice nulla
matrice costituita da 1
matrice identità
matrice di Hilbert
• (n) può essere sostituito con (n,m)
• come definire un vettore di 0?
Costruzione di matrici
• diag(v)
– dato un vettore v di lunghezza n, costruisce una
matrice diagonale nxn avente gli elementi di v sulla
diagonale
• diag(v, i)
– dato un vettore v di lunghezza n, costruisce una
matrice (n+abs(i))x(n+abs(i)) avente gli elementi di v
sulla i-esima diagonale
• diag(M, i)
– data una matrice M estrae in un vettore colonna la
sua i-esima diagonale (se i viene omesso restituisce
la diagonale principale)
Funzioni built-in su vettori
• max(v) (min(v)) : massimo (minimo) valore delle
componenti di un vettore (considerate solo in
modulo)
• [m, i] = max(v) (min(v)), come sopra, ma
restituisce in m il valore ed in i l’indice
dell’elemento
• sum(v), somma di tutti gli elementi di v
• prod(v), prodotto di tutti gli elementi di v
• sort(v), ordina gli elementi di v (ordine
crescente) e li inserisce nel vettore restituito
Funzioni built-in su vettori
• norm(v), norma 2 del vettore v
• norm(v,1), norma 1 del vettore v
• norm(v, inf), norma infinito del vettore v
Funzioni built-in su matrici
• max(M) (min(M)) : massimo (minimo) valore delle
componenti di una matrice per ogni colonna,
generazione di un vettore riga che contiene i risultati
• [m, i] = max(M) (min(M)), come sopra, ma restituisce in i
gli indici di riga degli elementi selezionati per ogni
colonna
• sum(M), somma gli elementi di ogni colonna di M
• prod(M), prodotto degli elementi di ogni colonna di M
• sort(M), ordina gli elementi di ogni colonna di M (ordine
crescente) e li inserisce nella matrice restituita
Funzioni built-in su matrici
•
•
•
•
det(M), determinante di M
rank(M), rango di M
null(M), calcola una base ortonormale del nucleo di M
orth(M), calcola una base ortonormale dell’immagine di
M
• eig(M), calcola gli autovalori di M
• [V, D] = eig(M), calcola autovalori e autovettori di M
– Le colonne di V sono gli autovettori
– D è una matrice diagonale contenente gli autovalori sulla
diagonale
– D = V-1 M V
Funzioni built-in su matrici
• trace(M), calcola la traccia di M (somma degli
elementi sulla diagonale)
• inv(M), calcola l’inversa di M
• M\v, risolve il sistema lineare Mx=v utilizzando il
metodo di eliminazione di Gauss
• norm(M), norma 2 di M
• norm(M,1), norma 1 di M
• norm(M, inf), norma infinito di M
• cond(M), fattore di condizionamento (in norma
2) di M
– disponibili anche cond(M,1) e cond(M,inf)
Il comando flops
• Permette di contare il numero di
operazioni in virgola mobile effettuate in
una sessione di lavoro
>>flops(0)
% reset del contatore
>>A+B;
% due matrici 3x3…
>>flops
ans =
9
Programmazione in MATLAB
Script
• Memorizzati in .m files
• Sequenza di comandi
• Non ci sono parametri in ingresso né in
uscita
• Variabili a visibilità globale
Script - Esempio
• Il file script1.m contiene:
a = [1:5]
b = [6:10]
c = a*b'
d = a'*b
Funzioni
• Memorizzate in .m files
• Accettano argomenti in ingresso e possono restituire
argomenti in uscita
• Le variabili interne ad una funzione sono locali
• La prima riga del file rappresenta l’intestazione della
funzione:
– function [out1, out2, …] = nome_funzione( in1, in2, …)
– si consiglia di avere nome_funzione e nome del file coincidenti
• Dopo l’intestazione si possono inserire alcune righe di
commento (che iniziano con il carattere %) che saranno
stampate ogni volta che si invoca il comando:
help nome_funzione
• Segue il corpo della funzione
Funzioni - Esempio
Il file prima_funzione.m contiene:
function [r1 r2] = prima_funzione(n)
% non necessita di help...
v1 = [1:n];
v2 = [n+1:2*n];
r1 = v1*v2';
r2 = v1'*v2;
Operatori logici e di confronto
• Operatori di confronto:
– ==, <=, >=, <, >, ~=
– 0 corrisponde a false
– Un valore diverso da 0 corrisponde a true
• Operatori logici
– AND(&), OR (|), NOT(~)
• Nota: il carattere ~ si può ottenere con Alt+126, dove i
numeri vanno digitati in sequenza, dal tastierino numerico
(sulle tastiere dei laptop Alt+Fn+126)
• Ci serviranno per il controllo del flusso …
Input/Output - Terminale
• clc, pulisce il terminale
• disp(), visualizza una stringa o una variabile
• input, permette l’inserimento del valore di una variabile
da tastiera
>> n = input('Inserire un numero: ')
Inserire un numero: 3
n=
3
>>
• pause, sospende l’esecuzione del programma fino alla
pressione di un tasto
• pause(n), come sopra, fino ad un massimo di n secondi
Input/Output - File
• Apertura di un file in lettura
>>fid = fopen(‘c:\quadrato.dat’, ‘r’);
>>lato = fscanf(fid, ‘%f\n’);
• Lettura di una valore da file
• Formati di lettura/scrittura
–
–
–
–
%s
%d
%f
%e
stringhe
interi
reali in virgola fissa
reali in virgola mobile
• Apertura di un file in scrittura
>>fid = fopen(‘c:\area.dat’, ‘w’);
• Scrittura di un valore su file
>>fprint (fid, ‘il quadrato di lato %f ha area %f\n’, lato, area)
Controllo del flusso (1)
• For <indice>=<start>:<step>:<end>
{blocco-istruzioni}
end
• step può essere omesso, default = 1
• Esempio:
for i=1:n
for j=1:n
a(i,j) = 1/(i+j-1)
end
end
Controllo del flusso (2)
• while <condizione>
{blocco-istruzioni}
end
• Esempio:
>>n=1
>>while (prod(1:n)<1e10)
n=n+1;
end
disp(n)
Controllo del flusso (3)
•
if <condizione1>
{blocco-istruzioni1}
elseif <condizione2>
{blocco-istruzioni2}
else
{blocco-istruzioni3}
end
• Le clausole elseif ed else sono opzionali
• Esempio:
n=input(‘Numero di cui calcolare il fattoriale >>’);
If n<0
disp(‘n negativo’)
Elseif n==0
fattorale = 1
Else
fattoriale = prod(1:n)
end