cerca
Introduzione al Matlab
modifica cronologia stampa login logout

Wiki

Tools

Categorie

Help

edit SideBar

Introduzione al Matlab

 :: Introduzione al Matlab ::

Cos'è Matlab

Matlab sta per Mat(rix) lab(oratory) ed è sia un linguaggio di programmazione (interpretato, non si compila) che un ambiente grafico di lavoro; entrambi gli aspetti sono molto integrati tra loro, così da fornire un supporto potente e intuitivo per il calcolo numerico. E' sviluppato dalla MathWorks, utilizza numerose librerie di calcolo (in particolar modo di algebra lineare) ed è considerato uno standard in ambienti universitari e professionali.

Perché "matrix laboratory"? Perché Matlab fondamentalmente lavora su matrici, nelle loro varie forme: scalari (1x1), vettori riga (1xn), vettori colonna (nx1) e matrici classiche (nxn).

Torna su

Ambiente di lavoro

Nell'ambiente di lavoro di Matlab possiamo distinguere tre parti:

  • (A) Current directory/Workspace.
    Nella prima scheda viene visualizzato il contenuto della directory corrente, quindi file, cartelle e funzioni comprese; nella seconda sono invece mostrate tutte le variabili attualmente utilizzate, correlate di valore e formato.
  • (B) Command window.
    E' l'area in cui andranno scritti i comandi, un vero e proprio terminale. Il prompt ha come simbolo >>.
  • (C) Command history.
    Contiene la lista di tutti i comandi inviati dall'utente.

Le lettere maiuscole fanno riferimento alla figura sottostante.

Torna su

Regole generali

Comando help

