Sei sulla pagina 1di 28

Note sul programma MATLAB

Luigi Palopoli - RETIS LAB, Scuola Superiore Sant’Anna

18 ottobre 2000
Indice

1 Elementi Fondamentali 1
1.1 Cosa è MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Come avviare MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Immissione di dati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3.1 Ingresso da tastiera . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3.2 Caricamento e salvataggio dati su file . . . . . . . . . . . . . . . . 4
1.4 Comandi utili . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2 Semplici operazioni sulle matrici 6


2.1 Accesso agli elementi di una matrice . . . . . . . . . . . . . . . . . . . . . 6
2.2 Utilizzo dell’operatore “:” . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 Manipolazione di matrici . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

3 Operazioni 10
3.1 Calcoli Elementari . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.2 Variabili predefinite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.3 Funzioni elementari e trascendenti . . . . . . . . . . . . . . . . . . . . . . 12
3.4 Funzioni su matrici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.4.1 Funzioni di algebra lineare . . . . . . . . . . . . . . . . . . . . . . 14
3.4.2 Funzioni di ordinamento . . . . . . . . . . . . . . . . . . . . . . . 15
3.5 Operazioni Logiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

4 Programmare in Matlab 20
4.1 Strutture di Programmazione . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.1.1 Sequenze di comandi . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.1.2 Istruzione di selezione . . . . . . . . . . . . . . . . . . . . . . . . 21
4.1.3 Istruzioni iterative . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.2 Funzioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

i
Capitolo 1

Elementi Fondamentali

1.1 Cosa è MATLAB


MATLAB è un linguaggio ad alte prestazioni per elaborazioni di tipo tecnico. Integra al
suo interno la posibilità di effettuare calcoli, visualizzarli sia in forma grafica che testuale,
salvarli e riprenderli da disco. In più è possibile estendere le potenzialità dell’ambiente
aggiungendo nuove funzioni e programmi, scritti in MATLAB o in C. Il punto di forza
consiste nella possibilità di usare una notazione molto familiare, vicina a quella matematica
standard.
Il termine MATLAB sta per Matrix Laboratory, cioè laboratorio di matrici; il programma
nacque per fornire un’interfaccia semplice ai più diffusi pacchetti per il trattamento numeri-
co di matrici, in particolare LINPACK ed EISPACK, che sono scritti in prevalenza in fortran.
Gli oggetti fondamentali attorno a cui ruotano tutte le operazioni MATLAB sono le matrici.
Dal punto di vista informatico si direbbe che l’unico tipo di dato trattato dal linguaggio sono
gli array. Contrariamente a quanto succede per il linguaggio C, tali array non sono dimensio-
nati a priori ma le loro dimensioni possono crescere e decrescere all’occorrenza. La forza di
MATLAB è consistita nel fatto che moltissimi ricercatori universitari lo hanno adottato come
linguaggio di riferimento, sviluppando programmi ed estensioni. Di conseguenza l’utilizza-
tore di MATLAB dispone di una libreria molto vasta di funzioni per affrontare, senza sforzo
eccessivo, una quantità di problemi che richiederebbero, invece moltissimo lavoro se affron-
tati con un linguaggio tradizionale. Alcuni di tali programmi sono stati raccolti in tool-box
che vengono venduti separatamente e sono indirizzati alle esigenze di campi specifici.
MATLAB è un programma commerciale. Esiste tuttavia un programma largamente com-
patibile, denominato OCTAVE, che viene distribuito sul sistema LINUX, ma che è adatta-
bile, con un pó di fatica, anche a Windows utilizzando la libreria gnu-win32. Informazioni
possono essere trovate sul sito:
www.che.wisc.edu/octave

1
1.2. COME AVVIARE MATLAB

1.2 Come avviare MATLAB


In questo paragrafo vedremo come avviare MATLAB. La procedura è semplicissima e di-
pende dal sistema operativo in uso.

nel caso si disponga di windows o del Macintosh, basta cliccare due volte sull’icona
del matlab.

da un sistema Unix o da dos, ad esempio dall’interfaccia dos di Windows, basta


scrivere: matlab.

Una volta avviato il programma compare il prompt che ci richiede i comandi. Per uscire
basta scrivere quit. Su windows è anche possibile scegliere uscita dal menu file o premere
ALT + F4.

1.3 Immissione di dati


Come già detto in MATLAB tutto è una matrice. Uno scalare viene considerato come una
matrice 1 x 1, una riga è una matrice n x 1, ecc. Le matrici possono essere immesse in quattro
modi diversi

1. da tastiera, come lista di elementi;

2. da file esterni di dati;

3. come risultato dell’invocazione di funzioni interne del matlab (esempio inversa di una
matrice);

4. come risultato dell’invocazione di funzioni generate dall’utente.

In questa sezione ci soffermeremo sulle prime due modalità.

1.3.1 Ingresso da tastiera


 
Nel seguito indicheremo con Enter l’operazione conseguente all’utilizzo del tasto Enter
che consente di andare a capo. Il modo di immettere uno scalare è ovvio; ad esempio:

A = -4
 Enter 
comporterà la creazione di una variabile scalare inizializzata al valore -4.
Per rimuovere dalla memoria tale variabile basterà dare il comando clear A. Volendo
immettere un vettore riga basterà immettere i dati che lo compongono separandoli con spazi
o con “,’.

Esempio 1 Il vettore riga  


 potrà essere immesso con una delle due seguenti
sintassi;

2
1.3. IMMISSIONE DI DATI

R = [1 0 -4 3] Enter
  
oppure R = [1, 0, -4, 3] Enter 
 
Quando si immette una matrice occorre potere andare a capo; ciò viene realizzato andando
con il carattere “;” o andando a capo con Enter .
Esempio 2 Supponiamo di voler immettere l’identità di ordine 3. Questo può essere fatto
con una la sintassi seguente:
A = [1, 0, 0; 0, 1, 0; 0, 0, 1]
o equivalentemente:
 

