Sei sulla pagina 1di 8

Corso di base

sull’utilizzo del software MATLAB


Davide Liessi (liessi.davide@spes.uniud.it)
Alessia Andò (ando.alessia@spes.uniud.it)
17 marzo 2019

I comandi help e doc e la documentazione online di MATLAB [6] sono i vostri migliori
amici.

Diario delle lezioni (e spunti per approfondire)


Lezione 1 (06/03/2019)
Introduzione
• Cos’è MATLAB? Brevi cenni storici. [3, 5]
• «L’analisi numerica è lo studio di algoritmi per i problemi della matematica
continua.» [7]
• Matematica continua rappresentazione dei numeri reali in una macchina finita
errori di rappresentazione (o di arrotondamento).
• Esempio di errore di arrotondamento: 1 − 3(4/3 − 1) 6= 0 nell’aritmetica di mac-
china; l’errore è nel calcolo e nella rappresentazione di 4/3, le altre operazioni in
questo caso non introducono errori.
• Algoritmi: più algoritmi possono risolvere lo stesso problema; un algoritmo può
essere finito o infinito.
• Errori:
– dipendenti solo dal problema e non dall’algoritmo errore inerente.
– dipendenti dallo specifico algoritmo scelto errore algoritmico.
– dovuti all’approssimazione finita di un algoritmo infinito (o all’approssima-
zione in dimensione finita di un problema di dimensione infinita) errore
analitico.

Aritmetica di macchina
• Rappresentazione dei numeri reali in una macchina finita:
– sottoinsieme finito di numeri reali con rappresentazione finita,
– numeri molto grandi e molto piccoli,
– errori di rappresentazione “piccoli”, più precisamente errori relativi di rappre-
sentazione limitati da una costante (piccola).

1
• Lo standard IEEE 754 [1] (pubblicato nel 1985, aggiornato nel 2008)
• In base 2, dati t, m, M numeri naturali, i numeri di macchina normalizzati sono i
numeri della forma

±(0.1d2 d3 . . . dt )2 · 2 p = ±(2−1 + d2 2−2 + d3 2−3 + · · · + dt 2−t ) · 2 p ,


dove d2 , . . . , dt ∈ {0, 1} e −m ≤ p ≤ M. La stringa 1d2 d3 . . . dt è la mantissa; t è la
sua lunghezza, ovvero il numero di cifre significative; p è l’esponente.
• I numeri di macchina denormalizzati sono i numeri della forma

±(0.0d2 d3 . . . dt )2 · 2−m = ±(d2 2−2 + d3 2−3 + · · · + dt 2−t ) · 2−m ,


dove d2 , . . . , dt ∈ {0, 1}. Hanno sempre un numero di cifre significative stretta-
mente minore di t. Si veda anche [4].
• L’insieme dei numeri di macchina è costituito dai numeri di macchina normalizza-
ti e denormalizzati, dallo zero (0), dagli infiniti (±Inf) e dal valore not-a-number
(NaN).
• Nello standard IEEE 754 in doppia precisione t = 53, m = 1021 e M = 1024; ogni
numero di macchina occupa 64 bit.
• La base e i numeri t, m, M caratterizzano l’insieme di numeri di macchina.
• Il minimo numero normalizzato positivo è 2−m−1 (realmin); il massimo numero
normalizzato positivo è (1 − 2−t ) · 2 M (realmax); il minimo numero denormaliz-
zato positivo è 2−t−m .
• Regole di arrotondamento: arrotondamento al numero più vicino (più frequente),
troncamento (o arrotondamento verso 0), . . . (si veda [1, par. 4.3] per l’elenco
completo e la descrizione delle regole ammesse).
• Rappresentazione di x ∈ R nei numeri di macchina (denotata con fl( x )):
– se x > realmax, allora fl( x ) := +Inf (overflow);
– se x < −realmax, allora fl( x ) := −Inf (overflow);
– se x ∈ [realmin, realmax] ∪ [−realmax, −realmin], allora fl( x ) è un numero di
macchina normalizzato, determinato secondo la regola di arrotondamento;
– se x ∈ (−realmin, realmin), allora fl( x ) può essere un numero di macchina
denormalizzato oppure 0 o ±realmin, secondo la regola di arrotondamento
(underflow).
• Nessun numero reale è rappresentato da NaN, che esprime il risultato di opera-
zioni senza senso o non determinate (per esempio 0/0).
• L’epsilon di macchina (eps) è il più piccolo numero di macchina tale che fl(1 +
eps) 6= 1. Nello standard IEEE 754 in doppia precisione eps = 2−52 .
Curiosità: l’errore di rappresentazione del risultato di 1 − 3(4/3 − 1) in aritmetica
di macchina è esattamente eps.
• Errore relativo di rappresentazione:
– in caso di overflow l’errore di rappresentazione è infinito;
– se x ∈ [realmin, realmax] ∪ [−realmax, −realmin], allora l’errore di rappre-
sentazione è limitato da una costante chiamata precisione di macchina, che è
eps/2 nel caso dell’arrotondamento al numero più vicino e eps nel caso del
troncamento;

