Sei sulla pagina 1di 31

SYLL.

1: Introduzione alluso di Matlab


http://mox.polimi.it

MO X

SYLL.1: Introduzione alluso di Matlab p. 1/3

Contenuti della lezione

Per iniziare a usare Matlab ...


Assegnazione di variabili scalari e vettoriali
Manipolazione di vettori e matrici
Operazioni elemento per elemento
Grafici in due dimensioni spaziali
Definizione di funzioni simboliche
Grafici in tre dimensioni spaziali
Elementi di programmazione
M-files: scripts e functions

SYLL.1 p. 2/3

Riferimenti bibliografici
1. P. Causin, S. Micheletti, R. Sacco, Introduzione alluso di Matlab per il
Calcolo Scientifico, (2000), disponibile sul sito
www1.mate.polimi.it/CN.
2. Tutorial disponibili sul sito www.mathworks.com alla voce Prodotti.
3. Programmi dai testi:
A. Quarteroni, R. Sacco, F. Saleri, Matematica Numerica ,
Seconda Edizione, Springer-Italia, Milano, 2004.
A. Quarteroni, F. Saleri, Introduzione al Calcolo Scientifico ,
Springer-Italia, Milano, 2003.
4. Tutorials e programmi disponibili presso i siti di numerose Facolt
italiane e straniere.

SYLL.1 p. 3/3

Per iniziare...
Matlab (Matrix Laboratory) un ambiente di calcolo sviluppato a partire dagli
anni 70. La struttura di base la matrice, per la quale sono gi predefinite
numerosi tipi elementari (matrice identit, matrice nulla, matrice unit...),
funzioni algebriche e di manipolazione (somma, prodotto, calcolo del
determinante).
1. Per lanciare Matlab da ambiente Windows basta cliccare con il mouse
sullicona corrispondente;



2. in ambiente Unix, digitare il comando matlab e quindi dare il comando


di invio (indicato nel seguito con ).
Allavvio viene aperta una finestra (spazio di lavoro) nella quale possibile
digitare comandi dal prompt >>
Per entrare in confidenza con lambiente di lavoro utile:
1. lanciare il comando demo che illustra le potenzialit del software
attraverso significativi esempi numerici e casi test;
2. fare costante riferimento alluso dellhelp, ad esempio help sqrt
(calcolo della radice quadrata di un numero).

SYLL.1 p. 4/3

Prime istruzioni in Matlab




Il modo pi immediato per interagire con Matlab: scrivere listruzione dal


prompt seguita da
Esempio: assegnazione del valore 3 alla variabile a:
>> a = 3
a =
3
Possiamo usare Matlab come una semplice calcolatrice:
>> b= a*2
b =
6
o, come vedremo, come un vero e proprio ambiente di programmazione.
Invece di digitare tutte i comandi al prompt, possiamo memorizzare una serie
di istruzioni successive (script) sotto formato di file di testo, detto M-file e
caratterizzato da estensione .m. A questo scopo possiamo utilizzare lEditor di
testo integrato.
Per uscire da Matlab: comando quit.

SYLL.1 p. 5/3

Alcuni trucchi per risparmiare tempo



1. Durante la sessione di lavoro possibile richiamare i comandi


;
precedentemente digitati utilizzando i tasti

2. immettendo i primi caratteri di unistruzione gi digitata e poi premendo


il tasto , viene completata la riga con lultima istruzione che inizia con
quegli stessi caratteri;

e
permettono di riposizionare sulla linea di comando il
3. i tasti
cursore e di modificare il testo scritto;
4. con il tasto sinistro del mouse sulla finestra di calcolo si possono
selezionare parti di testo che poi possibile copiare, tagliare ed
incollare sulla linea di comando.

SYLL.1 p. 6/3

Come salvare il proprio lavoro