A = [1, 0, 0 Enter

0, 1, 0 Enter
0, 0, 1] Enter
 
Naturalmente i dati di ciascuna riga possono anche essere separati da spazi anzichè da “,”.
Utilissimo è l’operatore di trasposizione, realizzato con il carattere ’ (apice).
Esempio 3 Immettendo l’assegnamento:
A = [1;2;-1]’

   
si ottiene di memorizzare in A la colonna:

    

In tutte gli assegnamenti mostrati fino ad ora, il risultato viene comunque mostrato sullo
schermo. Cio’ puo’ essere tediose l’array e’ molto lungo (ad esempio 500x500). Per evitare
di mostrare sullo schermo il risultato di un asegnamento o piu’ in generale della valutazione
di un’espressione, occorre concludere l’espressione con “;”.
Esempio 4 La funzione predefinita eye(n) restituisce la matrice identità di dimensioni
uguali al parametro n. Per porre la matrice A uguale all’identità di ordine 500, senza

visualizzare il risultato, basterà scrivere:
A = eye(500); Enter 
Per scrivere un vettore riga molto lungo è possibile utilizzare i tre punti per andare a
capo:
Esempio 5 Il vettore:
A = [1 4 5 6 7 8 12 11 343 10] Enter
 
può anche essere immesso come:
 

A = [1 4 5 6 7 8 12 ... Enter
11 343 10] Enter 
3
1.4. COMANDI UTILI

1.3.2 Caricamento e salvataggio dati su file


I dati di una matrice possono essere anche immessi prelevandoli da un file ascii(testuale),
prodotto da un altro programma o editato a mano (ad esempio tramite il wordpad di windo-
ws). Il caricamento avviene con il comando:
load NomeFile.Estensione e produce come risultato di creare una matrice denominata
“NomeFile” con i dat prelevati dal file.

Esempio 6 Supponiamo di aver creato il file “IDEN.DAT” contenente i seguenti dati:

1 0 0
0 1 0
0 0 1

eseguendo:
load iden.dat

verrà creata una variabile di nome “iden” uguale alla matrice identità di ordine tre.

Il MATLABdispoone di un set di comandi per salvare e prelevare matrici. La sintassi è


la seguente:
save nomeFile Var1 Var2 ...Varn
Dualmente il comando: load nomeFile caricherà nuovamente in memoria le variabili sal-
vate nel file.

Esempio 7 Supponendo di voler salvare le variabili A e B nel file varAB occorre dare il
comando:
save varAB A B

I comandi save e load operano sui file in formato binario contraddistinti dall’estensione
“mat”. Per ottenere file testo eventualmente leggibili da altri programmi occorre utilizzare
l’opzione “-ascii”. L’esempio precedente, volendo ottenere un file testo, diviene:
save -ascii varAB A B.

1.4 Comandi utili


Utilissimo, nell’utilizzo di MATLAB, è il comand help. L’utilizzo più tipico è:
help nomeFunzione
che restituisce le informazioni sulla funzione richiesta. La cosa importante è che anche
le funzioni scritte dall’utente possono essere documentate con facilità, come vedremo in
seguito. Se si da il comando senza argomenti, vengono presentate una serie di possibili
argomenti. Scegliendone uno e riscrivendo: help nomeArgomento viene restituita una lista
di funzioni in qualche modo collegate all’argomento.

4
1.4. COMANDI UTILI

Esempio 8 Se si vuole conoscere il significato della funzione sin basta digitare help
sin. Se si batte invece help elfun viene presentata una lista di funzioni matematica
elementari.

Una caratteristica molto comoda è di poter utilizzare i tasti cursore, freccia in lato e
freccia in basso, per riguardare ed eventualmente reimpostare i comandi dati. scrivendo
lettere prima di battere i tasti cursore è eventualmente possibile rivedere tutti i comandi dati
che iniziano per quelle lettere.
Il comando clc consente di cancellare il contenuto dello schermo.
Esistono poi una serie di comandi simili al DOS utili per la gestione di programmi e fun-
zioni. cd consente di cambiare la directory di lavoro corrente. type nomeFile stampa il
contenuto di nomeFile.M e dir elenca i file presenti nella directory attuale. Molto utile è il
comando path che elenca le directory nelle quali verranno cercate funzioni e programmi.
Molto utili sono, infine, i comandi who e whos che forniscono rispettivamente un elenco
delle variabili utilizzate e delle variabili utilizzate con la relativa dimensione.

5
Capitolo 2

Semplici operazioni sulle matrici

In questo capitolo vedremo una prima rassegna di esempi su come si opera con le matrici.
Possono essere utili, nel seguito, tre funzioni per la creazione automatica di matrici:
eye(m,n) crea una matrice a m righe ed n colonne che ha 1 sulla diagonale principale e
zero altrove.
zeros(m,n) crea una matrice fatta di m righe ed n colonne i cui elementi sono tutti uguali
a zero.
ones(m,n) crea una matrice di m righe ed n colonne i cui elementi sono ovviamenti tutti
uguali a 1.
diag tale funzione ha due modalità di funzionamento. Se l’elemento che si passa come
parametro è un vettore, si crea una matrice diagonale avente sulla diagonale gli ele-
menti del vettore. Se, viceversa, l’argomento è una matrice, viene restituita un vettore
avente come elementi la diagonale della matrice.

2.1 Accesso agli elementi di una matrice


Nel capitolo precedente abbiamo visto come una matrice possa essere inserita. L’accesso
agli elementi di una matrice è piuttosto semplice. Ad esempio t = B(1,3) metterà in t
il valore dell’elemento posta alla terza colonna nella prima riga. Le matrici non hanno un
dimensionamento prefissato. È dunque possibile estendere una matrice inserendo un nuovo
elemento in una posizione arbitraria; tutti i nuovi elementi che dovessero essere creati in
conseguenza di questa operazione vengono posti a 0. Viceversa non è possibile accedere ad
elementi non ancora creati.
Esempio 9 Supponiamo che sia:
a = [1 0]
  