2
– in caso di underflow, il massimo errore di rappresentazione per x tra due numeri
denormalizzati successivi è tanto più grande quanto più x è vicino a 0, ma è
comunque limitato da 1 (se x 6= 0 e fl( x ) = 0 l’errore è esattamente 1).
• Con il programma floatgui tratto da [2] si può esaminare la distribuzione dei
numeri di macchina, anche in scala logaritmica, in cui la distribuzione dei numeri
è la stessa in ogni intervallo del tipo [2k , 2k+1 ].
√ lo standard IEEE 754 garantisce che le operazioni di macchina (+,
• Operazioni:
−, ·, /, , ma spesso anche molte funzioni elementari) siano arrotondate corret-
tamente, cioè che il risultato di un’operazione su/tra numeri di macchina sia la
rappresentazione come numero di macchina del risultato dell’operazione esatta;
per esempio, se x e y sono numeri di macchina e ⊕ è l’addizione di macchina, al-
lora x ⊕ y = fl( x + y). In questo modo l’errore relativo risulta comunque limitato
dalla precisione di macchina.

Comandi e sintassi di base, aritmetica scalare

• help • numeri complessi: i, j, real, imag,


• assegnamento di variabili con = abs, angle, conj
• variabile ans • notazione scientifica:
• uso di ; al termine di un’istruzione 2.54e3 = 2.54e+3 = 2.54 · 103 ,
3.41e-5 = 3.41 · 10−5
• più istruzioni in una riga con , e ;
• aritmetica di macchina: eps, realmax,
• una istruzione in più righe con ...
realmin, operazioni con Inf e NaN,
• +, -, *, /, ˆ, () esempi di overflow (realmax*2) e
• funzioni elementari: sqrt, abs, sin, underflow (realmin/2, 2ˆ-1074/2)
cos, tan, asin, acos, atan, exp, log, • format
log10, log2 (le funzioni trigonome-
• richiamo di istruzioni passate usando
triche usano i radianti e non i gradi
le frecce verso l’alto e verso il bas-
sessagesimali)
so con il prompt vuoto o avendo già
• costante pi ≈ π scritto i primi caratteri

Altri comandi utili non visti a lezione: doc, quit, exit.

Matrici e vettori
• matrici: [], righe separate da ; o invio, colonne separate da , o spazio
• indicizzazione di matrici: l’elemento ai,j della matrice
 
a1,1 ... a1,M
 .. .. .. 
A= . . . 
a N,1 ... a N,M

si richiama o modifica con A(i,j)


• A’ è la matrice trasposta coniugata di A, A.’ è la matrice trasposta di A
• vettori: matrici unidimensionali, es. [1 2 3], [1; 2; 3], [1 2 3]’

