12.07.2015 Views

Introduzione a Matlab ed Aritmetica Floating–Point

Introduzione a Matlab ed Aritmetica Floating–Point

Introduzione a Matlab ed Aritmetica Floating–Point

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Laboratorio I <strong>Introduzione</strong> a <strong>Matlab</strong> R <strong>ed</strong> <strong>Aritmetica</strong> Floating–PointSeealso HOME.Reference page in Help browserdoc clcRiassumendo:clear → Cancella tutte le variabiliclear → Cancella la variabile varclc → Pulisce tutte le istruzioni a schermo e blocca la barra di scorrimentohome → Pulisce tutte le istruzioni a schermohelp → Fornisce le funzionalità e le modalità d’uso di comandowho → Elenca tutte le variabili in memoriawhos → Elenca le variabili, il loro tipo e la dimensione di memoria occupataIstruzione formatIl formato di visualizzazione dei risultati, ma non la precisione con la quale sono eseguiti i calcoli,può essere cambiato utilizzando il comando format . Ad esempio, se dopo aver cambiatoil formato, digitiamo la frazione 1/7 si ottiene:format rat → ans = 1/7format short → ans = 0.1429format short e → ans = 1.4286e-01format short g → ans = 0.14286format long → ans = 0.142857142857143format long e → ans = 1.428571428571428e-01format long g → ans = 0.142857142857143Assegnazione di vettori e matriciVi sono diversi modi per creare dei vettori. Il più diretto è il seguente:>> b = [ 1 5 6 2 ];>> c = [ 1, 5, 6, 2 ];I due vettori b e c saranno identici, infatti la virgola nel secondo caso è opzionale; a volte peròè utile per evitare confusione. La dimensione è 1 × 4 per entrambi, cioè 1 riga e 4 colonne. Se sivuole creare un vettore colonna, basta usare il punto e virgola (questa volta obbligatorio):>> d = [ 1; 5; 6; 2 ];>> whosName S i z e Bytes C l a s s A t t r i b u t e sb 1x4 32 doublec 1x4 32 doubl<strong>ed</strong> 4x1 32 doubleOsserviamo che ognuno occupa 32 bytes = 4 · 8 bytes, dove 8 bytes = 64 bit è la dimensione diun numero in virgola mobile a doppia precisione.Per definire un vettore dati gli estremi e l’incremento, la notazione è: : : Se l’incremento è omesso, si assume pari ad uno. Ad esempio:–3–


Laboratorio I <strong>Introduzione</strong> a <strong>Matlab</strong> R <strong>ed</strong> <strong>Aritmetica</strong> Floating–Point>> 1:8ans =1 2 3 4 5 6 7 8>> 1:2:8ans =1 3 5 7>> 0.5: − 0.1:0ans =0.5000 0.4000 0.3000 0.2000 0.1000 0L’ultimo caso è da evitare, perché l’accumulazione degli errori nelle somme, dovuto all’arrotondamento,può precludere la corretta chiusura del vettore (l’ultimo elemento non sarà quellorichiesto). A questo scopo è molto più sicuro utilizzare linspace:>> linspace (0 , 1, 5)ans =0 0.2500 0.5000 0.7500 1.0000Quanto visto si estende facilmente alle matrici:>> A= [ 1 2 3 4; 5 6 7 8 ; 9 10 11 12; 13 14 15 16 ]A=1 5 9 132 6 10 143 7 11 154 8 12 16viene così creata una matrice 4 × 4. Per creare matrici più complesse si possono utilizzare combinazionidei metodi visti fino ad ora, insieme ad altri comandi come reshape, che ridimensionala matrice:>> reshape(A, 2 , 8)ans =1 3 5 7 9 11 13 152 4 6 8 10 12 14 16È inoltre possibile definire matrici a blocchi, tenendo conto però delle corrette dimensioni:>> B= [ 1:3 0; 4:−1:1 ]B=1 2 3 04 3 2 1Vi sono infine delle funzioni che creano matrici con una struttura particolare:zeros(n, m) → Matrice n × m riempita con 0ones(n, m) → Matrice n × m riempita con 1rand(n, m) → Matrice n × m riempita con numeri casuali in [0, 1]eye(n, m) → Matrice n × m riempita con 1 nei termini i = jDi tutti questi esiste la versione con un solo argomento, dove si sottointende n = m: ad esempioones(4) crea una matrice 4 × 4 con tutti 1.Esercizio 1.1Utilizzando i comandi visti, come zeros, eye e ones, per un dato numero n, si crei la matrice2n × 2n seguente:–4–