se si pone: a(2,2) = 1 Enter si ottiene:



!
6
2.2. UTILIZZO DELL’OPERATORE “:”

dando a questo punto il comando p = a(3,3) si ottiene un errore di accesso.


Il comando size(Matrice) restituisce un vettore di [m, n] dove m contiene il numero
di righe ed n il numero di colonne. Le matrici possono essere cmposte insieme a formarne
altre più grandi, purchè le dimensioni siano compatibili.

"
Esempio 10 Sia A = [1 2; -2 0], B = [0 9;-2 3]. Ponendo C = [A zeros(2,2);
eye(2) B] si ottiene:   

 


  

 # 

 
Può essere importante sapere che la variabile di sistema ans contiene sempre il risultato
dell’ultima operazione effettuata.

2.2 Utilizzo dell’operatore “:”


Un operatore utilissimo è rappresentato da “:”. Scrivere a:b produce un vettore riga conte-
nente tutti i numeri da a a b spaziati di uno. Se si vuole stabilire uno step diverso da uno per
la separazione dei vari punti si può utilizzare la sintassi: a:step:b.



Esempio 11 Scrivendo:


A = 2:4 Enter si ottiene: A = [2 3 4]. Se invece si scrive:
A = 2:0.5:4 Enter
si ottiene: A = [2 2.5 3 3.5 4].
Gli intervalli possone anche essere ottenuti tramite la funzione linspace che specifica
tuttavia il numero di punti anzichè l’ampiezza dello step. La sintassi è
linspace(valoreIniziale, valereFinale, NumeroPunti) In caso di
omissione del terzo parametro, viene assunto un valore di default pari a 100.

 
Esempio 12 Gli intervalli di cui nell’esempio precedente possono essere ottenuti rispettiva-
mente con: A = linspace(2,4,3) Enter e con A = linspace(2,4,5) Enter
 
Esempio 13 Calcolare nell’intervallo chiuso $ %   , con uno step sulle ascisse pari a 0.1,
punti equamente spaziati della seguente funzione:

& ')(+ *   sese (-,/. $ 4



