Sei sulla pagina 1di 20

Strumenti per il calcolo numerico

MATLAB/Octave
Introduzione, input/output, script, strutture di controllo

Informatica B

Matlab
Cos Matlab:
strumento (e corrispondente linguaggio) per elaborazioni di
calcolo numerico
NB: sta per MATrix LABoratory
centrato sulle matrici (ma include generiche funzionalit matematiche)

usato nei successivi corsi di calcolo numerico


MATLAB uno strumento commerciale
distribuito, su licenza NON gratuita, da The MathWorks Inc
Student edition disponibile quando si al Politecnico
(http://www.asi.polimi.it/software/matlab.html)

Esiste un altro strumento di nome Octave


identico nella concezione, molto simile per gli aspetti operativi
disponibile gratuitamente, vedi www.gnu.org/software/octave/

-2-

Caratteristiche del linguaggio di


Matlab/Octave (1)
Linguaggio di alto livello
simile a linguaggi di programmazione C, Java, Pascal
possiede comandi sintetici per effettuare complesse
elaborazioni numeriche
Linguaggio interpretato, comandi e istruzioni
NON tradotti in codice eseguibile dallhardware
MA manipolati da un programma (linterprete) che li analizza ed
esegue azioni da essi descritte

Tutto un array
ci sono casi particolari significativi di array
array 1x1 sono gli scalari
array con una sola riga o colonna sono i vettori
array con due dimensioni sono le matrici
array con >2 dimensioni: matrici multidimensionali

-3-

Caratteristiche del linguaggio di


Matlab/Octave (2)
Linguaggio dinamico
NON occorre dichiarare le variabili
risultano definite dal punto in cui vengono introdotte
e vengono incluse in una struttura detta tabella dei simboli

il tipo delle variabili dinamico


a una variabile si possono assegnare, successivamente, valori
di tipo diverso (scalari, stringhe, vettori, matrici...)

Esempio
a = 10;
b = 20.5;
a+b
a = stringa
a cambia tipo dopo lultimo assegnamento di valore

-4-

Screenshot interfaccia MATLAB


Mostra le variabili nel workspace

Contenuto della
directory corrente

Finestra dei comandi

Storia dei comandi


Lancia i tool di MATLAB ed altro
-5-

Screenshot dellinterfaccia OCTAVE

Linea di comando dellinterprete

-6-

Comandi in Matlab
Matlab accetta comandi che lutente scrive di seguito al
prompt: >>
es. >> a = 10;
Assegna alla variabile a il valore 10
Esempio di alcuni comandi (analizzeremo quelli pi importanti)
Il prompt accetta i comandi del sistema operativo (DOS,
UNIX)
Esempio: in ambiente dos, dir mostra il contenuto della
directory corrente

help richiama la guida in linea


diary pu essere utilizzato per salvare la sessione di lavoro
who, whos e workspace mostrano lelenco delle variabili
definite
save permette di salvare in un file le variabili definite. Load le
ricarica
clear cancella tutte le variabili

-7-

Esempi
Input

Output

Commento

1234/6

ans = 205.67

calcolo di un valore scalare

a=1234/6

a = 205.67

assegnamento alla
risultato di 1234/6

eps

eps =

variabile predefinita: la pi piccola


differenza rappresentabile tra due
numeri

2/5

ans = 0.40000

divisione destra

5/0

ans = Inf

divisione per zero

5^2

ans = 25

potenza

real(4+5j)

ans = 4

real una funzione predefinita che


restituisce la parte reale di un numero
complesso

1+1==2
1+1~=2

ans = 1
ans = 0

1 = vero, 0 = falso, == uguale, ~=


diverso (codice ASCII di ~: 126)

2.2204e-16

-8-

variabile

del

Esempi con gli array


a=[1 2; 3, 4]

a =
1
3

2
4

1
3

2
4

a ora una matrice 2x2, ;


separa
le
righe;
virgola
opzionalmente separa elementi
(ma basta lo spazio)

a =

restituisce
variabile a

x=[-1.3
sqrt(3)
(1+2)/5]

x =
-1.30000 1.73205

x(5)=abs(x(1))

x =
-1.30000 1.73205
1.30000

b=a

c=a+b

x=[-1 0 2]; y=x'

b =
1
2

3
4

c =
2
5

5
8

valore

elementi
possono
espressioni

0.60000
0.60000

il

0.00000

della

essere

Notazione con () per accedere a


elementi di una matrice; abs valore
assoluto; NB: vettore x esteso per
includere nuovo elemento; elementi
non assegnati sono nulli

matrice trasposta (scambiate


righe e colonne)
somma di matrici, elemento per
elemento (sottrazione con -
simile)

y =
-1
0
2

il ; blocca loutput, ma non


impedisce la valutazione
-9-

Altre operazioni con gli array (1)


a = []

a =

array vuoto, convenzionalmente


rappresenta valore nullo

[]
x=1:5

y=0:pi/4:pi

v=10:-4:-3

x =
1

x=[0:pi/100:pi/2]';
[x sin(x)]

y =
0.00000
1.57080
3.14159

operatore : per
vettori di numeri

0.78540
2.35619

operatore : con passo di


incremento e valori non interi
(pi pigreco)

valori negativi del passo e degli


estremi

v =
10

sin(y)

ans =
0.00000
1.00000
0.00000

-2

0.70711
0.70711

ans =
0.00000 0.00000
0.03142 0.03141
......
1.53938 0.99951
1.57080 1.00000
- 10 -

produrre

funzioni predefinite si applicano


ai vettori

produce la tabella di sin(x),


0
x
/2

Altre operazioni con gli array (2)

a = [1 2; 3 4];
a^2

ans =

a = [1 2; 3 4];
a.^2

ans =

Equivalente ad a*a (prodotto tra


matrici)

7 10
15 22

Elevamento a potenza dei singoli


valori della matrice

1 4
9 16

- 11 -

Diagrammi a due dimensioni


Diagramma = insieme di coppie che rappresentano coordinate
di punti
Si usano vettori per contenere sequenze ordinate dei valori di
ognuna delle coordinate
plot(x,y) disegna diagramma cartesiano dei punti che hanno
valori delle ascisse in x, delle ordinate in y
e li congiunge con una linea, per dare continuit al grafico
funzioni xlabel per visualizzare nome asse ascisse, ylabel per
ordinate, title per il titolo
cubica

1000
800

>> x = -10:0.1:10;
>> y=x.^3;
>> plot(x,y);
>> xlabel('ascisse');
>> ylabel('ordinate');
>> title('cubica');

600
400

ordinate

200
0
-200
-400
-600
-800

- 12 -

-1000
-10

-8

-6

-4

-2

0
ascisse

10

Un esempio di cinematica
Due treni partono da due stazioni adiacenti, che
distano 15km, viaggiando a velocit di 50m/s e 30m/s
in direzione opposta
Costruire un grafico che mostra il loro movimento,
fino a quando il pi veloce raggiunge la destinazione
Il pi veloce impiega 15000/50=300s
DistanzaTreno1=50t;
DistanzaTreno2=15000-30t; (per mostrare la
provenienza dalla direzione opposta)

- 13 -

Soluzione

t=0:1:300;
p1=50 * t;
p2=15000 30 * t;
plot(t,p1);
hold on %adesso possibile inserire nuove curve sul grafico
plot(t,p2)
hold off

- 14 -

Risultati ottenuti con lesempio

- 15 -

Istruzioni e ;
Le istruzioni possono essere seguite da ; ma non
obbligatorio
Il ; blocca la visualizzazione del valore delle variabili
coinvolte nellistruzione
Maggiore velocit di esecuzione

Regola di buona programmazione


Inserire sempre il ;, a meno che non si voglia
ispezionare il valore di una variabile a scopo di
debugging

- 16 -

Commenti
Il simbolo di commento pu essere messo in
qualsiasi punto della linea.
MATLAB ignorer tutto quello che viene scritto alla
destra del simbolo %.
Per esempio:
>>% This is a comment.
>>x = 2+3 % So is this.
x=
5

- 17 -

Continuazione di linea
x = [(2+3)/2 (3+4)/3 (5+6)/4]
%equivalente a
x = [(2+3)/2 (3+4)/3
(5+6)/4]

- 18 -

Input/output

Acquisizione dati da tastiera


Funzione input
valore = input(inserisci un valore );

Matlab stampa a video la stringa inserisci un valore


ed aspetta di ricevere un dato
Valore scalare
Array racchiuso tra [ e ]
Stringa racchiusa tra e

Il dato inserito dallutente viene memorizzato nella


variabile valore

- 20 -

Stampa dei risultati (1)


I risultati di unoperazione sono mostrati
immediatamente se non si inserisce il ;
Altri due modi
disp
accetta come parametro un array. Se questo array di
tipo char, lo stampa
viene usato in congiunzione con num2str
Esempio:
str = [il valore di pi e` num2str(pi)];
disp(str);

Stampa: il valore di pi e` 3.1416

- 21 -

Stampa dei risultati (2)


altro modo
fprintf
fprintf(Il valore di pi e` %f \n, pi);
stringhe di formato: %d (interi), %e (formato
esponenziale), %f (virgola mobile), %g (il pi corto tra il
formato esponenziale e quello in virgola mobile)

disp vs. fprintf


disp in grado di stampare anche valori complessi
x=2*(1-2*i)^3;
str=[disp: x = num2str(x)];
disp(str);

disp: x = -22+4i

fprintf ne stampa solo la parte reale


fprintf(fprintf: x = %8.4f\n, x);
- 22 -

fprintf: x = -22.0000

Script in MATLAB

Script (m-file)
Uno script un file di testo contenente una sequenza di
comandi MATLAB
non deve contenere caratteri di formattazione (solo testo puro)
viene salvato con estensione .m

I comandi allinterno di uno script sono eseguiti


sequenzialmente, come se fossero scritti nella finestra dei
comandi
Per eseguire il file si digita il suo nome (senza .m)
I risultati appaiono nella finestra dei comandi (se non usiamo il ; )

- 24 -

Script: caratteristiche principali


Uno script pu
essere ri-eseguito
essere facilmente modificato
essere spedito a qualcuno

Uno script pu operare su qualsiasi variabile definita


prima della sua esecuzione
Pu creare nuove variabili che rimangono disponibili
anche dopo la sua terminazione

- 25 -

Come creare uno script


Pu essere creato utilizzando un qualsiasi editor di
testo
Ricordarsi di salvare il file come solo testo e di dare
lestensione .m
Il file di script deve essere presente nella directory
corrente
o il cammino (path) che identifica la directory in cui si
trova lo script deve essere salvato tra i path di Matlab

Matlab include un editor per creare o modificare


script
Anche gli ambienti grafici sviluppati per Octave
offrono un editor
- 26 -

Nomi degli script

Il nome del file deve cominciare con una lettera e pu


contenere cifre e il carattere underscore, fino a 31 caratteri
Non dare lo stesso nome al file di script e a una variabile
Non chiamare uno script con lo stesso nome di un comando
o funzione MATLAB.
Per verificare se esiste gi qualcosa che ha un certo nome
si pu utilizzare la funzione exist.

- 27 -

Suggerimenti per strutturare e


documentare uno script
1. Sezione dei commenti:
Il nome del programma e una breve descrizione, nella prima riga
La data di creazione e i nomi degli autori nella seconda riga
La definizione dei nomi delle variabili per ogni variabile di input e di
output
Il nome di ogni funzione creata dallutente che viene usata nel
programma (ne parleremo tra qualche lezione)
Il comando help visualizza tutta la sezione dei commenti allinizio dello
script

2. Sezione di Input: inserimento dei dati in input e/o uso di


funzioni di input
3. Sezione di calcolo
4. Sezione di output: uso di funzioni per visualizzare i risultati
del programma
- 28 -

Dati su cui opera uno script file


Usano
variabili gi presenti nel workspace
variabili acquisite da tastiera o file
nuove variabili introdotte nello script

A differenza delle funzioni, non accettano argomenti


dentrata e duscita
Le variabili interne allo script diventano variabili del
workspace
Permangono dopo lesecuzione dello script

- 29 -

Sezione di calcolo
Calcoli matematici
Assegnamenti
Strutture di controllo
Condizioni
Cicli

Comandi per la costruzione di grafici


Chiamate a funzioni

- 30 -

Strutture di controllo

- 31 -

Istruzioni della programmazione strutturata: if e while


Hanno sintassi simile a quella di C, semantica uguale
Vediamo due script che ne fanno uso
%script nel file
%quadWhile.m
quad=[];
k = 1;
while (k <= x)
quad (k) = k*k;
k=k+1;
end;
quad

>> x=3;
>> quadWhile
quad =
1 4 9
>>

%script nel file divisible.m


if (mod (x, 2) == 0)
fprintf ('even\n');
elseif (mod (x, 3) == 0)
fprintf ('divisible by 3\n');
elseif (mod(x,5)==0)
fprintf ('divisible by 5\n');
else
fprintf ('prime or divisible by x>5\n');
end

>>x=15;
>>divisible
divisible by 3

>>x=8;
>>divisible
even

- 32 -

>>x=17;
>> divisible
prime or divisible by x>5

Il costrutto if
if espressione1
istruzione 1-1
istruzione 1-2
..........
elseif espressione2
istruzione 2-1
istruzione 2-2
..........
.....
else
istruzione k-1
istruzione k-2
..........
end

I rami elseif e else non sono obbligatori!

Le istruzioni 1-1 e 1-2 vengono


eseguite solo se vale espressione 1
Le istruzioni 2-1 e 2-2 vengono
eseguite solo se vale espressione 2

Le istruzioni k-1 e k-2 vengono


eseguite solo se non vale nessuna
delle espressioni sopra indicate
33

Il costrutto switch
Listruzione condizionale switch consente una scrittura
alternativa ad if/elseif/else
Qualunque struttura switch pu essere tradotta in un
if/elseif/else equivalente
switch variabile (scalare o stringa)
case valore1
istruzioni caso 1
case valore2
istruzioni caso 2
...
otherwise
istruzioni per i restanti casi
end

34

Il costrutto switch: esempio


Frammento di programma che analizza il valore di
una variabile che rappresenta un giorno della
settimana e indica se si tratta di un giorno lavorativo
o festivo
switch (giorno)
case {lun, mar, mer, gio, ven}
disp(Giorno lavorativo);
case {sab, dom}
disp(Giorno festivo);
otherwise
disp(Errore!);
end

- 35 -

Il ciclo while
while espressione
istruzioni da ripetere finch espressione vera
end
espressione deve essere inizializzata (avere un valore) prima
dellinizio del ciclo
Il valore di espressione deve cambiare nelle ripetizioni
Esempio: Calcoliamo gli interessi fino al raddoppio del capitale
value = 1000;
year = 0;
while value < 2000
value = value * 1.08
year = year + 1;
fprintf('%g years: $%g\n', year,value)
end
36

Il ciclo for
for indice = espressione
istruzioni

end
Esempio leggi 7 numeri e mettili in un vettore di nome number:
for n = 1:7
number(n) = input('enter value ');
end
Esempio - conto alla rovescia in secondi
time = input('how long? ');
for count = time:-1:1
pause(1);
fprintf('%g seconds left \n',count);
end
disp('done');
37

Il ciclo for
Il ciclo for usa un array per assegnare valori alla variabile di
conteggio
Questo array pu essere generato al volo con unespressione
del tipo init:delta:fin
Nel primo esempio del lucido precedente larray [1 2 3 4 5 6 7]

Larray pu anche essere inizializzato con altri meccanismi (si


vedano gli esempi nel lucido seguente)
Se larray una matrice alla variabile di conteggio vengono
assegnate in sequenza le sua colonne

38

Esempi
Inizializzazione dellindice del for a partire da una matrice
board = [ 1 1 1 ; 1 1 -1 ; 0 1 0 ];
1
for x = board
1
x
alla prima iterazione x e` il vettore colonna
0
end
Inizializzazione dellindice del for a partire da una stringa
for x = 'EGR106
disp(x) %alla prima iterazione x vale E
end

39