Sei sulla pagina 1di 39

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 qui http://www.software.polimi.it
!  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 dall’hardware
!  MA manipolati da un programma (l’interprete) 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 l’ultimo 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 dell’interfaccia
OCTAVE

Linea di comando dell’interprete

-6-
Comandi in Matlab

!  Matlab accetta comandi che l’utente 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 l’elenco 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 variabile a del


risultato di 1234/6
eps eps = 2.2204e-16 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 ans = 1 1 = vero, 0 = falso, “==” uguale, “~=”
1+1~=2 ans = 0 diverso (codice ASCII di ‘~’: 126)
-8-
Esempi con gli array
a=[1 2; 3, 4] a = a ora è una matrice 2x2, “;”
1 2 separa le righe; virgola
3 4 opzionalmente separa elementi
(ma basta lo spazio)
a a = restituisce il valore della
1 2 variabile a
3 4
x=[-1.3 sqrt(3) x = elementi possono essere
(1+2)/5] -1.30000 1.73205 0.60000 espressioni
x(5)=abs(x(1)) x = Notazione con () per accedere a
-1.30000 1.73205 0.60000 0.00000 elementi di una matrice; abs valore
assoluto; NB: vettore x esteso per
1.30000
includere nuovo elemento; elementi
non assegnati sono nulli

b=a’ b = matrice trasposta (scambiate


1 3 righe e colonne)
2 4
c=a+b c = somma di matrici, elemento per
2 5 elemento (sottrazione con “-”
5 8 simile)
x=[-1 0 2]; y=x' y = il “;” blocca l’output, ma non
-1 impedisce la valutazione
0
2 -9-
Altre operazioni con gli array (1)
a = [] a = array vuoto, convenzionalmente
[] rappresenta valore nullo
x=1:5 x = operatore “:” per produrre
1 2 3 4 5 vettori di numeri

y=0:pi/4:pi y = operatore “:” con passo di


0.00000 0.78540 incremento e valori non interi
1.57080 2.35619 (pi è pigreco)
3.14159
v=10:-4:-3 v = valori negativi del passo e degli
10 6 2 -2 estremi

sin(y) ans = funzioni predefinite si applicano


0.00000 0.70711 ai vettori
1.00000 0.70711
0.00000
x=[0:pi/100:pi/2]'; ans = produce la tabella di sin(x),
[x sin(x)] 0.00000 0.00000 0≤x≤π/2
0.03142 0.03141
......
1.53938 0.99951
1.57080 1.00000
- 10 -
Altre operazioni con gli array (2)

a = [1 2; 3 4]; ans = Equivalente ad a*a (prodotto tra


a^2 7 10 matrici)
15 22
a = [1 2; 3 4]; ans = Elevamento a potenza dei singoli
a.^2 1 4 valori della matrice
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 1000
cubica

800

>> x = -10:0.1:10; 600

>> y=x.^3; 400

>> plot(x,y); 200

ordinate
>> xlabel('ascisse'); 0

>> ylabel('ordinate'); -200

>> title('cubica'); -400

-600

-800

- 12 - -1000
-10 -8 -6 -4 -2 0 2 4 6 8 10
ascisse
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=50·t;
!  DistanzaTreno2=15000-30·t; (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 l’esempio

- 15 -
Istruzioni e ‘;’

!  Le istruzioni possono essere seguite da ‘;’ ma non è


obbligatorio
!  Il ‘;’ blocca la visualizzazione del valore delle
variabili coinvolte nell’istruzione
!  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 dall’utente viene memorizzato nella
variabile valore

- 20 -
Stampa dei risultati (1)

!  I risultati di un’operazione 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); fprintf: x =
-22.0000
- 22 -
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 all’interno 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
l’estensione .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 dall’utente che viene usata nel
programma (ne parleremo tra qualche lezione)
!  Il comando help visualizza tutta la sezione dei commenti all’inizio 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
d’entrata e d’uscita

!  Le variabili interne allo script diventano variabili del


workspace
!  Permangono dopo l’esecuzione 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 %script nel file divisible.m


%quadWhile.m if (mod (x, 2) == 0)
quad=[]; fprintf ('even\n');
k = 1; elseif (mod (x, 3) == 0)
while (k <= x) fprintf ('divisible by 3\n');
quad (k) = k*k; elseif (mod(x,5)==0)
k=k+1; fprintf ('divisible by 5\n');
end; else
quad fprintf ('prime or divisible by x>5\n');
end

>> x=3;
>> quadWhile
>>x=15; >>x=8; >>x=17;
quad = >>divisible >>divisible
1 4 9 >> divisible
divisible by 3 even prime or divisible by x>5
>>

- 32 -
Il costrutto if

if espressione1 I rami elseif e else non sono obbligatori!


istruzione 1-1
istruzione 1-2
..........
elseif espressione2 Le istruzioni 1-1 e 1-2 vengono
istruzione 2-1 eseguite solo se vale espressione 1
istruzione 2-2 Le istruzioni 2-1 e 2-2 vengono
.......... eseguite solo se vale espressione 2
.....
else
istruzione k-1 Le istruzioni k-1 e k-2 vengono
istruzione k-2 eseguite solo se non vale nessuna
.......... delle espressioni sopra indicate
end
33
Il costrutto switch

!  L’istruzione 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
dell’inizio 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
un’espressione del tipo “init:delta:fin”
!  Nel primo esempio del lucido precedente l’array è [1 2 3 4 5 6 7]
!  L’array può anche essere inizializzato con altri meccanismi (si
vedano gli esempi nel lucido seguente)
!  Se l’array è una matrice alla variabile di conteggio vengono
assegnate in sequenza le sua colonne

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

39