3
• indicizzazione di vettori: l’elemento vi del vettore v = (v1 , . . . , v N ) (riga o colon-
na) si richiama o modifica con v(i)
• definizione di matrici e vettori a blocchi, usando ;/invio e ,/spazio per separare
righe e colonne di blocchi, a patto che le dimensioni dei blocchi siano compatibili
• matrici particolari: eye, zeros, ones
• funzioni utili: diag, size, length
Cosa succede indicizzando una matrice con un singolo indice, come se fosse un vettore?

Lezione 2 (13/03/2019)
Matrici, vettori e sistemi lineari (continua)
• rand
– a ogni avvio, MATLAB inizializza il generatore di numeri pseudo-casuali con lo
stesso seme; in questo modo la sequenza di numeri generati è sempre la stessa,
permettendo di ripetere gli esperimenti numerici in modo deterministico
– si può inizializzare manualmente il generatore con un nuovo seme o ripristinare
il seme predefinito (come se si riavviasse MATLAB) con il comando rng
– in Octave, invece, il seme è diverso a ogni avvio e si può impostare manualmen-
te con opzioni del comando rand stesso
• a:s:b = ( a, a + s, a + 2s, . . . , a + ks) con k ∈ N massimo per cui a + ks ≤ b,
a:b = a:1:b
• sottomatrici: se I = (i1 , . . . , i p ) e J = ( j1 , . . . , jq ) sono insiemi di indici, rispettiva-
mente di riga e colonna, per la matrice A, la sottomatrice
ai1 ,j1 . . . ai1 ,jq
 
 .. .. .. 
 . . . 
ai p ,j1 . . . ai p ,jq

di A si richiama o modifica con A(I, J)


– gli indici in I e J possono essere ripetuti e in ordine arbitrario (es. si possono
usare per scambiare o ripetere righe e colonne)
– per costruire I e J si può usare la notazione a:s:b o a:b, con l’estensione
che end è il massimo indice della corrispondente dimensione della matrice (es.
A(3:end,[2 5]) è la sottomatrice di A costituita dagli elementi nelle colonne 2
e 5 e in tutte le righe da 3 in poi)
– un singolo : equivale a 1:end (es. A(5,:) è la quinta riga di A)
• somma di matrici (+, -): agisce componente per componente (matrice–matrice),
componente per componente su ciascuna riga o colonna (matrice–vettore) o su
ciascuna componente (matrice–scalare)
• prodotto di matrici (*): agisce righe per colonne (matrice–matrice o matrice–
vettore) o su ciascuna componente (matrice–scalare)
• divisione destra (/) e sinistra (\), sistemi lineari, divisione per scalare
– se A ∈ Rm×n e B ∈ Rm× p , allora X = A\B ∈ Rn× p è tale che AX = B; se m = n
e det( A) 6= 0 allora X = A−1 B

4
– se A ∈ Rn× p e B ∈ Rm× p , allora X = A/B ∈ Rm×n è tale che XA = B; se n = p
e det( A) 6= 0 allora X = BA−1
– il sistema lineare 
x + y − z = 3

2x − 5y + 7z = −3

− x + 3y − 6z = 42

scritto in forma matriciale


       
x 1 1 −1 x 3
A · y =  2 −5 7  ·  y  =  −3 = b
z −1 3 −6 z 42

si può risolvere con A\B


– / e \ non calcolano l’inversa ma risolvono il sistema lineare corrispondente
– divisione per scalare (es. A/2, 2\A): agisce su ciascuna componente
• potenza di matrici (ˆ), matrice inversa (inv), esponenziale di matrici (es. 2ˆA)
• operazioni componente per componente: .*, ./, .\, .ˆ
• le funzioni elementari viste nella prima lezione operano componente per compo-
nente
• le operazioni/funzioni componente per componente permettono di usare matrici
e vettori non solo nel loro significato dell’algebra lineare ma anche come strumenti
per eseguire operazioni uguali su molti input diversi, invece di usare cicli per
percorrere i vettori; infatti le operazioni matriciali sono molto più efficienti:
A=rand(1000); B=rand(1000);
tic; C=A+B; toc
C=zeros(1000);
tic; for i=1:1000; for j=1:1000; C(i,j)=A(i,j)+B(i,j); end; end; toc
• funzioni utili: max, min, sort (applicati a matrici agiscono lungo le colonne)