Laboratorio I <strong>Introduzione</strong> a <strong>Matlab</strong> R <strong>ed</strong> <strong>Aritmetica</strong> Floating–Pointans =5 8 9>> a − bans =−3 −4 1>> H+Gans =5 8 510 8 84 6 12>> H ∗ Gans =29 20 3161 42 7145 28 33>> G ∗ aError using ∗Inner matrix dimensions must agree .Questo è l’errore più comune, infatti il vettore a è 1 × 3, mentre H è 3 × 3, quindi non va bene.>> G ∗ a’ans =262152>> a ∗ Gans =35 24 49>> 2 ∗ aans =2 4 10>> a’ ∗ bans =4 6 48 12 820 30 20>> a ∗ b’ans =36>> Aˆ2ans =8 22 2617 48 5512 30 40>> aˆ2Error using ˆInputs must be a scalar and a square matrix .To compute e l e m e n t w i s e POWER, use POWER ( . ˆ ) i n s t e a d .L’ultimo messaggio ci dice che l’elevamento a potenza è inteso nel senso di prodotto di matrici,e dunque è definito solo per matrici quadrate. Ci viene suggerito anche di usare la versione conil punto. Infatti, le operazioni binarie scalari di prodotto, divisione <strong>ed</strong> elevazione a potenza,diventano operazioni elemento per elemento per vettori e matrici nel momento in cui si pone unpunto davanti al simbolo dell’operazione:>> a .∗ bans =4 12 20>> a ./ bans =0.2500 0.3333 1.2500–7–