Lo scriviamo subito, vista l'importanza: per visualizzare la breve guida di un comando bisogna scrivere help seguito dal nome del comando stesso. Ad esempio help hilb stamperà a video una breve spiegazione sul comando per creare matrici di Hilbert.
Scrivere soltanto help farà invece apparire l'elenco di tutti i toolbox disponibili, ovvero tutti quei pacchetti dedicati all'implementazione di una determinata funzione (ad esempio l'interpolazione o la gestione delle trasformate di Fourier).

Variabili

Il linguaggio di Matlab lavora per espressioni, ed è realizzato in modo da convertire queste ultime in variabili. Ogni espressione può contenere operatori (+ , - , / , * , ...), caratteri speciali (% , ! , : , ...), funzioni e nomi di variabili. In particolare, questi ultimi possono essere formati da lettere e cifre, sono case sensitive e devono iniziare con una lettera.
Gli operatori possono essere:

  • di operazioni elementari, come addizione (+), sottrazione (-), moltiplicazione (*) e divisione (/)
  • logici, come l'and (&), l'or (|) e il not (~)
  • relazionali, come il maggiore e il minore (> , <), il maggiore uguale e il minore uguale (>= , <=), l'uguale (==) e il diverso (~=).

Facciamo un esempio:

>> x = 3 + 2

"x = 3 + 2" è un'espressione che contiene l'operatore di addizione, due interi e il nome di variabile x. L'uguale è il normale operatore di assegnamento: alla sua destra va il valore da assegnare alla variabile alla sua sinistra.

Le variabili non devono essere dichiarate prima di essere usate, ma si possono utilizzare direttamente nelle espressioni. Non è nemmeno necessario specificarne il tipo e la dimensione, si occuperà Matlab ad interpretarle e gestirle correttamente. Il formato numerico di default è il format short, che visualizza solo le prime 4 cifre significative di un decimale. Con il format long si arriva invece a mostrarne 16, e si impone l'utilizzo della notazione esponenziale.

Premendo il tasto invio al termine dell'espressione si manda tutto in pasto a Matlab, che - fatti i suoi calcoli - visualizza nella command window e nel workspace la variabile ed il suo valore. Per evitare di printare a schermo ogni passaggio è sufficiente terminare ogni espressione con il punto e virgola.

>> x = 3 + 2

x =

     5

>> y = 4 + 7;
>> 

In entrambi i casi abbiamo ottenuto la creazione di una variabile, rispettivamente x e y, ma solo nel primo caso ci è stato dato un feedback dell'assegnamento. Se non avessimo specificato la variabile a cui associare il risultato di una determinata operazione, Matlab l'avrebbe automaticamente caricata nella variabile generica ans (answer). Quando la si utilizza bisogna sempre tenere a mente che non è persistente: se faccio due operazioni diverse senza specificare dove memorizzarle, il secondo risultato salvato in ans sovrascrive quello precedente.

Per visualizzare il contenuto di una sola variabile è sufficiente scrivere il suo nome, mentre per visualizzarle tutte possiamo utilizzare il comando who che ne stampa a video un semplice elenco, o il comando whos che fornisce un maggior numero di informazioni per ognuna di esse (ad esempio le dimensioni in byte e la classe).

>> who

Your variables are:

H  x  y  

>> whos
  Name      Size                    Bytes  Class

  H         3x3                        72  double array
  x         1x1                         8  double array
  y         1x1                         8  double array

Grand total is 11 elements using 88 bytes

>> 

In Matlab esistono alcune variabili di default, tra cui:

  • pi, il pi greco
  • eps, lo zero macchina
  • NaN (not a number), che indica che il valore dell'espressione non è esprimibile con un numero macchina
  • flops, ovvero il numero delle operazioni macchina effettuate. Va detto che il numero di flops varia a seconda delle operazioni, ad esempio quelle tra numeri complessi vanno da 2 a 6 flops.

Per quanto riguarda l'assegnamento di matrici o vettori bisogna utilizzare alcuni caratteri speciali:

  • [ ] (parentesi quadre), per racchiudere tutti gli elementi della matrice
  • , (virgole), per separare gli elementi sulla stessa riga. Si può usare anche lo spazio
  • ; (punti e virgola), per separare gli elementi su righe riverse

Ad esempio:

>> matr = [1 2 3;4 5 6]

matr =

     1     2     3
     4     5     6

>>

Una matrice vuota si scrive così: >> matrVuota = [] , dove ovviamente il nome della variabile matrVuota è un esempio generico.

Infine, con il comando clear si cancellano tutte le variabili finora definite e vengono ripristinate quelle di default eventualmente modificate. Se al comando clear si fa seguire il nome di una variabile verrà cancellata solo lei.

Torna su

Operazioni su scalari

Indipendentemente dal fatto che Matlab tratta gli scalari come matrici 1x1, possiamo compiere con essi tutte le operazioni classiche della matematica, ovvero:

  • addizione, +
  • sottrazione, -
  • moltiplicazione, *
  • divisione (con resto), /
  • elevamento a potenza, ^
  • utilizzo di parentesi tonde

Se non si riesce a far stare l'espressione su un'unica riga si può andare a capo terminandola con i tre punti, ...
Ad esempio:

>> x = 40 + 34 + 456 + 234 ...
+ 3403 + 234

x =

        4401

>> 

Torna su

Operazioni su matrici e vettori

Di seguito vedremo alcune operazioni sulle matrici. Partiremo dalla matrice di partenza:

m =  | 1  2  3 |
     | 4  5  6 |

Dimensione della matrice

Per conoscere la dimensione di una matrice è sufficiente usare il comando size.

Nel nostro caso ci viene detto che abbiamo due righe e tre colonne.

>> size(m)

ans =

     2     3

Estrazione di un elemento

Per estrarre un elemento dalla matrice, ad esempio quello sulla seconda riga e terza colonna, si usa la seguente sintassi:

>> m(2,3)

ans =

     6

Estrazione di una riga o di una colonna

Per estrarre una riga dalla matrice, ad esempio la prima, si usa la seguente sintassi:

>> m(1,:)

ans =

     1     2     3

Se invece volessimo estrarre una colonna, ad esempio la seconda, dovremmo scrivere:

>> m(:,2)

ans =

     2
     5

Notare l'utilizzo del carattere speciale due punti. Nell'estrazione di elementi da una matrice il due punti rappresenta l'intera riga o l'intera colonna, a meno che non sia delimitato da due valori. Mi spiego meglio. Se nel secondo esempio avessimo voluto estrarre la prima e la seconda colonna avremmo potuto scrivere >> m(:,1:2) , che si legge così: "per entrambe le righe, estrai tutti gli elementi che si trovano sulle colonne che vanno dalla 1 alla 2".

Spostamento della matrice in un vettore

Per spostare tutti gli elementi della matrice in un vettore si utilizza la seguente sintassi:

>> m(:)

ans =

     1
     4
     2
     5
     3
     6

Somma, prodotto, divisione, sottrazione

Per quanto riguarda le operazioni tra le matrici, non staremo qui a dire quali sono le regole classiche dell'algebra per implementarle. Ci limitiamo a ricordare che tali operazioni sono possibili solo quando le dimensioni delle matrici sono consistenti, quindi non proviamo a moltiplicare una matrice 2x3 con una 9x4, perché Matlab non fa magie.

Altre operazioni caratteristiche

Di seguito un elenco di operazioni caratteristiche per le matrici. Anche in questo caso non spiegheremo il loro significato, ma solo i comandi e i casi in cui è possibile effettuarle.

comando operazione esempio quando si può fare
' trasposizione m'
inv() inversione inv(m) matrici quadrate non singolari
det() determinante det(m) matrici quadrate non singolari
rank() rango rank(m) matrici quadrate non singolari
diag() se applicata a una matrice ne estrae la diagonale, mentre se applicata ad un vettore crea una matrice diagonale diag(m)
tril() estrazione parte triangolare inferiore. Se oltre alla matrice su cui lavorare si indica anche un numero intero positivo o negativo come secondo argomento della funzione, è possibile estrarre anche le diagonali che si trovano sopra o sotto la principale considerata tril(m)
tril(m,2)
triu() estrazione parte triangolare superiore. Se oltre alla matrice su cui lavorare si indica anche un numero intero positivo o negativo come secondo argomento della funzione, è possibile estrarre anche le diagonali che si trovano sopra o sotto la principale considerata triu(m)
triu(m,-1)
abs() se applicata a una matrice reale calcola la matrice dei valori assoluti, mentre se applicata a un numero complesso calcola il suo modulo abs(m)
sum() se applicato a una matrice restituisce un vettore con le somme per colonna degli elementi della matrice stessa, mentre applicato ad un vettore restuituisce la somma (uno scalare) degli elementi sum(m)
max() e min() se applicati ad un vettore calcolano rispettivamente il massimo e il minimo degli elementi di un vettore, mentre se applicati ad una matrice restituiscono un vettore che contiene il massimo o il minimo per colonne degli elementi della matrice max(m)
min(m)
cond() numero di condizionamento in norma 2 cond(m)
eig() autovalori e autovettori [X,D] = eig(m)
ovvero: "la funzione restituisce una matrice diagonale D che contiene gli autovalori di m, e una matrice X le cui colonne ne sono gli autovettori"
matrici quadrate

Generazione di matrici particolari

Concludiamo la panoramica dei comandi sulle matrici segnalando alcuni comandi per generare matrici particolari:

  • eye, genera la matrice identità di ordine assegnato. Ad esempio: eye(3)
  • zeros, genera una matrice nulla di ordine ossegnato, ovvero composta di soli zeri. Ad esempio: zeros(2)
  • ones, genera una matrice di ordine assegnato con tutti gli elementi pari a 1. Ad esempio: ones(5)
  • random, genera una matrice di ordine assegnato composta di numeri casuali
  • hilb, genera la matrice di Hilbert di ordine assegnato
  • vander, genera la matrice di Vandermonde di ordine assegnato

Torna su

Funzioni matematiche

Funzioni predefinite

Abbiamo detto che le espressioni in Matlab possono contenere operatori, nomi di variabili, caratteri speciali e funzioni. Di queste ultime, vediamone alcune tra quelle predefinite:

  • sqrt(x): radice quadrata di x
  • exp(x): e elevato alla x
  • log(x): logaritmo naturale di x
  • log10(x): logaritmo in base 10 di x
  • round(x): arrotondamento
  • fix(x): troncamento
  • sign(x): segno di x, che può valore 1 o -1
  • sin(x) , sinh(x) , asin(x): rispettivamente seno, seno iperbolico e arcseno
  • cos(x) , cosh(x) , acos(x): rispettivamente coseno, coseno iperbolico, e arcoseno
  • tan(x) , tanh(x) , atan(x): rispettivamente tangente, tangente iperbolica e arctangente

Finora abbiamo considerato x numero reale. Per x numero complesso abbiamo inoltre:

  • real(x): parte reale di x
  • imag(x): parte immaginaria di x
  • conj(x): complesso coniugato di x

Funzioni personalizzate

Cosa facciamo se abbiamo una funzione f(x) e vogliamo stamparla a video, calcolarne gli zeri e magari anche derivate e integrali? Consideriamo ad esempio la funzione f(x) = x2 + 3x - 4. Come prima cosa dobbiamo memorizzarla in una variabile sottoforma di stringa di caratteri, ovvero:

>> fun = 'x^2 + 3*x - 4'

fun =

x^2 + 3*x - 4

Per stamparla a video dobbiamo utilizzare il comando fplot(fun,lims);, dove fun è la funzione e lims è l'intervallo (espresso come vettore di due elementi) che vogliamo considerare. In codice:

>> lims = [-10 10];
>> fplot(fun, lims);

Due considerazioni. La prima è che ovviamente nessuno ci obbliga a chiamare le due variabili fun e lims, va bene un nome qualsiasi; la seconda è che volendo avremmo potuto scrivere i parametri funzione e intervallo direttamente all'interno di fplot:

>> fplot('x^2 + 3*x - 4',[-10 10])

Data una funzione f, il suo zero è quel valore ɑ tale che f(ɑ) = 0. Con Matlab è possibile fare un calcolo approssimato degli zeri vicini ad un certo valore x0 utilizzando il comando fzero(fun,x0), dove fun è la solita funzione. Ad esempio provando a cercare gli zeri della nostra funzione nell'intorno di 1 dovrei scrivere:

>> fzero(fun,1)

ans =

     1

Risultato effettivamente verificabile guardando il grafico della funzione.\\ Per trovare tutti gli zeri che cadono in un certo intervallo bisognerà modificare leggermente la chiamata del comando fzero scrivendo fzero(fun,[x0 x1]), dove intuitivamente nel secondo parametro vengono indicati gli estremi dell'intervallo da considerare.

Per il calcolo delle derivate e degli integrali Matlab fa uso del toolbox symbolic, e richiede come prima cosa che la variabile x (o chi per essa) sia dichiarata simbolica, così da non essere valutata. Lo si fa con questo comando:

>>syms x

A questo punto per il calcolo della derivata si usa il comando diff(fun), mentre per l'integrale indefinito il comando int(fun). Se poi mettiamo un certo numero n come secondo parametro del comando diff potremo calcolare la derivata n-esima della funzione. Ad esempio:

>> diff(fun)

ans =

2*x+3

>> diff(fun,2)

ans =

2

>> int(fun)

ans =

1/3*x^3+3/2*x^2-4*x

Concludiamo il discorso sulle funzioni segnalando che con il comando funtool appariranno sull schermo tre finestre: uno che offre una serie di strumenti per manipolare direttamente le funzioni, due per il disegno dei grafici.

Torna su

Salvataggio dei dati

Per salvare dati e variabili su disco bisogna utilizzare la seguente sintassi: save [nomefile].mat [variabili da salvare separate da uno spazio]

Ad esempio se volessi salvare in un file var.mat le variabili e e H esistenti nel mio workspace, dovrei scrivere:

>> save var.mat e H

Se avessi omesso il nome delle variabili da salvare le avrei automaticamente salvate tutte. Il file .mat è in formato binario, ma potrei dire di salvarlo come file di testo utilizzando come ultimo parametro del comando save la stringa -ascii.
Ad esempio:

>> save var.mat e H -ascii

Per ricaricare nel workspace tutte le variabili che abbiamo salvato nel file .mat possiamo invece utilizzare il comando load, con la seguente sintassi: load [nomefile].mat.
Nel nostro caso, per recuperare le variabili in var.mat dovremo scrivere:

>> load var.mat

Torna su

Grafici bidimensionali

Per realizzare il grafico bidimensionale di una funzione f(x) si utilizza il comando plot, che nella sua forma più semplice ha la seguente sintassi: plot(x,y) , dove x rappresenta l'intervallo in cui considerare la funzione e y la funzione stessa.

Ad esempio per ottenere il grafico della funzione coseno tra π e -π, dovremo scrivere:

>> x = [-pi:0.01:pi];
>> y = cos(x);
>> plot(x,y)

Dando l'invio sull'ultimo comando apparirà una nuova finestra col grafico.
E' possibile effettuare la rappresentazione grafica di più funzioni alla volta semplicemente mettendole in coda nel comando plot. Si capisce meglio con un esempio:

>> x = [-pi:0.01:pi];
>> y = cos(x);
>> z = sin(x);
>> plot(x,y,x,z)

Eseguire una seconda volta il comando plot comporterà la sostituzione dell'ultimo grafico ai precedenti, che di conseguenza andranno perduti. Se non vogliamo che ciò accada possiamo adottare due strategie:

  • forzare l'apertura di una nuova finestra con il comando figure(n), dove n è un numero a scelta; i prossimi plot saranno automaticamente riferiti ad essa
  • sovrapporre al grafico preesistente quello nuovo (magari per operare dei confronti) con il comando hold on. Il comando hold off disattiva questa modalità

Il comando plot offre un certo grado di personalizzazione nella realizzazione dei grafici, dando ad esempio la possibilità di scegliere il colore e il tipo di tratteggio delle curva che andrà a disegnare. Queste indicazioni sono passate come parametri del comando subito dopo la coppia di dati x e y. Ad esempio per disegnare la curva del coseno verde e tratteggiata, e quella del seno rossa e a punti linea dovremo scrivere:

>> x = [-pi:0.01:pi];
>> y = cos(x);
>> z = sin(x);
>> plot(x,y,'g--',x,z,'r-.')

L'elenco di tutti questi parametri si può ottenere dall'help del comando plot.

Ai grafici possono essere associati titoli ed etichette degli assi, che si creano rispettivamente con i comandi: title('nome'), xlabel('nomeAscisse') e ylabel('nomeOrdinate').

Concludiamo dicendo che se invece di plot utilizziamo il comando semilogy(x,y) (o semilogx(x,y)), otterremo un grafico in scala logaritmica sull'asse delle ordinate (o ascisse). Intuitivamente col comando loglog(x,y) adotteremo tale scala per entrambi gli assi.

Torna su

Scrivere un programma

M-files

Abbiamo detto nel primo capitolo che Matlab può essere considerato anche linguaggio di programmazione, che attraverso l'uso di strutture sintattiche tradizionali consente di sfruttare le funzioni e gli operatori visti finora per codificare algoritmi di varia complessità.

I programmi vengono scritti nei cosiddetti m-files, chiamati così per la loro estensione .m. Ogni m-files contiene una serie di istruzioni scritte dall'utente, ed è caratterizzato da un nome che dal momento del salvataggio in poi lo identificherà come un comando Matlab a tutti gli effetti. Se quindi creo un programma e lo chiamo "guido", per eseguirlo basterà scrivere guido nel prompt e premere il tasto invio. A questo proposito alcune dovute osservazioni:

  • posso eseguire i miei programmi solo se si trovano nella cartella corrente
  • Matlab ha una precedenza di esecuzione, e in particolare le variabili nel workspace hanno priorità sulle funzioni. Se quindi ho una variabile con lo stesso nome di un m-files, quello che apparirà sullo schermo scrivendo quel nome sarà il contenuto della variabile stessa
  • se ho creato un programma con lo stesso nome di una funzione predefinita di Matlab, richiamandolo si eseguirà il primo bypassando la seconda

Strutture sintattiche

Prima di vedere le principali strutture sintattiche, segnaliamo che per scrivere un commento bisogna iniziare la riga con il carattere di percentuale %.

Strutture condizionali:

if condizione1
  ...
elseif condizione2
  ...
else
  ...
end

Notare che i gruppi di istruzioni non sono racchiusi tra parentesi graffe, ma sono delimitati dalla dichiarazione del blocco e dal comando end. Volendo si può risparmiare di andare a capo usando la virgola, ma poi si perderebbero i vantaggi dell'indentazione.

Cicli controllati da un contatore:

for i = limite1:passo:limite2
...
end

Dove passo è l'incremento da utilizzare tra i due limiti.

Cicli controllati da una condizione

while condizione1
  ...
end

Funzioni

Tutte le variabili definite in un m-file vengono considerate variabili globali, e quindi contribuiscono ad aumentare l'occupazione della memoria. Per far sì che alcune variabili siano considerate locali si creano le cosiddette function (funzioni), nella cui definizione si specificano la lista di parametri di output e di input, entrambi opzionali. Di seguito la forma standard utilizzata:

function [out1, ... , outn] = nome_funzione(in1, ... , inm)
%
% commenti
%
istruzione1
...
istruzionen
% assegnazione valori ai parametri di output
out1 = valore1; 
...
outn = valoren;
return

Notare che il return è opzionale, e che i commenti scritti dopo la prima riga sono quelli che saranno visualizzati richiamando il comando help seguito dal nome del programma stesso.

Facciamo un esempio: creiamo una funzione per il calcolo del numero di condizionamento di una matrice di Hilber di dimensione data.

function [cond_hilb] = condhilb(n)
%
% funzione per il calcolo del numero di condizionamento della matrice di
% hilbert di dimensione n
%
H = hilb(n);
cond_hilb  = cond(H)

return

Che può essere richiamata dalla command window in questo modo:

>> condhilb(3)

cond_hilb =

  524.0568


ans =

  524.0568

Torna su


Programmazione