1. per salvare una cronaca della sessione di lavoro si deve eseguire
allinizio della sessione stessa il comando diary nomefile.txt. Il
file di testo NON permette di recuperare il contenuto delle variabili;
2. per conservare il contenuto delle variabili si deve invece salvare tutta
larea di memoria (o parte di essa) con il comando save. Ad esempio:
>>
>>
>>
>>
>>

x = 1;
a = 3;
z = sqrt(a)-x;
save areawork
save xzarea x z

I file prodotti (binari) hanno estensione .mat. Per ricaricarli nello spazio
di lavoro usiamo il comando load:
>> load areawork
>> load xzarea

SYLL.1 p. 7/3

Qualche informazione ulteriore sulle variabili in Matlab


In Matlab tutte le variabili sono in doppia precisione, ovvero sono
rappresentate internamente con 64 bit, cui corrispondono 16 cifre significative
decimali.
Quando assegnamo un valore ad variabile, Matlab risponde con uneco:
>> s = 10
s =
10
Per sopprimere leco, usiamo la sintassi ;
>> s=10;
Possiamo conoscere le variabili presenti in memoria con il comando whos:
>> whos
Name
Size
Bytes Class
s
1x1
8 double array
Quando non assegnamo il valore di unoperazione ad una variabile, Matlab
assegna tale valore alla variabile ans (che viene cos` ogni volta sovrascritta):
>> 32
ans = 9

SYLL.1 p. 8/3

Unosservazione sulla precisione di calcolo


Tutti i calcoli vengono effettuati in doppia precisione, mentre diversa la
visualizzazione delle variabili che viene determinata con il comando format:
format short: virgola fissa con 5 cifre ( il formato di default):
>> pi
ans =
3.1416
format long: virgola fissa con 15 cifre:
>> pi
ans =
3.14159265358979
format short e: virgola mobile con 5 cifre:
>> pi
ans =
3.1416e+00
format long e: virgola mobile con 15 cifre:
>> pi
ans =
3.141592653589793e+00

SYLL.1 p. 9/3

Definizione di vettori (I)


Modalit pi semplice: elencare le singole componenti del vettore fra una
coppia di parentesi quadre, si ottiene cos` un vettore riga:
>> b = [1 2 3 4]
>> whos
Name
Size
Bytes Class
b
1x4
32 double array
Lo stesso risultato si ottiene separando le componenti con il carattere ,.
Separando invece le componenti con il carattere ; si ottiene un vettore
colonna:
>> b = [1; 2; 3; 4]
b =
1
2
3
4
>> whos
Name
b

Size
4x1

Bytes

Class
32 double array

SYLL.1 p. 10/3

Definizione di vettori (II)


In alcuni casi possiamo essere pi rapidi, usando la sintassi
inizio:incremento:fine:
>> b = [1:10]
b =
1
2

>> b = [1:2:10]
b =
1
3
5

>> b = [10:-3:0]
b =
10
7
4

>> b = [1:1.5:10]
b =
1.0000
2.5000

4.0000

5.5000

7.0000

10

8.5000

10.0000

SYLL.1 p. 11/3

Definizione di matrici
La costruzione delle matrici segue una sintassi simile al caso dei vettori:
>> M = [1 2; 3 4]
M =
1
2
3
4
definisce una matrice quadrata di ordine 2. Osserviamo che:
1. una matrice non altro che una collezione di vettori riga ovvero colonna;
2. in tutte le righe, il numero di componenti deve essere lo stesso! Ad
esempio:
>> M = [1 2; 3 4 5]
??? = [1 2; 3 4 5]
All rows in the bracketed expression must have the same
number of columns.

SYLL.1 p. 12/3

Manipolazione di vettori e matrici


Definiamo:
>> b = [1:10]
Per accedere agli elementi di b:
>> a=b(5)
a =
5
>> c=b(1:3)
c =
1
2

>> b([1:2,6,9:10])
ans =
1
2
6
Transposizione di un vettore:
>> bt = b
>> size(bt)
>> bt
4x1

10

32

double array

SYLL.1 p. 13/3

Manipolazione di vettori e matrici (II)


Definiamo la matrice >> M = [1:5; 6:10; 11:15; 16:20]
Per accedere agli elementi di M
>> M(2,3)
ans =
8
Estrazione di una riga della matrice:
>> M(1,:)
ans =
1
2
3
4
5
Estrazione di una colonna della matrice:
>> M(:,3)
ans =
3
8
13
18
Estrazione di pi righe e colonne:
>> M(2:4,1:2:5)

SYLL.1 p. 14/3

Determinanti dei minori principali di una matrice


>> format rat
>> a = hilb(4)
a =
1
1/2
1/3
1/4
>>
>>
>>
>>

m1
m2
m3
m4

=
=
=
=

1/2
1/3
1/4
1/5

a(1,1);
a(1:2,1:2);
a(1:3,1:3);
a(1:4,1:4);

dm1
dm2
dm3
dm4

1/3
1/4
1/5
1/6
=
=
=
=

1/4
1/5
1/6
1/7

det(m1);
det(m2);
det(m3);
det(m4);

SYLL.1 p. 15/3

Operazioni fra vettori


tra

In Matlab sono definite le operazioni di somma + e sottrazione


vettori. Tali operazioni agiscono elemento per elemento:
>> b = 1:4;
>> c = 2:5;
>> b+c
ans =
3
5
7
>> c - b
ans =
1
1
1
>> b*c
ans =
40
>> b*c
ans =
2
3
4
4
6
8
6
9
12
8
12
16
Avvertenza: i vettori devono avere dimensioni compatibili!

9
1

5
10
15
20

SYLL.1 p. 16/3

Uso della sintassi


Matlab estende le propriet delle operazioni tipo somma e sottrazione anche
ad altre operazioni, fra cui moltiplicazione e elevamento a potenza.
Il vincolo che i due vettori operandi abbiano lo stesso numero di componenti
riga e colonna.
Ad esempio:
>> a = 1:3;
>> b = a;
>> a.*b
ans =
1
4
>> a.b
ans =

1
4
27
Se le dimensioni non sono compatibili:
>> c= [1 2];
>> a.*c
Matrix dimensions must agree

SYLL.1 p. 17/3

Operazioni fra matrici


Somma e sottrazione di matrici:
>> A = [ 1 2 3; 4 5 6; 7 8 9];
>> B = [ 1 1 1; 2 2 2; 3 3 3];
>> A+B
ans =
2
3
4
6
7
8
10
11
12
>> A-B
ans =
0
1
2
2
3
4
4
5
6
Prodotto tra matrici (prodotto righe per colonne):
>> A*B
ans =
14
14
14
32
32
32
50
50
50
Inversa di una matrice inv(A).

SYLL.1 p. 18/3

Funzioni intrinseche definite per vettori e matrici


Principali funzioni built-in che permettono di manipolare o agire su vettori e
matrici:

eye(n) costruisce la matrice identit di ordine , cio la matrice che ha


elementi 1 sulla diagonale principale e 0 altrove;

ones(m,n) (zeros(m,n)) costruisce una matrice o un vettore di


dimensione
i cui elementi sono tutti 1 (0).
Definiamo ora >> M = [1 2 4; 4 5 6; 7 8 9];
della matrice M:

size(M) fornisce le dimensioni


>> size(M)
ans =
3
3

tril(M) (triu(M)) costruisce la matrice triangolare inferiore


(superiore) estratta da M:
>> tril(M)
ans =
1
4
7

0
5
8

0
0
9

SYLL.1 p. 19/3

Risoluzione di un sistema lineare con la fattorizzazione LU

>>
>>
>>
>>
>>
>>
>>
>>

A=hilb(12);
b=A*ones(12,1);
[L,U,P]=lu(A);
y=L\(P*b);
x=U\y;
format long e
norm(x-ones(12,1))
cond(A)

Si noti la scarsa accuratezza del risultato, a causa dellelevato


malcondizionamento della matrice di Hilbert.

SYLL.1 p. 20/3



 


Tracciamo nel piano


il grafico di una funzione
per
utilizzando il comando plot nella sua forma pi elementare:
>> x=0:pi/100:2*pi;
>> y=sin(x);
>> plot(x,y);
>> grid
Il comando grid traccia sul grafico una griglia di riferimento.

Grafici in due dimensioni (I)

1
0.8
0.6
0.4
0.2
0
0.2
0.4
0.6
0.8
1

SYLL.1 p. 21/3

Grafici in due dimensioni (II)


possibile rappresentare nello stesso grafico pi di una curva che possiamo
contrassegnare con colori differenti:
>> y1=sin(x);
>> y2=sin(2*x);
>> y3=sin(3*x);
>> plot(x,y1,b,x,y2,y,x,y3,r)
1
0.8
0.6
0.4
0.2
0
0.2
0.4
0.6
0.8
1

SYLL.1 p. 22/3

Grafici in due dimensioni (III)


Per rappresentare la curva per punti discreti procediamo nel modo seguente:
>> x=0:0.1:2*pi;
>> y=sin(x);
>> plot(x,y,*)
1
0.8
0.6
0.4
0.2
0
0.2
0.4
0.6
0.8
1

SYLL.1 p. 23/3

Funzioni simboliche




Talvolta utile definire una funzione in modo simbolico, ovvero definire


semplicemente lespressione matematica della funzione
senza che
ad essa vengano associati dei valori numerici.
In questo caso si dice la funzione definita come stringa e la sua espressione
deve essere racchiusa fra apici. Ad esempio:
>> fun=(exp(x)-exp(-x))./(exp(x)+exp(-x))
fun =
(exp(x)-exp(-x))./(exp(x)+exp(-x))
Nota. Si osservi attentamente luso delle operazioni elemento per elemento.








 

Per tracciare il grafico della funzione per valori di


con passo
utilizziamo il comando eval che valuta la funzione simbolica
nelle ascisse specificate dal vettore x:
>> x=-5:0.01:5;
>> plot(x,eval(fun))
>> grid
>> title(Tangente iperbolica);
Nota. Esiste naturalmente anche il comando tanh!

SYLL.1 p. 24/3

Rappresentazione di superfici in tre dimensioni






"

utilizzando la griglia di



Usiamo surf per disegnare la funzione


base generata con le matrici
ed :
>> Z = X.* exp(-(X.2 +Y.2));
>> surf(X,Y,Z); >> colormap(hsv);

# &%$
)('
* ,+'

  

Rappresentiamo il grafico della funzione di due variabili


.
A partire dai vettori e generiamo con meshgrid una griglia di base
costituita dalla matrici X e Y che individuano tutti i nodi di coordinate
>> x=-2:.2:2; y=-2:.2:2; [X,Y]=meshgrid(x,y);

0.5

0.5
2
2

1
1

1
2

SYLL.1 p. 25/3

Elementi di programmazione (I): ciclo for


Listruzione for ripete per un determinato numero di volte un blocco di
istruzioni. La forma generale dellistruzione for la seguente:
for indice=start:step:end % valore di default step=1
blocco istruzioni
end
Le parole chiave for e end obbligatoriamente iniziano e terminano il ciclo.
Esempio. Stampa di tutti i numeri dispari da 1 a 50:
for i=1:2:50
disp(i)
end
Osserviamo infine che possibile annidare pi cicli for. Ad esempio per
riprodurre il comportamento della built-in function hilb possiamo scrivere:
for i=1:n
for j=1:n
a(i,j)=1/(i+j-1);
end
end
sempre utile indentare opportunamente le righe di codice per rendere il
listato pi facilmente comprensibile.

SYLL.1 p. 26/3

Elementi di programmazione (II): ciclo while

Listruzione while esegue un blocco di istruzioni un numero indefinito di volte


fino al persistere di una certa condizione. Non quindi noto a priori il numero
di ripetizioni del blocco di istruzioni. La sintassi generale :
>> while (condizione)
>>
blocco istruzioni
>> end
Le parole chiave while e end obbligatoriamente iniziano e terminano il ciclo.
Esempio. Calcolo del massimo valore intero tale che il suo fattoriale sia
minore di 1e10:
>> n=1;
>> while (prod(1:n)<1e10) % prod(1:n) restituisce n!
n=n+1;
end
>> disp(n)
Nota. Qualora, a causa di un errore di programmazione, il programma dovesse
ripetere un numero infinito di volte il blocco di istruzioni perch la condizione di
persistenza sempre verificata, possibile interrompere lesecuzione del
programma premendo contemporaneamente i tasti Ctrl+C.

SYLL.1 p. 27/3

Elementi di programmazione (III): istruzione if


Listruzione if controlla lesecuzione di un determinato blocco di codice a
seconda del valore (vero o falso) assunto da una certa espressione logica. La
forma generale dellistruzione if la seguente:
>> if(condizione1)
>>
blocco1
>> elseif (condizione2)
>>
blocco2
>> else
>>
blocco3
>> end
Esempio. Scriviamo un codice per il calcolo del fattoriale di un generico
numero n:
n=input(Numero di cui calcolare il fattoriale >> );
if n<0
disp(n negativo)
elseif n==0 % == operatore confronto di uguaglianza
fattoriale=1
else
fattoriale=prod(1:n)
end

SYLL.1 p. 28/3

M-files
I files che contengono codice Matlab sono detti M-files (estensione .m). Essi
possono essere richiamati dal prompt digitandone semplicemente il nome.
Gli M-files si dividono in due categorie:
M-files di tipo scripts: si tratta semplicemente di files che raccolgono in
successione istruzioni come date dalla linea di comando;

M-files di tipo functions che


accettano argomenti in ingresso e possono restituire argomenti in
uscita;
possiedono variabili interne che hanno visibilit locale.
Lintestazione di ciascuna function, che deve comparire nella prima riga del file
corrispondente (in questo esempio nomefunction.m), ha la struttura:
function [out1,out2,...,outn]=nomefunction(in1, in2, ..., inn)
Le variabili out1,out2,...,outn sono i parametri in uscita, mentre la
variabili in1, in2, ..., inn sono i parametri in ingresso. Si noti la parola
chiave function allinizio della riga.

SYLL.1 p. 29/3

Esempio di function (I)


Scriviamo una function che costruisce la matrice di Hilbert di ordine n e ne
calcola i determinanti dei minori principali:
function [mat,detminori]=mathilb(n)
%
% [mat,detminori]=mathilb(n)
% mathilb: costruisce la matrice di Hilbert di ordine n
% e ne calcola i determinanti dei minori principali
%
% Argomenti in ingresso
% n: ordine della matrice
%
% Argomenti in uscita
% mat: matrice di Hilbert di ordine n
% detminori: vettore determinanti dei minori principali
%
mat=hilb(n);
for i=1:n
detminori(i)=det(mat(1:i,1:i));
end

SYLL.1 p. 30/3

Esempio di function (II)


La parte di testo preceduta dal carattere % una parte di commento che
pu essere richiamata con il comando help nomefunction, ovvero
nel nostro caso con help mathilb; buono stile di programmazione
aggiungere sempre dei commenti;
per eseguire dal prompt di Matlab la funzione mathilb (con n=5, ad
esempio) digitiamo listruzione:
>> [a,determinanti]=mathilb(5);
Osserviamo che le variabili proprie alla function accessibili dallo spazio
di lavoro sono esclusivamente quelle designate come parametri in
uscita, ovvero in questo caso [a,determinanti].
Le variabili interne alla function, ad esempio i, rimangono invisibili al di
fuori di essa e, una volta terminata la function, ne viene perso il
contenuto.

SYLL.1 p. 31/3