Laboratorio I <strong>Introduzione</strong> a <strong>Matlab</strong> R <strong>ed</strong> <strong>Aritmetica</strong> Floating–Point>> a .ˆ 2ans =1 4 25>> a .ˆ bans =1 64 625L’unica accortezza, in questo caso, è che i due operandi siano della stessa dimensione, o chealmeno uno dei due sia scalare (nel qual caso viene ripetuto).Esercizio 1.2Dato un numero n, creare un vettore della forma:n[ { }} { ]1, 1,...,1, 2, 2,...,2,...,n,n,...,n.} {{ } } {{ } } {{ }nnnAd esempio, per n = 3, viene [1, 1, 1, 2, 2, 2, 3, 3, 3].Funzioni matematiche elementariUn punto di forza di <strong>Matlab</strong> è l’enorme quantità di funzioni matematiche (elementari e non)utilizzabili. Se non specificato altrimenti, quasi tutte queste funzioni si applicano elemento perelemento: data una matrice A, exp(A) non è la matrice esponenziale (che invece si calcola conexpm(A)), bensì la matrice i cui elementi sono gli esponenziali degli originali. Eccone alcune:Esercizio 1.3Si calcolinoabs(A) → Valore assoluto degli elementi di Asqrt(A) → Radice quadrata degli elementi di Aexp(A) → Funzione esponenziale degli elementi di Alog(A) → Logaritmo naturale degli elementi di Alog10(A) → Logaritmo in base 10 degli elementi di Alog2(A) → Lograritmo in base 2 degli elementi di Asin(A) → Seno degli elementi di Acos(A) → Coseno degli elementi di Atan(A) → Tangente degli elementi di Aasin(A) → Arcoseno degli elementi di A (in radianti)acos(A) → Arcocoseno degli elementi di A (in radianti)atan(A) → Arcocotangente degli elementi di A (in radianti)sinh(A) → Seno iperbolico degli elementi di Acosh(A) → Coseno iperbolico degli elementi di Atanh(A) → Tangente iperbolica degli elementi di Ae 5 +sin(π)√log2 30 − 10 <strong>ed</strong> elog 10 50 +e ln 30 +e log 2 40 .Si definiscano ( ) x =[1, ( 3, 4] <strong>ed</strong> y =[1, 1, 2] e si calcolino 2x i log 2 (|y i | + 1) − y i log 10 (x i + 2) exiarctan − sin 2 x √ 3 i |y i |).y 2 i–8–


Laboratorio I <strong>Introduzione</strong> a <strong>Matlab</strong> R <strong>ed</strong> <strong>Aritmetica</strong> Floating–PointFunzioni per la gestione di matriciSiano A, B due matrici e b un vettore.size(A) → Restituisce un vettore di due elementi, il primo è il numero di righ<strong>ed</strong>i A, il secondo il numero di colonne;size(A, 1) → Restituisce il primo elemento di size(A), ossia il numero di righe;size(A, 2) → Restituisce il secondo elemento di size(A), ossia il numero dicolonne;length(b) → Restituisce il numero di elementi del vettore b;max(b) → Restituisce il più grande elemento del vettore b;min(b) → Restituisce il più piccolo elemento del vettore b;max(A) → Restituisce un vettore riga contenente il più grande elemento di ognicolonna di A;min(A) → Restituisce un vettore riga contenente il più piccolo elemento di ognicolonna di A;max(A,B) → Restituisce una matrice delle stessi dimensioni di A e B contenenteil massimo elemento per elemento;min(A,B) → Restituisce una matrice delle stessi dimensioni di A e B contenenteil minimo elemento per elemento;max(A,[],2) → Restituisce un vettore colonna contenente il più grande elemento diogni riga di A. Se al posto del 2 c’è 1 si ha semplicemente max(A);min(A,[],2) → Restituisce un vettore colonna contenente il più piccolo elemento diogni riga di A. Se al posto del 2 c’è 1 si ha semplicemente max(A);sum(b) → Restituisce uno scalare pari alla somma degli elementi del vettoreb;sum(A) → Restituisce un vettore riga i cui elementi sono la somma per colonn<strong>ed</strong>egli elementi della matrice A;sum(A,2) → Restituisce un vettore colonna i cui elementi sono la somma perrighe degli elementi della matrice A;diag(A) → Restituisce il vettore della diagonale della matrice A;diag(A,k) → Restituisce il vettore della k–esima sopradiagonale della matrice A;diag(A,-k) → Restituisce il vettore della k–esima sottodiagonale della matrice A;diag(b) → Restituisce una matrice sulla cui diagonale ci sono gli elementi delvettore b;diag(b,k) → Restituisce una matrice sulla cui k–esima sopradiagonale ci sono glielementi del vettore b;diag(b,-k) → Restituisce una matrice sulla cui k–esima sottodiagonale ci sono glielementi del vettore b;tril(A) → Restituisce la parte triangolare inferiore (lower) della matrice A,ossia annulla tutti i termini strettamente sopra la diagonale (anchenel caso rettangolare);triu(A) → Restituisce la parte triangolare superiore (upper) della matrice A,ossia annulla tutti i termini strettamente sotto la diagonale (anchenel caso rettangolare);Vi sono moltissime altre funzioni importanti, quali det, che restituisce il determinante di unamatrice quadrata, trace, che restituisce la traccia, norm per calcolare le norme, e via discorrendo.Man mano che serviranno introdurremo queste funzioni.–9–


Laboratorio I <strong>Introduzione</strong> a <strong>Matlab</strong> R <strong>ed</strong> <strong>Aritmetica</strong> Floating–PointEsercizio 1.4Dato uno scalare positivo n, siaA = magic(n).Sommare per righe, per colonne. Sommare inoltre gli elementi della diagonale. Cosa si osserva?Funzioni e scriptGran parte dei comandi che abbiamo introdotto sono definiti come funzioni, ossia proc<strong>ed</strong>ure cheprendono in ingresso dei dati e forniscono in uscita qualcos’altro. In <strong>Matlab</strong> vi sono molti modiper definire una funzione.Supponiamo ad esempio di voler una funzione fun(x) che restituisca il valore di f(x) =x sin x +cos 2 x, per un dato x. Il metodo “storico” (legacy) consiste nel definire la stringa corrispondentealla funzione, e poi valutarla così come se fosse stata scritta al momento tramite il comandoeval:>> fun = ’x*sin(x) + (cos(x))^2’;>> x = 1.0;>> eval(fun)ans =1.1334Osserviamo fin da subito un problema:>> x = [ 1 2 3 ];>> eval(fun)Error using ∗Inner matrix dimensions must agree .Infatti, se x è un vettore, sin(x) sarà un vettore di pari dimensioni, e il prodotto con x*sin(x)non sarà possibile. Bisogna vettorizzare l’espressione, andando a mettere il punto dove serve (ameno che la funzione scritta non debba davvero essere intesa in senso vettoriale):>> fun = ’x.*sin(x) + cos(x).^2’;>> x = [ 1 2 3 ];>> eval(fun)ans =1.1334 1.9918 1.4034Esiste inoltre il comando vectorize che trasforma la funzione nella sua versione vettoriale.Moltissimi codici (soprattutto datati) usano ancora eval, ma vi sono ottime ragioni per evitarlo:prima tra tutte è scomodo definire x ogni volta.Una seconda possibilità, che utilizzeremo molto più spesso, si basa sul concetto di funzionianonime.>> fun = @(x) x.∗ sin(x) + cos(x).ˆ2;>> x = [ 1 2 3 ];>> fun(x)ans =1.1334 1.9918 1.4034Il simbolo @ è detto function handle. Attenzione che il comando vectorize non funziona inquesto caso. Si possono anche avere più argomenti o restituire matrici e vettori:>> fun = @(x,y) [ x.ˆ2 , x∗y; x∗y, y.ˆ2 ];>> fun (1 ,2)ans =1 22 4– 10 –


Laboratorio I <strong>Introduzione</strong> a <strong>Matlab</strong> R <strong>ed</strong> <strong>Aritmetica</strong> Floating–PointVi sono almeno altri due modi per definire le funzioni da linea di comando, che però non approfondiremo:inline e tramite il Toolbox simbolico. Approfondiamo invece l’ultimo caso, ossiatramite script.Uno script è un file di testo con estensione .m, contenente un listato di comandi che <strong>Matlab</strong>eseguirà una volta richiamato il file. Quest’ultimo può essere modificato tramite unqualsiasi <strong>ed</strong>itor di testi, oppure con l’<strong>ed</strong>itor interno richiamato con il comando:>> <strong>ed</strong>itSupponiamo ad esempio che il file myscript.m contenga:clear ; clc ;% Questo e ’ un commento:% somma dei quadrati della diagonale% della matrice magican = 4;A=magic(n);somma = sum( diag(A) . ˆ 2 )Se il file si trova nella directory di lavoro, allora:>> myscriptsomma =414ossia viene eseguito così come se fosse stato scritto direttamente nel terminale.Uno script può contenere anche solo una funzione, con questa sintassi:function y = myfun(x)y = x.∗ sin(x) + (cos(x)).ˆ2;endIn questo caso è obbligatorio salvare il file con lo stesso nome della funzione (quindi myfun.m).>> x = [ 1 2 3 ];>> myfun(x)ans =1.1334 1.9918 1.4034Gli script di funzioni possono contenere al più una funzione (volendo però esistono le funzioniinterne o nest<strong>ed</strong> che non tratteremo), <strong>ed</strong> è buona norma usare nomi in minuscolo e senza spazi.È possibile inoltre avere funzioni che prendano in ingresso più argomenti e ne restituiscanoaltrettanti:function [A, b] = vecmat(n, m)%VECMAT G e n e r o u n a m a t r i c e e u n v e t t o r e .% [A,B] = VECMAT(N,M) Genera una matrice A di dimensione M x N% e un vettore B di dimensione N x 1, casuali .A=rand(n,m);b = rand(n,1);endA questo punto possiamo richiamarla:>> [K, f ] = vecmat(2 ,3)K=0.4387 0.7655 0.18690.3816 0.7952 0.4898f =0.44560.6463– 11 –


Laboratorio I <strong>Introduzione</strong> a <strong>Matlab</strong> R <strong>ed</strong> <strong>Aritmetica</strong> Floating–Point>> vecmat (2 ,3)ans =0.6787 0.7431 0.65550.7577 0.3922 0.1712>> help vecmatVECMAT G e n e r o una m a t r i c e e un v e t t o r e[A,B] = VECMAT(N,M) Genera una matrice A di dimensione M x Ne un vettore B di dimensione N x 1, casuali .Cicli e controlli<strong>Matlab</strong> ha un linguaggio di programmazione vero e proprio, interpretato. Molte operazioni peril controllo del flusso sono dunque disponibili.>> for i = 1:3 , magic( i), end ;ans =1ans =1 34 2ans =8 1 63 5 74 9 2>> n=1; while n < 4, magic(n) , n = n+1; end ;ans =1ans =1 34 2ans =8 1 63 5 74 9 2>> if rand(1) > 0.5 , disp( ’Maggiore 0.5’); else , disp( ’Minore 0.5’); end ;Maggiore 0.5Mano a mano che serviranno ulteriori dettagli, v<strong>ed</strong>remo di aggiungerli. In genere la struttura èmolto intuitiva. Come si può osservare, scrivere questi controlli da linea di comando è piuttostoscomodo e poco leggibile: si preferisce quindi scrivere tutto in uno script, con una correttaindentazione, <strong>ed</strong> eseguire man mano quello che serve.Esercizio 1.5• Scrivere una funzione dal nome cub<strong>ed</strong>iag che, data in ingresso una matrice A, restituiscala somma dei cubi della diagonale.• Scrivere una nuova funzione cubeantidiag che restituisca la somma dei cubi dell’antidiagonale(ossia quella simmetrica rispetto a quella normale).GraficiPer disegnare il grafico di una funzione reale di variabile reale si utilizza il comando plot. Nellasua versione di base, la sintassi prev<strong>ed</strong>e che siano dati in ingresso due vettori x <strong>ed</strong> y della stessadimensione, che indicano la posizione dei punti.– 12 –


Laboratorio I <strong>Introduzione</strong> a <strong>Matlab</strong> R <strong>ed</strong> <strong>Aritmetica</strong> Floating–Point>> x = linspace( −1, 1, 100);>> parab = @(x) x .ˆ2;>> plot(x, parab(x));10.90.80.70.60.50.40.30.20.10−1 −0.8 −0.6 −0.4 −0.2 0 0.2 0.4 0.6 0.8 1Per controllare stile, dimensione, colore del tratto, vi sono numerose opzioni, che tipicamentesono inserite subito dopo l’ultimo argomento, in questo modo:>> x = linspace( −1, 1, 20);>> plot(x,parab(x) , ’r*--’ , ’LineWidth’ , 2.0 , ’MarkerSize’ , 15.0);>> grid on ;>> xlabel( ’Ascissa’);>> ylabel( ’Ordinata’);>> title( ’Una parabola’ , ’FontWeight’ , ’bold’);1Una Parabola0.90.80.70.6Ordinata0.50.40.30.20.10−1 −0.8 −0.6 −0.4 −0.2 0 0.2 0.4 0.6 0.8 1Ascissa– 13 –


Laboratorio I <strong>Introduzione</strong> a <strong>Matlab</strong> R <strong>ed</strong> <strong>Aritmetica</strong> Floating–PointDigitando help plot o doc plot si avrà una panoramica di tutte le possibili combinazioni perlo stile. Il più utilizzato è il terzo argomento, ossia la stringa r*--: tradotto risulta r = r<strong>ed</strong>, cioètratto di linea rosso, *, cioèmarkers a forma di asterisco, e --, ossia linea a tratti. L’ordine èfissato, ma ognuno è facoltativo: scrivendo semplicemente y si ha una linea gialla (yellow).Per sovrapporre dei grafici, si può proc<strong>ed</strong>ere in diversi modi:>> x = linspace( −1, 1, 20);>> parab = @(x) x .ˆ2;>> cubic = @(x) x.ˆ3;>> plot(x, parab(x) , x, cubic(x));oppure:>> plot(x, [parab(x); cubic(x )]);oppure:>> plot(x, parab(x));>> hold all ;>> plot(x, cubic(x));>> hold off ;Si può aggiungere una legenda con il comando:>> legend( ’Parabola’ , ’Cubica’);10.8parabcubic0.60.40.20−0.2−0.4−0.6−0.8−1−1 −0.8 −0.6 −0.4 −0.2 0 0.2 0.4 0.6 0.8 1Esercizio 1.6Disegnare il grafico della funzione f(x) =2+(x − 3) sin ( 5(x − 3) ) ,per0≤ x ≤ 6. Sovrapporrea questo grafico, in linea a tratti, le rette che delimitano tale funzione.Un altro tipo di grafico molto importante, in particolare quando si deve valutare l’andamentodell’errore rispetto a dei parametri, è quello in scala logaritmica o semilogaritmica. Per una datafunzione f(x), con grafico y = f(x):– 14 –


Laboratorio I <strong>Introduzione</strong> a <strong>Matlab</strong> R <strong>ed</strong> <strong>Aritmetica</strong> Floating–Point• semilogx rappresenta i punti dopo il cambio di variabile x ↦→ log x;• semilogy rappresenta i punti dopo il cambio di variabile y ↦→ log y;• loglog effettua entrambi i prec<strong>ed</strong>enti cambi di variabile.Ad esempio, il grafico y =e αx , in scala y–logaritmica diventa ỹ := log y = αx, ossia una retta.>> x = linspace (1 , 10, 100);>> semilogy(x, exp(x) , x, exp(2∗ x), ’LineWidth’ , 2.0);>> grid on ;>> legend( ’Pendenza 1’ , ’Pendenza 2’ , ’Location’ , ’NorthWest’);10 10 Pendenza 1Pendenza 210 810 610 410 210 01 2 3 4 5 6 7 8 9 10Esercizio 1.7Sia f(x) = (log x) 2 per 0.1 ≤ x ≤ 10. Cosa ci si aspetta dal grafico in scala x–logaritmica?Disegnare e verificare.Cifre significativeSia ˆx una approssimazione di un numero x ∈ R. Per misurare l’accuratezza di ˆx ci sono:E abs (ˆx) :=|x − ˆx|,E rel (ˆx) :=(errore assoluto)|x − ˆx|, x ≠0. (errore relativo)|x|L’errore relativo può anche essere definito come E rel (ˆx) =|ρ|, doveρ è tale che ˆx = x(1 + ρ). Ilprincipale vantaggio dell’errore relativo è che non risente dei riscalamenti.Un concetto legato all’errore relativo è quello delle cifre significative. Da un punto di vistamatematico è difficile dare una definizione che metta tutti d’accordo, perciò limiteremo l’interesseper questo argomento soltanto a questa sezione, mentre in futuro ci affideremo alla nozione, benpiù robusta, di errore relativo.– 15 –


Laboratorio I <strong>Introduzione</strong> a <strong>Matlab</strong> R <strong>ed</strong> <strong>Aritmetica</strong> Floating–PointSia s il più grande intero tale che |x| ≥ 10 s . Diremo allora che l’approssimazione ˆx di x ha pcifre significative quando p è il più grande intero tale cheE abs (ˆx) ≤ 1 2 × 10s−p+1 .Ad esempio, siano x =0.127 e ˆx =0.123; allora s = −1 eE abs =0.4 · 10 −2 ≤ 0.5 · 10 −2 ,quindise s − p +1=−2 si ha p = 2.Quando x non è a disposizione (come in gran parte delle applicazioni), si può ragionare per approssimazionisuccessive. Supponiamo di avere una sequenza {x i } ∞ i=0 che tende a x: si consideracome errore assoluto al passo i–esimo |x i − x i−1 |,peri>0.Al esempio siano dati:Le cifre significative saranno le seguenti:x 0 =0.82707464509147,x 1 =0.82413716191931,x 2 =0.82413231231575,x 3 =0.82413231230252.|x 0 − x 1 | =0.00293748317217 ≤ 0.5 · 10 −2 ⇒ p =2,|x 1 − x 2 | =4.84960355884301 · 10 −6 ≤ 0.5 · 10 −5 ⇒ p =5,|x 1 − x 2 | =1.322519871393979 · 10 −11 ≤ 0.5 · 10 −10 ⇒ p = 10.Esercizio 1.8Si completi la seguente tabella (usare format short per l’errore relativo):x ˆx Errore relativo Errore assoluto Cifre significative1.6925 1.69285 – – –23.130 23.129 – – –23.130 23.1299 – – –23.130 23.129999 – – –0.00345 0.00343 – – –0.01008 0.01012 – – –0.01008 0.01002 – – –0.01008 0.0102 – – –<strong>Aritmetica</strong> in virgola mobileI numeri naturali N, seppur infiniti, possono essere rappresentati esattamente sul calcolatoreentro una finestra prefissata di valori. Ad esempio, un numero intero 32–bit può rappresentarein formato binario i numeri da 0 a 2 32 − 1. Oppure, con lo stesso intero, rappresentiamo i numeriinteri Z (per l’appunto) da −2 31 fino a 2 31 − 1.I numeri reali R, in una qualsiasi finestra scelta, rimangono invece troppi per essere rappresentatitutti. Vi sono almeno due possibilità: la prima consiste nel fissare il numero di cifre dopo la– 16 –


Laboratorio I <strong>Introduzione</strong> a <strong>Matlab</strong> R <strong>ed</strong> <strong>Aritmetica</strong> Floating–Pointvirgola (fix<strong>ed</strong>–point). La seconda invece considera l’insieme proprio F ⊂ R dei numeri a virgolamobile (floating–point):y = ±m × β e−t ,dove β è la base, t è la precisione <strong>ed</strong> e ∈ [e min ,e max ] l’esponente. Per esempio, con β = 2, t = 3,e min = −1 <strong>ed</strong> e max = 3 si possono rappresentare i seguenti numeri:0, 0.25, 0.3125, 0.3750, 0.4375, 0.5, 0.625, 0.750, 0.875, 1.0,1.25, 1.50, 1.75, 2.0, 2.5, 3.0, 4.0, 5.0, 6.0, 7.0.0 1 2 3 4 5 6 7Lo standard IEEE–754 fissa i valori per i parametri in due importanti casi: singola precisione(single–precision o float in C), dove β = 2, t = 24, e min = −125 <strong>ed</strong> e max = 128, e doppiaprecisione (double–precision o double in C), dove β = 2, t = 53, e min = −1021 <strong>ed</strong> e max = 1024.L’epsilon macchina ε M = β 1−t è la distanza tra 1 e il numero subito successivo in F; in singolaprecisione è circa 1.19 × 10 −7 , in doppia invece 2.22 × 10 −16 . Si può mostrare che per un datox ∈ F, ilsuosuccessivoinF cade nell’intervallo [β −1 ε M |x|, ε M |x|].In <strong>Matlab</strong> possiamo v<strong>ed</strong>ere quanto valgono ε M <strong>ed</strong> i limiti di F:>> epsans =2.2204e−16>> realmaxans =1.7977e+308>> realminans =2.2251e−308Come si osserva dal grafico dell’esempio prec<strong>ed</strong>ente, la distanza tra i numeri in F non è costante.Il comando eps di <strong>Matlab</strong> permette di sapere queste distanze:>> eps (1)ans =2.2204e−16>> eps (10)ans =1.7764e−15>> eps (100)ans =1.4211e−14>> eps(1000)ans =1.1369e−13L’insieme F mette a disposizione anche alcuni casi eccezionali:>> 1e400ans =Inf>> 1e−400ans =0– 17 –


Laboratorio I <strong>Introduzione</strong> a <strong>Matlab</strong> R <strong>ed</strong> <strong>Aritmetica</strong> Floating–Point>> 1/0ans =Inf>> 0/0ans =NaNIl numero Inf è ∞, nel senso che è oltre realmax. Non è da considerarsi un errore, nel sensoche le operazioni aritmetiche sono ancora valide (benché spesso dannose). Se si è sotto realmin,allora viene approssimato a 0. La situazione NaN (Not–a–Number) indica invece che il risultatonon ha senso.L’algebra dell’insieme F è diversa da quella di R, nel senso che alcune proprietà non sonocorrisposte. La più importante è la proprietà associativa (e distributiva) che non vale più:>> x = 1.0e−15;>> (1+x)−1ans =1.1102e−15>> (1−1)+xans =1.0000e−15Questo è legato agli errori di cancellazione, ossia l’operazione x − y non è accurata in Fquando x ≈ y. Il problema è piuttosto serio, in quando la situazione è abbastanza comune(v<strong>ed</strong>remo il caso del calcolo di derivate a questo proposito). Ad esempio, sianof(x) = 1 − cos xx 2 , g(x) = 1 2( ) 2 sin(x/2).x/2Proviamo a valutare entrambe le funzioni (che sono identiche) per x =1.2 × 10 −8 :>> x = 1.2e−8;>> (1−cos(x))/xˆ2;ans =0.7710>> 0.5∗ ( sin(x/2)/(x/2) )ˆ2;ans =0.5000Il primo risultato è chiaramente sbagliato (oltretutto 0 ≤ f(x) ≤ 0.5).È buona norma evitare il più possibile casi di questo tipo, che sono molto frequenti. Ad esempio:f(x) = ex − 1, per x ≈ 1;xx 1,2 = −b ± √ b 2 − 4ac, per b 2 ≈ 4ac e b ≈ √ b2a2 − 4acs 2 n = 1 ( ∑nn − 1 i=1 x2 i − 1 (∑)n 2i)nx i=1Nell’ultimo caso, sul calcolo della varianza, si possono addirittura ottenere risultati negativi, chenon hanno alcun senso matematico.– 18 –


Laboratorio X <strong>Introduzione</strong> a <strong>Matlab</strong> R <strong>ed</strong> <strong>Aritmetica</strong> Floating–PointEsercizio 1.9La strategia usata da Archim<strong>ed</strong>e per approssimare π considera i poligoni regolari iscritti e circoscrittinel cerchio unitario. Infatti, se n è il numero dei lati, il perimetro P n → 2π pern →∞.Partendo da un esagono, e raddoppiando in successione i lati, si trova che peri →∞si ha6 · 2 i · t i → π, dovet i soddisfa la seguente relazione:t 0 = √ 1√t2, t i+1 = i +1− 1.3 t i1. Implementare in <strong>Matlab</strong> l’algoritmo e confrontare l’approssimazione con π fornito da pi.Cosa si osserva?2. Sostituire ora la formula ricorsiva con l’equivalente:t 0 = √ 1t, t i+1 = √ i3 t2i +1+1 .Commentare eventuali differenze.Nota. Usare format long per visualizzare le differenze.Esercizio 1.10Sia p(x) =(x−1) 7 per x ∈ [0.998, 1.012]. Espandere il polinomio p(x) con la formula del binomio,e rappresentarla sovrapposta al caso non espanso. Commentare eventuali differenze.– 19 –

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!