Altri comandi utili non visti a lezione: sum, prod, mean.

Workspace

• who, whos • clear, save e load possono agire an-


• clear che su sottoinsiemi del workspace (es.
• save, load clear a, save nomefile a b c)

Nella lezione abbiamo parlato anche dell’opzione -ascii. Questa opzione può essere utile
in alcuni casi, ma ha delle grosse limitazioni, per cui in generale ne sconsigliamo l’uso in
favore del formato binario di default di MATLAB. Al contrario, il formato testuale di Octave
(default), può salvare le variabili del workspace in modo completo.

Operatori relazionali e logici


• tipo di dato logico: logical, costanti booleane true = logical(1) e false =
logical(0)

5
• operatori relazionali: <, >, <=, >=, ==, ~= (agiscono componente per componente)
• operatori logici: ~, &, |, xor (agiscono componente per componente)
• any, all (applicati a matrici agiscono lungo le colonne)
• operatori logici con valutazione a corto circuito: &&, ||
– ricordiamo che “A e B” è vero se sono veri sia A sia B ed è falso se è falso
almeno uno tra A e B, mentre “A o B” è vero se è vero almeno uno tra A e B
ed è falso se sono falsi sia A sia B
– per valutare A&B e A|B, MATLAB valuta entrambe le espressioni A e B, ma a volte
una delle due valutazione è superflua: più precisamente se A è falso sappiamo
già che “A e B” è falso anche senza valutare B, mentre se A è vero sappiamo
già che “A o B” è vero anche senza valutare B
– per valutare A&&B e A||B, MATLAB valuta inizialmente solo l’espressione A,
procedendo a valutare B solo se necessario; questa modalità di valutazione si
chiama valutazione a corto circuito o valutazione di McCarthy
– a differenza di & e |, gli operatori && e || non operano su matrici e vettori
ma solo su scalari; MATLAB dà un errore se gli operatori vengono applica-
ti a condizioni non scalari; per ottenere condizioni scalari da vettori possono
essere utili any e all; in Octave, invece, se A e B non sono scalari, A&&B =
all(A(:))&&all(B(:)) e A||B = all(A(:))||all(B(:))
– la valutazione può essere utile nei casi in cui la seconda condizione dipende
dalla prima (es. perché ha senso solo se la prima è vera); un esempio banale è
(b~=0)&&(a/b>18.5): se b = 0, essendo la prima condizione falsa, la seconda
condizione non viene valutata, evitando di eseguire la divisione per 0 (non è
difficile immaginare situazioni in cui eseguire la seconda istruzione quando la
prima è falsa porti a errori ben più gravi)
• find
• indicizzazione con valori logici: se A è una matrice e L è una matrice di tipo
logical delle stesse dimensioni, A(L) è il vettore degli elementi di A nelle posi-
zioni corrispondenti a elementi true di L; esempio: se A=[1 3 5 2 3 4 8 -1],
A(mod(A,2)) dà un errore perché mod(A,2) è di tipo numerico (double), ma de-
finendo L=logical(mod(A,2)) i vettori A(L) e A(~L) contengono rispettivamente
gli elementi dispari e quelli pari di A

Non abbiamo visto la funzione mod in precedenza: si usi help mod per capirne il significato.

Polinomi
• il polinomio p( x ) = ad x d + · · · + a1 x + a0 è rappresentato in MATLAB dal vettore
dei coefficienti P=[ad ,...,a1 ,a0 ]
• se x=[x1 ,...,xn ], allora polyval(P,x) = [p( x1 ),...,p( xn )]
• le radici del polinomio p si possono calcolare con roots(P) (la funzione roots
riformula il problema in termini degli autovalori di una matrice, si veda la docu-
mentazione per ulteriori dettagli)
• è meglio usare roots o la formula risolutiva, quando esiste?
esempio [2, Esercizio 1.38]:

