Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
I comandi help e doc e la documentazione online di MATLAB [6] sono i vostri migliori
amici.
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
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.
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
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
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
Workspace
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.
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à?
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.