0 
(1* (32
L’esercizio si risolve, ad esempio, creando una matrice, a due colonne di cui la prima rap-
presenta le ascisse e la seconda le ordinate. Studiamo prima cosa succede tra -2 e 0. Il
 
vettore delle ascisse, che chiameremo x1, si può trovare ponendo:
x1 = -2:0.1:0 Enter

7
2.3. MANIPOLAZIONE DI MATRICI

A questo punto calcoliamo i punti corrispondenti in y considerando che lo step è anche per
le y pari a 0.1 (coefficiente angolare uguale a 1).
y1 = 0:0.1:2
A questo punto facciamo lo stesso anche per l’intervallo tra 0 e 2 producendo due vettori x2,
 
e y2. Alla fine possiamo fondere il risultato in un;unica matrice: ris = [x1 y1; x2
y2] Enter

2.3 Manipolazione di matrici


MATLABconsente di estrarre sottomatrici da una data matrice utilizzando vettori. Ciò signi-
fica che se A è una matrice e si scrive A(i, j) dove i, j non sono scalari ma vettori, si
ottiene di estrarre delle sottomatrici.
Esempio 14 Consideriamo la matrice:
A = [1 4 5; 2 1 9; 3 6 2] Enter
 
ponendo i = 1:2 e j = 2:3 e impostando B = A(i,j), si ottiene:
5 
    #6
Gli incrementi dei vettori possono anche essere negativi o riguardare elementi non con-
tigui.


Esempio 15 Consideriamo la matrice di cui all’esempio precedente. Poniamo:
i =[1 3]; Enter
  
j = 3:-1:2; Enter
B = A(i,j); Enter
 
Il risultato che si ottiene è:
5  6 7
MATLAB consente anche di rimuovere elementi appartenenti ad un vettore riga o ad un
vettore colonna. Questo può essere fatto ponendo l’elemento in questione uguale a “[]”.


Esempio 16 Effettuiamo la seguente successione di operazioni:

 

b = [1 2 3 4 5]; Enter
c = [1;2;3;4;5]; Enter
 
b(2) = []; Enter
c(3) = []; Enter
 
8
2.3. MANIPOLAZIONE DI MATRICI

Quello che si otterrà è: 8


9$:;<6
=   
 
e:

  
6
L’operazione di soppressione di un elemento non ha senso all’interno di una matrice. Ad
esempio se A è una matrice 2x2, porre A(1,2) = [] produrrà un messaggio di errore.
Nell’ambito di una matrice è, tuttavia, possibile eliminare un’intera colonna o un’intera ri-
ga; questo viene effettuato semplicemente ponendo A(intervallo-riga, numero-
colonna) = [] o A(numero-riga, intervallo-colonna) =[].

Esempio 17 Supponiamo di porre:


 

a = [1 2 3;4 5 6; 7 8 9]; Enter
a(1:3, 2) = []; Enter 
Il risultato è:    >  
  ? 
 #
Ponendo ora:
a(1, 1:2) = []

si ottiene:
  ?
  #

9
Capitolo 3

Operazioni

Fino a questo momento abbiamo visto come immettere e manipolare matrici. In questo
capitolo e nei successivi vedremo come elaborare dati e mostrare, anche graficamente, i
risultati.

3.1 Calcoli Elementari


I calcoli aritmetici tra variabili o costanti scalari vengono eseguiti con i normali operatori
algebrici +, -, *, / . L’operatore “ˆ’’ viene utilizzato per l’elevamento a potenza, men-
tre sqrt effettua la radice quadrata. Gli stessi operatori di applicano anche sulle matrici,
con le medesime modalità. Ad esempi A + B effettuerà la somma tra le due matrici A e B
come definita nell’algebra lineare. Ovviamente le dimensioni tra le matrici dovranno essere
compatibili. Anche sulle matrici è definito l’elevamento a potenza; in particolare Aˆ (-1)
(o equivalentemente inv(A) restituisce la matrice inversa di A che dovrà essere quadrata
e invertibile. Effettuare l’operazione A/B equivale alla moltiplicazione A * inv(B) che,
come è noto, in generale fornisce un risultato diverso da inv(B) * A. L’operazione A \ B
fornisce invece lo stesso risultato di inv(A)*B.

Esempio 18 Supponiamo di porre:



A = [1 4; 5 0] Enter
 
B = [1 3 2; 0 6 4] Enter
C = [1 4; 2 0; 1 2] Enter
 
Se si impostano le due espressioni:
 

Il vettore yA + C*B; Enter
A + B*C Enter 

10
3.1. CALCOLI ELEMENTARI

la prima darà errore in quanto la matrice A è di dimensioni 2x2 mentre CxB è di dimensioni

C
 ?
3x3, mentre la seconda darà il risultato:

B

A. @  
Esempio 19 Supponiamo di voler trovare le soluzioni del seguente sistema:
  
G6 (-(EFHD * # (-(EFD  
8
8 (3.1)
I  e la soluzione, se la matrice  risulta essere
I
invertibile, è data da 
Il sistema può essere posto<
 J D . In MATLAB la cosa può essere impostata come segue:
nella forma:

A = [2 -1; -5 9]; Enter 



b = [3;1]; Enter 


x = A \b; Enter 

Si noti come l’ultima operazione potesse essere anche impostata come x = inv(A)*b.

Ci sono un pó di cose a cui stare attenti. Ad esempio l’operatore prodotto “*” funziona
su scalari e vettori; su questi ultimi ha il significato di prodotto interno o prodotto scalare.
Se si vuole creare un vettore i cui elementi siano invece pari al prodotto degli elementi omo-
loghi di due vettori (prodotto di SCHUR) l’operatore da utilizzare è il “.*”. Analgogamente
all’operatore “.*”, troviamo l’operatore “./” per la divisione tra i vari elementi di un vettore
e “.ˆ’’ per l’elevamento a potenza.

Esempio 20 Impostando la seguente sequenza di operazioni:


 
u = [1 3 2];
 Enter


v = [2 0 3];

Enter

u*v’ Enter
u.*v Enter 
La penultima operazione da come risultato: 
 ?
A. @

mentre l’ultima espressione da come risultato:

9
  
7
A. @
.

11
3.2. VARIABILI PREDEFINITE

Notiamo che gli operatori “.ˆ”, “.*” e “./” si possono applicare anche con uno dei due
operandi scalare.


Esempio 21 Supponiamo di porre:
 

u = [1 2 3]; Enter
 N
7 %
7 7
7
Se effettuiamo 2./u avremo come risultato;
A. @   K
ML > . L’operazione
porterà, invece, al risultato  #0 . Infine u.2 darà come risultato:  O
 P
 Q
 0
# S
 R
u.*3
.E@ .

MATLAB consente anche di sommare e sottrarre matrici per scalari. Lo scalare viene
interpretato in questo caso come una matrice avente tutti gli elementi pari allo scalare stesso.
Lo stesso vale anche per operatori di relazione, come vedremo meglio più avanti.

3.2 Variabili predefinite


MATLAB dispone di un certo numero di variabili predefinite di grossa utilità nel lavoro
quotidiano e nella stesura di programmi. Alcune tra le variabili predefinite più utilizzate
sono elencate di seguito:

ans risultato dell’ultima operazione non esplicitamente memorizzata su variabile;

pi valore del . T
Inf infinito

NaN not a number (ad es. il risultato di 2/0)

realmax massimo numero reale (in modulo) trattabile

realmin minimo numero reale (in modulo) trattabile

nargin numero di argomenti in ingresso ad una funzione

nargoutnumero di argomenti in uscita da una funzione

3.3 Funzioni elementari e trascendenti


MATLAB fornisce una serie di funzioni molto utili quando si scrivono delle espressioni. Un
primo insieme di funzioni sono molto utili per arrotondare i risultati:

round arrotonda all’intero più vicino

fix arrotonda verso lo zero

floor arrotonda per difetto all’intero più vicino

12
3.3. FUNZIONI ELEMENTARI E TRASCENDENTI

ceil arrotonda per eccesso all’intero più vicino

Esempio 22 Consideriamo i due numeri 1.4, -5.7. Vediamo come funzionano le funzioni di
arrotondamento.
Numero round fix floor ceil
1.4 1 1 1 2
-5.7 -6 -5 -6 -5

Molto importante è la funzione rem(x,y) che restituisce il resto di una divisione intera.
Le funzioni lcm e gcd restituiscono il mimimo comune multiplo ed il massimo comune di-
visore di un vettore, passato come argomento. La funzione abs restituisce il valore assoluto
dell’argomento. Esistono poi una serie di altre funzioni matematiche. In particolare:

funzioni trigonometriche: sin (seno), cos (coseno), tan (tangente), asin (arcose-
no), acos (arcocoseno), atan (arcotangente) ecc.

funzioni esponenziali e logaritmiche:pow2 (esponenziale in base 2), exp (esponenzia-


le in base e), log (logaritmo in base e), log2 (logaritmo in base 2), log10 (logaritmo
in base 10).

Tutte le funzioni presentate possono agire su uno scalare o su un vettore. Nel secondo caso si
intendono applicate a ciascun elemento del vettore stesso e producono,generalmente, un ulte-
riore vettore di cui ciascuna componente è data dall’applicazione della funzione all’elemento
omologo del vettore passato come argomento.

Esempio 23 Si vuole produrre una tabella che dia le coppie ordinate (t, U  V  W@ ,/.YX[Z]\ U ), per
t variabile tra 0 e 10 con step di 0.1. Il procedimento è il seguente:
 
t = 0:0.1:10; Enter
 

y = abs(2 - 3 * sin(t)); Enter
ris = [t’ y’]; Enter 
Con la prima istruzione viene creato un vettore riga con i valori di t, con la seconda si
calcolano i valori della funzione per ogni punto, la terza istruzione compone i risultati in
una tabella.

Esempio 24 Produrre una tabelle che riporti l’andamento della funzione:


&  Z_^:@W,/.YX[Z]\
per t variabile tra 0 e 5 con step pari a 0.1. La prima cosa da fare è creare un vettore per i
valori di t.
t = 0:0.1:5; A questo punto verrebbe di scrivere:
y = t*sin(t);

13
3.4. FUNZIONI SU MATRICI

tuttavia ciò sarebbe un errore dal momento che si moltiplicherebbero due verrori riga, una
composto dai valori di t e l’altro dai valori di sin(t). Moltiplicare, invece, t * sin(t)’
porta ad un valore scalare. La cosa corretta da fare è invece moltiplicare elemento per
elemento:
y = t.*sin(t);
Alla fine, volendo, possiamo comporre tutti i risultati in un’unica tabella:
ris = [t’ y’];

Esempio 25 Calcolare, per


( `
Mab
cLd%aeLWLWLfag6 , la funzione:
& 
( F h
x = 0:0.1:5; Enter 
Costruito il vettore x:

y = 1./(x.2-1) Enter 

Il vettore y sarà dato dalla seguente:

L’operatore “.ˆ” permette di elevare al quadrato tutti gli elementi del vettore riga x ottenedo
un nuovo vettore; analogamente l’operatore “./” consente di calcolare il reciproco di tutti
gli elementi del vettore.

3.4 Funzioni su matrici


MATLAB offre una vasta dotazione di funzioni che agiscono su matrice, come si può vedere
battendo help matfun. Ne riportiamo di seguito qualcuna.

3.4.1 Funzioni di algebra lineare


La funzione det(A), dove A è una matrice quadrata, restituisce il determinante di A.
La funzione rank(A) calcola il rango di A ovvero il numero di righe e di colonne
linearmente indipendenti.
La funzione poly(A) restituisce i coefficienti del polinomio caratteristico della matrice,
ordinati per potenze decrescenti.
La funzione traceA restituisce la somma degli elementi della diagonale.
Per ottenere una base ortonormale per l’immagine di una matrice A, cioè per lo spazio
vettoriale generato dalle sue colonne, si può utilizzare il comando orth(A).
 `

Per ottenere lo spazio nullo, o ker(A), di una matrice, cioè lo spazio costituito dai vettori
( tali che
( , si può utilizzare il comando null(A)
iLa decomposizione spettrale di una matrice A, consiste nel trovare una matrice diagonale

colonne sono gli autovettori, t.c.


 kj i j l
i cui elemnti sulla diagonale sono gli autovalori di A, e una martice ortonormale U le cui
. In MATLAB questo viene realizzato con

14
3.4. FUNZIONI SU MATRICI

la chiamata [U, L] = eig(A); Enter . Notiamo che questa funzione restituisce più
 
valori che possono essere raccolte in diverse variabili.


La funzione sum applicata ad un vettore restituisce la somma degli elementi; applicata
ad una matrice restituisce un vettore riga i cui elementi sono le somme degli elementi di

O

 C


ciascuna colonna della matrice. Ad esempio se A = [1 3; 9 -1], sum(A) restituisce
.E@ .

Esempio 26 Siano dati i seguenti vettori:


 
v1 = [1 -1 2]’; Enter
 
v2 = [1 0 3]’; Enter
v3 = [4 -5 7]’; Enter
 
supponiamo di voler stabilire se essi costituiscono una base di mKn .

Se impostiamo:
rank([v1 v2 v3]) Enter
 

otteniamo
una base.
.E@  quindi i vettori non sono linearmente indipendenti e non costituiscono

Esempio 27 La funzione norm(u) applicata ad un vettore restituisce la normale norma


euclidea. Come potrebbe essere realizzata? La risposta è chiaramente sqrt(sum(u.2̂)).

Esempio 28 Dati i due vettori:


 
v = [1 -1]’; Enter
u = [2 1]’; Enter
 
ricavare una base ortonormale per lo spazio da essi generato. Come primo passo normaliz-
ziamo v.
v = v/norm(v); Enter
 
a questo punto sottraiamo da u la sua componente lungo v e normalizziamo il vettore così
ottenuto.
 
u = u - (u’*v)*v Enter
u = u/norm(u) Enter
 
Ovviamente avremmo anche potuto utilizzare l’apposita funzione di MATLAB orth([u
v]) sin dal’inizio.

3.4.2 Funzioni di ordinamento


MATLAB fornisce una serie di funzioni molto potenti per valutare i contenuti delle matrici.
La prima che vediamo è max. Tale funzione può essere utilizzata per trovare il massimo
elemento di ciascuna colonna di una matrice. La funzione restituisce un doppio risultato:

15
3.4. FUNZIONI SU MATRICI

[Y, I] = max(A)
In Y verrà restituito un vettore composto dei massimi elementi di ciascuna colonna, in I il
valore degli indici in ciascuna colonna in corrispondenza dei quali si ha il massimo. Se non
si è interessati nel conoscere la posizione si può anche ignorare il secondo valore restituito,
ponendo: y = max(A).

Esempio 29 Il massimo elemento di una matrice può essere trovato facilmente tramite max(max(A));
il max più interno genera un vettore con i massimi delle varie colonne che viene passato co-
me argomento al max più esterno che calcola il massimo in assoluto. Se si è interessati
anche alla posizione che tale massimo ha all’interno della matrice si può procedere come
segue:
 
[m1, i1] = max(A); Enter
 

[m, k] = max(m1); Enter
h = i1(k); Enter 
Il primo assegnamento crea due vettori; m1 che contiene i massimi delle varie colonne e i1
che contiene le righe in cui ciascun massimo, nell’ordine di va a collocare. Il secondo as-
segnamento individua il massimo e inserisce la colonna in k. Il terzo assegnamento preleva
in h l’indice di riga relativo al massimo della colonna k-ma. In definitiva avremo in m il
massimo e la sua posizione sarà data dalla coppia h, k.

La funzione sort(u) applicata ad un vettore, restituisce il vettore stesso ordinato in


ordine crescente. Applicata ad una matrice ordina tutte le colonne.

Esempio 30 Lo sviluppo in serie di Taylor per la funzione esponenziale è il seguente:

  q* (+* (  F * ( 7 n * WL LWL * (sr * LWLWL


oep 
_. t
Si verifichi che errore si commette approssimando con i primi quattro elementi della serie
nell’intervallo [0 0.5].
 
Costruiamo intanto un insieme di punti molto fitti.
t = 0:1e-5:0.5 Enter

A questo punto calcoliamo un vettore di errore:


e = exp(t) - (1 + t + (t.ˆ2)/2+(t.ˆ3)/6 + (t.ˆ4)/24) Enter
 
L’errore massimo sarà dato da: max(e(t).
interessante è vedere l’incidenza percentuale dell’errore sul massimo o sul minimo as-
sunto dalla funzione:
max(e(t)/max(exp(t)).

16
3.5. OPERAZIONI LOGICHE

3.5 Operazioni Logiche


Oltre alle operazioni viste fino ad ora, esistono anche operatori di relazione. Essi sono:


Operatore Sgnificato

; 
maggiore
maggiore o uguale
 minore
minore o uguale
== uguale
˜= diverso
Tali operatori possono restituire il valore falso, associato al numero 0, o vero associato al
numero 1. Inoltre esistono i normali operatori logici & (and), | (or), ˜ (not).

 u ?
    v> #6
Esempio 31 Sia

Se impostiamo

P = (A >5) Enter 
w
Otteremo una matrice con zero in corrispondenza degli elementi di A per i quali la condizio-
ne è verificata e 1 altrimenti. Cioè:

u




x
Esempio 32 Sia data una matrice A fatta di interi. Come si fa a sapere il numero di elementi
pari e minori di un valore fissato in b? Se si imposta:
P = (A<b) & (rem(A,2)==0;
Avremo, in P, tanti elementi quante le posizioni di A, gli elementi di P saranno 0 se l’elemento
omologo di A verifica la condizione, 1 altrimenti. A questo punto basta fare
sum(sum(P))
per avere il numero di elementi pari ad 1 di P.
Un altro operatore interessante è any; applicato su un vettore mi dice se esiste almeno un
elemento del vettore diverso da zero. Applicato su una matrice mi da il risultato suddetto
per ogni colonna; in sostanza mi viene resatituito un vettore riga i cui elementi sono uguali
a 1 se nella colonna omologa abbiamo almeno un valore diverso da zero e uno altrimenti.
L’operatore duale è all che invece richiede che tutti gli elementi di un vettore siano diversi
da zero, per dare uno occorre che tutti gli elementi siano maggiori di zero.
Esempio 33 Per dire se nella matrice A c’è almeno un elemento maggiore di zero basta
scrivere any(any(A>0)) Per verificare, ad esempio che tutti gli elementi siano minori ¡
o uguali a zero, occorre impartire il comando:
all(all(A<=0))
Cosa succede se imposto any(all(A<=0))?

17
3.5. OPERAZIONI LOGICHE

L’operatore logico più completo è il find; applicato ad un vettore restituisce tutti gli indici
per i quali gli elementi sono non nulli. Applicando find ad una matrice, si avranno invece
le coppie di indici associati ad elementi non nulli.

Esempio 34 Se abbiamo posto:


v = [1 0 4 0 6 4 1]; Enter
 

impostare i = find(v); Enter , restituirà: 
i = [1 3 5 6 7]
Impostando invece:
 
A = [1 0 4 5; 0 0 0 1]; Enter
[i, j] = find(A); Enter ;
 
Si ottiene i = [1;1;1;2], j = [1; 3; 4; 4];
Prendendo ordinatamente le varie coppie di i e j si trovano gli elementi non nulli di A.

Si osservi, ancora una volta, che l’utilità di questi operatori deriva dal fatto che si possa
codificare con zero una condizione falsa e con uno una codizione verificata.

Esempio 35 Stampare da uno a 30 tutti i numeri che non siano multipli di 2 e tutti i multipli
 
di sette. La prima cosa da fare è generare l’intervallo interessante:
t = 1:30; Enter

 
A questo punto individuiamo le posizioni associate a tutti i numeri di nostro interesse:
i = find(rem(t,2)==0 | rem(t,7)==0); Enter

L’eliminazione e la visualizzazione del risultato avvengono ponendo t(i) = [] senza


“;”. Il tutto potrebbe ovviamente essere compattato in:
t(find(rem(t,2)==0 | rem(t,7)==0) = [];) Enter
 
Lo studente provi a ottenere la stessa cosa con un programma in C.

Esempio 36 Un modo molto utile per stimare la posizione degli zeri di una funzione è dato
dal valutare i punti per i quali risulta:

U4y XzZ]\ U |{


;
dove delta è un parametro fissato piuttosto piccolo. Provare a stimare gli zeri di tra 0
@W,S.HX[Z]\
 
e 10 con questo metodo. Intanto costruiamoci un vettore per le piuttosto fitto:
t = 0:1e-5:10 Enter
Z
 
A questo punto troviamo gli indici del vettore che verificano l’equazione suddetta. i =
find(abs(sin(t))<1e-4) Enter

18
3.5. OPERAZIONI LOGICHE

 
Infine restituaimo i t interessati:
t(i) Enter

Ovviamente il tutto può essere fatto con la sola espressione:


t(find(abs(sin(t)<1e-4))).
{
Lo studente è invitato a sperimentare vari valori dello step e del .

19
Capitolo 4

Programmare in Matlab

La programmazione in Matlab consente di:

automatizzare operazioni ripetitive, che, tipicamente, operano sulle variabili definite


in memoria;

definire operazioni (funzioni) che operano su valori passati di volta in volta.

Queste due distinte necessità danno origine a due modalità di utilizzo dello strumento: gli
script file e le funzioni. Sia uno script file che una funzione sono espresse da un file di testo
scritto, ad esempio, tramite il notepad o l’edit del DOS1 . In entrambi i casi occorre che il
file venga salvato con un’estensione “.M” e che sia presente nel path visibile al MATLAB.
In una prima fase lo studente può esercitarsi ponendo i propri file e funzioni all’interno
della directory corrente. Successivamente, volendo salvare in directory distinte, è possibile
aggiungere tali directory al PATH nei quali il MATLAB va a cercare, tramite addpath (il
path potrà essere editato o variato, con rmpath ed editpath.
Nel seguito illustreremo rapidamente alcuni costrutti di programmazione utilizzandoli
all’interno di file script. In fondo al capitolo, parleremo, invece, di funzioni. Per una cor-
retta comprensione del seguito, si tenga presente che scrivere uno script equivale, ne più e
ne meno, ad inserire una sequenza di comandi da tastiera. Per questo motivo, le variabi-
li del workspace, cioè quelle create nello spazio di lavoro dell’utente durante una sessione
MATLAB, vengono viste da uno script file e possono essere modificate. Inoltre eventuali
variabili create nello script sopravvivono all’esecuzione dello script. Da notare che tutto ciò
che segue il caratere “linea, è considerato commento e, pertanto, non incide sul codice.

4.1 Strutture di Programmazione


Sia gli script che le funzioni possono avvalersi di diverse strutture di programmazione. In
questa sezione le illustreremo rapidamente attraverso l’utilizzo di alcuni esempi.
1
Nel caso si utilizzi MATLAB per Windows un gli script file e le funzioni possono essere editati
direttamente utilizzando le apposite istruzione del menu “File”

20
4.1. STRUTTURE DI PROGRAMMAZIONE

4.1.1 Sequenze di comandi


Una prima caratteristica è che istruzioni scritte in maniera consecutiva vengono eseguite
una di seguito all’altra. Volendo essere formali tale caratteristica è in realtà un costrutto
linguistico che prende il nome di sequenza.

} ,~ )o €
. oW‚€ ƒ „ } , ~ o
Esempio 37 Proviamo a scrivere il seguente script tramite un editor o il menù
.

A = eye(3);
B = ones(3,3)+diag([3,2,1]);
C = A’+B’;

Salviamo il file nella direcotry corrente con il nome di “prova”. A questo punto eseguiamo
la seguente sequenza di istruzioni nell’ambiente MATLAB:
 
A = 1; Enter
 

prova; Enter


A Enter


B Enter
C Enter 
Alla fine si noterà che A avrà modificato il suo valore e saranno state create le variabili
B e C.

4.1.2 Istruzione di selezione


L’istruzione di selezione si ottiene con il classico comando if che ha la seguente sintassi:

if condizione,
istruzioni
elseif condizione,
istruzioni
else
istruzioni
end

Vediamo il funzionamento con alcuni semplici esempi.

Esempio 38 Data la matrice A definita nel workspace, scrivere uno script che se la matrice
è quadrata ne stampi a schermo il determinante e caratteristica; se invece è rettangolare lo
script dovrebbe notificare la cosa e stampare la caratteristica. Notiamo che una stringa può
essere stampata con la sintassi:fprintf(1, ’stringa’).
Lo script può essere fatto come segue:

21
4.1. STRUTTURE DI PROGRAMMAZIONE

%inseriamo in m ed n il numero di righe e colonne di A


[m, n] = size(A);
if m == n,
fprintf(1,’matrice quadrata e determinante...’);
det(A)
else
fprintf(1,’matrice rettangolare’);
end
fprintf(1,’caratteristica...’);
rank(A)
clear m, n

…y
Esempio 39 Approssimare l’esponenziale f (t) = exp(t) con i primi 3 elementi ele-
menti della serie di Taylor, . Con riferimento ad un intervallo contenuto nel vettore x cal-
colare il massimo errore che si commette nell’approssimazione e l’errore quadratico medio,

† ‰ ‡ˆ ‹Œ$Š y Œ …y Œ F
definito come:

Œ Œ ˆ DX \
dove y e …y sono i campioni della funzione e della funzione approssimante. Comunicare
se il l’errore che si commette è inferiore all’uno percento del minimo valore assunto dalla
funzione. Lo script può essere il seguente:

N = max(size(x));
f = exp(x);
ftilde = 1+ x + (x.ˆ2)/2;
e = 1/N* sqrt((f-ftilde)*(f-ftilde)’);
fprintf(1, ’errore quadratico medio...’);
e
if e> 0.01*min(f),
fprintf(1,’errore troppo grande’);
end

4.1.3 Istruzioni iterative


L’iterazione si ottiene con due costrutti, il while ed il for. Le sintassi dei due costrutti
sono rispettivamente:

for indice =
 intervallo 
istruzioni
end

22
4.1. STRUTTURE DI PROGRAMMAZIONE

while condizione,
istruzioni
end

Tali strutture sono purtroppo molto lente da eseguire e dovrebbero essere utilizzate solo
quando le funzioni di manipolazione di matrici non possono essere utilizzate.

Esempio 40 Dato un intervallo di valori, contenuto nel vettore riga x, dato un intero N
positivo, dare la seguente stima della funzione sin x:

Š ‹ 
 J ŽD F D
@W,S.!(  X  \ r X  ( .’rC* ‘  \gt
La prima cosa che si può osservare è che se J
r
n-1 termini dello sviluppo, si ha:
@ r e
D [
X “
( \ è la funzione ottenuta considerando

J —
F – J DS˜ D
@ r Xz(“\  @ r J D”Xz(“\•*‚X  \ r D * X  X™(. |r  \A‘ *  \ft
Inoltre si può esservare che, ponendo y 
  , si ha y     y J .
X .š* \gt
Sfruttando queste considerazioni il problema r può essere risolto tramiter lo script seguente:
X .š* \ . r D
y = zeros(size(x));
intervallo = 1:N-1;
f = 1;
s = x;
for i = intervallo,
%implenta f(n)= (2n+1) 2n f(n-1)
f = f*(2*i+1)*(2*i);
%implementa s(n) = s(n-1) +xˆ(2(n-1)+1)/((2(n-1)+1)!)
%ponendo i = n-1
s = s + ((-1)ˆi) *(x.ˆ(2*i+1))./((work));
end;

Esempio 41 Il crivello di Eratostene è un semplice algoritmo per calcolare l’insieme dei


numeri primi compresi tra 2 ed N. L’idea è molto semplice. Si parte da 2 e si cancellano tutti
in numeri multipli di 2. Quindi si passa al prossimo numero, tra quelli rimasti non cancellati,
che in questo caso è 3, e se ne cancellano tutti i multipli. Poi si itera il procedimento fino ad
arrivare ad N. In MATLAB la cosa può essere realizzata con il seguente script.

23
4.2. FUNZIONI

primi = 2:N;
i = 2;
while i < N,
cancella = find(rem(intervallo,i)==0);
cancella(1) = [];
primi(cancella) = [];
i = i+1;
end
primi

4.2 Funzioni
Le funzioni si differenziano dagli script per poche cose. Intanto le funzioni vengono dotate,
in cima, di un’intestazione che deve essere:
function [variabili di uscita] = nomeFunzione(variabili di in-
gresso).
La prima cosa che possiamo osservare è che la funzione accetta parametri di ingresso e può
restituire parametri di uscita. Inoltre, eventuali commenti, inseriti subito dopo l’intestazione,
verranno stampati digitando help nomeFunzione. Perchè la funzione possa essere in-

Œ
vocata essa deve essere salvata in un ile avente il suo nome, collocato nella directory corrente
o in una directory raggiungibile tramite path

Esempio 42 Supponiamo di voler restituire un vettore y, dato da › rp p , assumendo che ( sia


a sua volta un vettore. Il file da scrivere è semplicemente:

function y = funzione(x)
y = sin(x)./x;

Notiamo come la restituzione del valore da parte della funzione sia quello conseguente
all’ultimo assegnamento della variabile che ha come nome quello specificato come variabile
di uscita (in questo caso y). Il file che conterrà la funzione verrà denominato funzione.m.

Le operazioni che avvengono in una funzione, di default, si intendono eseguite su varia-


bili locali; pertanto eventauli modifiche non persistono dopo l’esecuzione della funzione.
Esempio 43 Scriviamo una funzione che resituisca traccia e caratteristica di una matrice.

function [tr car] = tracciaCar(A)


%Funzione per stampare la traccia e la caratteristica di una matrice
t1 = sum(diag(A));
tr = t1;
car = rank(A);

24
4.2. FUNZIONI

Notiamo che dopo aver invocato, ad esempio tracciaCar(rand(4)), la variabile


t1 non sarà stata creata, se non esistente in precedenza, e non sarà stata modificata se
esistente in precedenza.

Esempio 44 Vogliamo una funzione che, dato lo sviluppo in serie del seno, passandogli un
intervallo e una precisione desiderata, intesa in termini di rapporto errore massimo/media
del valore assoluto del seno nell’intervallo, resituisca il numero di elementi necessari allo
sviluppo in serie e la precisione ottenuta. L’esercizio si risolve con la semplice funzione:

function [elem, precisione] = approx(x, des)


%La funzione prende come argomenti un
%intervallo(x) e una precisione dediserata (des)
%e restituisce il numero di elementi della
%serie di Taylor necessari e la precisione
%ottenuta con essi
continua = 1;
elem = 1;
%Il ciclo while prova vari
%numeri di elementi fino a
%che non si raggiunge la precisione
%desiderata che viene segnalata
%tramite il flag continua
while continua,
y = zeros(size(x));
intervallo = 1:elem-1;
work = 1;
y = x;
% questo ciclo calcola
% lo sviluppo in serie del
% seno come visto in un
% precedente esempio
for i = intervallo,
work = work*(2*i+1)*2*i;
y = y + ((-1)ˆi)*(x.ˆ(2*i+1))/((work));
end
precisione = max(abs(y-sin(x)))/mean(abs(sin(x)));
if precisione < des,
continua = 0;
else
elem = elem+1;
end
end

25
4.2. FUNZIONI

Esercizio 1 Scrivere una funzione che, dato un vettore di interi, restituisca:

1. il numero di elementi maggiori di cinque

2. un vettore ottenuto a partire da quello precedente eliminando i numeri pari.

Se v è il vettore, per quello che riguarda il primo punto si può tranquillamente procedere
con l’istruzione sum(v>5). Per quello che riguarda il secondo punto si utilizza il find per
individuare gli elementi da eliminare e, successivamente, si pongono tali elementi a “[]”.
Complessivamente il risultato è la seguente funzione.

function [elementi nuovov] = elimina(v)


% v e’ il vettore di ingresso
% elementi dara’ in uscita gli elementi maggiori
% di 5 e nuovov sar a il vettore restituito

%Calcolo numero elementi maggiori di cinque


elementi = sum(v>5);

%Valutazione elementi da eliminare


indici = find(rem(v,2)==0);
nuovov = v(indici);

26