6
– consideriamo il polinomio ax2 + bx + c con a = 1, b = −108 e c = 1
– calcoliamo le sue radici con roots([a b c]) e con la formula risolutiva

−b ± b2 − 4ac
x1 , x2 =
2a
– non avendo le radici esatte, come possiamo confrontare i due risultati? usia-
mo polyval per calcolare i residui, ovvero i valori del polinomio nelle radici
approssimate con i due metodi: nulla garantisce che il residuo relativo a una ra-
dice sia piccolo, ma a una migliore approssimazione corrisponderà un residuo
minore in valore assoluto
– il residuo relativo a x1 , la radice maggiore in valore assoluto, è dell’ordine
dell’unità in entrambi i casi
– il residuo relativo a x2 calcolata con roots è 0, mentre quello relativo alla for-
mula risolutiva è dell’ordine di 10−1 : infatti nel calcolo di x2 con la formula ri-
solutiva si ha la sottrazione di due numeri quasi uguali, che causa la perdita di
cifre significative dando luogo a un errore relativo molto grande (cancellazione)
– sapendo che x1 x2 = c/a si può calcolare x2 evitando la cancellazione; il residuo
in questo caso è dell’ordine di 10−16

Perché il residuo può essere grande? Perché in questo esempio per x1 è dell’ordine dell’unità?

Programma delle prossime lezioni


Lezione 3 (20/03/2019)
Polinomi (continua)
• discussione dell’ultimo esempio della lezione precedente

Programmazione
• M-file: script e funzioni, workspace e visibilità delle variabili
• strutture di controllo: if, elseif, else; switch, case, otherwise; while; for;
break; continue; return
• tipi di dati: numerici, logici, caratteri, strucutre e cell array, function handles, . . .
• funzioni locali e nidificate: visibilità reciproca e uso dei workspace
• funzioni anonime
• function handles e funzioni come input e output di funzioni

Lezioni successive
La lista degli argomenti non è esaustiva e non rispetta necessariamente l’ordine delle lezioni.

• grafici
• cell e structure arrays
• funzioni con numero variabile di input e di output

7
• matrici sparse
• scrittura e lettura di file
• controllo degli errori e dei tipi di dati
• interazione tra MATLAB e C
• algebra lineare: autovalori e autovettori, valori singolari
• interpolazione
• sistemi nonlineari
• ottimizzazione, minimi quadrati, data-fitting
• integrazione e differenziazione
• equazioni differenziali

Riferimenti bibliografici
[1] IEEE Std 754-2008 – IEEE Standard for Floating-Point Arithmetic, 2008, doi: 10.
1109/IEEESTD.2008.4610935.
[2] C. Moler, Numerical Computing with MATLAB, 2004, url: https : / / www .
mathworks.com/moler/index_ncm.html.
[3] C. Moler, The origins of MATLAB, 2004, url: https://www.mathworks.com/
company/newsletters/articles/the-origins-of-matlab.html.
[4] C. Moler, Floating point denormals, insignificant but controversial, 2014, url:
https : / / blogs . mathworks . com / cleve / 2014 / 07 / 21 / floating - point -
denormals-insignificant-but-controversial-2/.
[5] C. Moler, A brief history of MATLAB, 2018, url: https://www.mathworks.com/
company/newsletters/articles/a-brief-history-of-matlab.html.
[6] The MathWorks, Inc., MATLAB – The Language of Technical Computing, url:
https://www.mathworks.com/help/matlab/index.html.
[7] L. N. Trefethen, The definition of numerical analysis, SIAM News (1992), url:
https://cims.nyu.edu/~oneil/courses/sp18- math252/trefethen- def-
na.pdf.