20.05.2013 Views

ESERCITAZIONE 1 Aritmetica di macchina

ESERCITAZIONE 1 Aritmetica di macchina

ESERCITAZIONE 1 Aritmetica di macchina

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>ESERCITAZIONE</strong> 1<br />

Sulla rappresentazione interna dei numeri nel calcolatore<br />

<strong>Aritmetica</strong> <strong>di</strong> <strong>macchina</strong><br />

L’insieme R dei numeri reali è infinito, ma soltanto un sottoinsieme <strong>di</strong> R, limitato inferiormente<br />

e superiormente, è rappresentabile in un calcolatore. In seguito denoteremo<br />

con F il sottoinsieme dei numeri reali rappresentabili in un calcolatore.<br />

Per memorizzare ogni numero è <strong>di</strong>sponibile una quantità limitata <strong>di</strong> bit, più precisamente<br />

64 (<strong>di</strong> cui 52 per la mantisssa); <strong>di</strong> conseguenza i numeri che costituiscono<br />

l’aritmetica del calcolatore hanno necessariamente un numero finito <strong>di</strong> cifre binarie.<br />

In particolare, i numeri irrazionali come π oppure i numeri razionali perio<strong>di</strong>ci come<br />

1/3 o perfino numeri decimali con rappresentazione finita, ma che hanno una<br />

rappresentazione binaria perio<strong>di</strong>ca, ad esempio 0.1, sono sostituiti da una loro approssimazione<br />

con un numero finito <strong>di</strong> bit, ottenuta me<strong>di</strong>ante troncamento oppure<br />

me<strong>di</strong>ante arrotondamento. Attualmente la scelta <strong>di</strong> arrotondare è la più <strong>di</strong>ffusa.<br />

Esercizio 1 Ricordando lo standard IEEE-754r visto a lezione (mantissa della forma (1 + F)<br />

ed esponente in traslazione con bias = 1023), calcolare la rappresentazione dell numero x =<br />

2 −4 in virgola mobile normalizzata. Si noti che x è un numero <strong>di</strong> <strong>macchina</strong> (nessun errore <strong>di</strong><br />

rappresentazione) perché è una potenza <strong>di</strong> due. (Facoltativo: usando Octave confrontare la<br />

stringa <strong>di</strong> bit ottenuta con quella visualizzata per x usando il formato format bit.)<br />

Sul massimo e minimo numero rappresentabile<br />

Non sempre un’operazione tra due o più numeri <strong>di</strong> <strong>macchina</strong> produce come risultato<br />

un numero <strong>macchina</strong>; se tale operazione ha come risultato un numero più grande<br />

dell’estremo superiore <strong>di</strong> F, si genera una situazione <strong>di</strong> overflow, se ha come risultato<br />

un numero più piccolo dell’estremo inferiore <strong>di</strong> F si produce un underflow. In<br />

Matlab/Octave si possono identificare l’elemento più piccolo e più grande <strong>di</strong> F con<br />

le variabili predefinite realmin e realmax. Sappiamo che il minimo numero rappresentabile<br />

nello standard IEEE-754r, F(2, 53, −1022, 1023), è quello con la minima<br />

mantissa possibile (1) moltiplicata per 2 elevato al minimo esponente possibile (-1022),<br />

per cui scrivendo nella shell <strong>di</strong> Matlab/Octave :<br />

>>> 2^( −1022)<br />

ans = 2.2251 e−308<br />

1


2 Calcolo Numerico LT Informatica A. A. 2011–2012<br />

ve<strong>di</strong>amo che questo valore coin<strong>di</strong>ce esattamente con il valore della variabile realmin:<br />

>>> realmin<br />

ans = 2.2251 e−308<br />

>>><br />

Esercizio 2 Determinare, in maniera analoga a quanto appena effettuato per realmin, il valore<br />

del massimo numero <strong>macchina</strong> in virgola mobile normalizzata, usando doppia precisione<br />

secondo lo standard IEEE-754r Confrontare il valore ottenuto con quello della variabile<br />

Matlab/Octave realmax.<br />

Poiché realmax è il massimo numero rappresentabile, assegnando ad una variabile<br />

un numero maggiore <strong>di</strong> realmax Matlab/Octave restituisce come valore Inf<br />

(overflow):<br />

>>> a =1. e310<br />

a = I n f<br />

Differentemente, è ancora possibile assegnare ad una variabile un valore inferiore a<br />

realmin, perché il più piccolo numero rappresentabile in Matlab/Octave è:<br />

>>> realmin /2^52<br />

ans = 4.9407 e−324<br />

anche se tutti i numeri <strong>macchina</strong> compresi tra realmin (escluso) e realmin/2 52<br />

fanno parte dei cosidetti numeri denormalizzati e cioè del tipo<br />

(−1) s · (0.F) · 2 −1023<br />

e sono quin<strong>di</strong> numeri con esponente co<strong>di</strong>ficato uguale a zero, come il numero zero,<br />

ma con parte frazionaria della mantissa non nulla.<br />

Esercizio 3 Verificare che realmin non è il più piccolo numero rapresentabile in Matlab/Octave<br />

assegnando ad una variabile a un valore minore <strong>di</strong> realmin e vedendo che si ha<br />

ancora un risultato <strong>di</strong>verso da zero. Che valore viene assegnato ad a quando proviamo a dare<br />

valori più piccoli <strong>di</strong> 4.9407E − 324? Come si chiama questo fenomeno?<br />

. Che risultato si ottiene? (Facoltativo: usando<br />

Octave visualizzare cambiando il formato a format bit la co<strong>di</strong>fica interna del risultato<br />

ottenuto.)<br />

Esercizio 4 Eseguire l’assegnazione a = 1<br />

0<br />

Esercizio 5 Eseguire l’operazione aritmetica a − a. Che risultato si ottiene? (Facoltativo:<br />

usando Octave visualizzare cambiando il formato a format bit la co<strong>di</strong>fica interna del<br />

risultato ottenuto. Spiegare che criterio si usa per co<strong>di</strong>ficare internamente NaN (not a number).<br />

Qual è la <strong>di</strong>fferenza con Inf?)


Esercitazione 1: <strong>Aritmetica</strong> <strong>di</strong> <strong>macchina</strong> 3<br />

Sulla <strong>di</strong>stanza assoluta e relativa <strong>di</strong> due numeri <strong>macchina</strong> consecutivi. Precisione<br />

<strong>di</strong> <strong>macchina</strong><br />

È a tutti noto che l’insieme R dei numeri reali è denso, cioè tra due numeri reali r1 e<br />

r2 esiste sempre un numero reale r3 tale che r1 < r3 < r2. Invece il sottoinsieme F,<br />

oltre ad essere limitato inferiormente e superiormente, è anche bucato, ovvero attorno<br />

ad ogni elemento x <strong>di</strong> F esiste un piccolo intervallo vuoto, tra x e il suo successivo<br />

numero <strong>macchina</strong> che chiameremo x+. In altre parole, a <strong>di</strong>fferenza <strong>di</strong> quello che<br />

occorre in R, in F la <strong>di</strong>stanza tra x e il suo elemento successivo x+ non è infinitamente<br />

piccola, ma ha un valore ben determinato. Essendo x = (−1) s · (1 + 0.d1d2d3 · · · dτ) ·<br />

2 E e x+ = (−1) s · (1 + 0.d1d2d3 · · · dτ + 1) · 2 E , la <strong>di</strong>stanza assoluta tra x e x+ è:<br />

∆x = |x − x+| = 2 −52 · 2 E .<br />

Questo valore in Matlab/Octave si ottiene scrivendo eps(x). Si noti che questa<br />

<strong>di</strong>stanza è uguale per tutti i numeri <strong>macchina</strong> aventi lo stesso esponente. Si noti anche<br />

che l’incremento/decremento <strong>di</strong> una unità dell’esponente comporta un incremento/decremento<br />

<strong>di</strong> in fattore 2 (pari alla base) della <strong>di</strong>stanza assoluta tra due numeri<br />

<strong>macchina</strong> consecutivi. Infatti se calcoliamo con Matlab/Octave quanto vale eps(x)<br />

per numeri x presi a caso nell’intervallo [4,8), che in virgola mobile normalizzata con<strong>di</strong>vidono<br />

l’esponente E = 2 1 , otteniamo per tutti la stessa <strong>di</strong>stanza assoluta con il<br />

loro successivo numero <strong>macchina</strong>:<br />

>>> eps ( 4 )<br />

ans = 8.88178419700125 e−16<br />

>>> eps ( 5 )<br />

ans = 8.88178419700125 e−16<br />

>>> eps ( 5 . 9 8 7 6 5 4 )<br />

ans = 8.88178419700125 e−16<br />

>>> eps ( 6 . 7 )<br />

ans = 8.88178419700125 e−16<br />

>>> eps ( 7 . 9 9 9 9 9 9 9 )<br />

ans = 8.88178419700125 e−16<br />

Calcolando invece:<br />

>>> eps ( 8 )<br />

ans = 1.77635683940025 e−15<br />

Realizzando la verifica<br />

>>> eps ( 4 ) ==eps ( 8 ) /2<br />

ans = 1<br />

1 Il numero 4 in base 10 si scrive in binario come 100, e quin<strong>di</strong> viene co<strong>di</strong>ficato come 1.0 · 2 2 . Ci sono<br />

2 52 mantisse possibili partendo da quella del numero 4 prima <strong>di</strong> arrivare a co<strong>di</strong>ficare il numero 8 che in<br />

binario è 1000 e si rappresenta internamente come 1.0 · 2 3 .


4 Calcolo Numerico LT Informatica A. A. 2011–2012<br />

e ricordando che in un costrutto logico il valore 1 significa true, ve<strong>di</strong>amo che il valore<br />

della <strong>di</strong>stanza assoluta tra 8 e il suo successivo numero <strong>macchina</strong> è il doppio rispetto<br />

a quella ottenuta precedentemente per i numeri con esponente 2, perché 8 si co<strong>di</strong>fica<br />

internamente con esponente 3. Questo mette in evidenza il fatto che i numeri <strong>macchina</strong><br />

non sono equispaziati, ma più addensati intorno ai numeri piccoli e si <strong>di</strong>radano<br />

man mano che il loro valore assoluto aumenta.<br />

Esercizio 6 Calcolare la <strong>di</strong>stanza assoluta tra x e il suo succesivo numero <strong>macchina</strong>, per<br />

x = 1, 100, 10 6 , 10 9 , 10 12 . Cosa si osserva? Quanto vale eps(realmax)?<br />

La <strong>di</strong>stanza relativa, invece, si ottiene <strong>di</strong>videndo quella assoluta per il numero<br />

x, e poiché il numeratore sarà uguale per tutti i numeri <strong>macchina</strong> x che hanno lo<br />

stesso esponente E, ma la mantissa può assumere valori tra 1 e quasi 2 (2 − 2 −52 ),<br />

questa <strong>di</strong>stanza relativa assumerà valori variabili <strong>di</strong> poco (nell’intervallo (2 −53 , 2 −52 ]),<br />

essendo il massimo valore possibile 2 −52 . La metà <strong>di</strong> questa quantità è il valore della<br />

precisione <strong>di</strong> <strong>macchina</strong>, u (in inglese unit roundoff), che rappresenta il massimo errore<br />

relativo che si commette nell’approssimare il numero reale x con il suo corrispondente<br />

numero <strong>macchina</strong>, fl(x).<br />

Il minor numero che sommato a x da un numero maggiore <strong>di</strong> x è, tenendo conto<br />

dell’arrotondamento, la metà della <strong>di</strong>stanza assoluta che lo separa dal successivo<br />

numero <strong>macchina</strong>, e quin<strong>di</strong> è uguale a |x − x+|/2 = eps(x)/2. Purtroppo in Matlab/Octave<br />

, questo non è esattamente così perché nel caso <strong>di</strong> un numero che cade<br />

esattamente a metà tra due numeri <strong>di</strong> <strong>macchina</strong> consecutivi, x e x+, lo standard IEEE<br />

adottato da Matlab/Octave stabilisce che il numero venga arrotondato al valore più<br />

piccolo dei due, cioè x (schema <strong>di</strong> arrotondamento chiamato ties to even).<br />

Comunque ci si può accertare che sommando a x un numero appena più grande<br />

<strong>di</strong> eps(x)/2, ad esempio, eps(x)/1.999 il risultato è il numero <strong>macchina</strong> successivo ad<br />

x. Ad esempio per il numero 1:<br />

>>> 1+eps ( 1 ) −1<br />

ans = 2.22044604925031 e−16<br />

>>> (1+ eps ( 1 ) /2)−1<br />

ans = 0.00000000000000 e+00<br />

>>> (1+ eps ( 1 ) /1.9999)−1<br />

ans = 2.22044604925031 e−16<br />

In<strong>di</strong>pendentemente da questo, la <strong>di</strong>stanza |x − x+| determina l’or<strong>di</strong>ne <strong>di</strong> grandezza<br />

del minor numero che sommato ad un numero <strong>macchina</strong> x fornirà come risultato<br />

un numero maggiore <strong>di</strong> x. Infatti calcolando:<br />

>>> format long e<br />

>>> 1+eps ( 1 )<br />

ans = 1.00000000000000 e+00<br />

>>> 1+eps ( 1 ) −1<br />

ans = 2.22044604925031 e−16


1000+ eps ( 1 )<br />

ans = 1.00000000000000 e+03<br />

>>> 1000+ eps ( 1 ) −1000<br />

ans = 0.00000000000000 e+00<br />

Esercitazione 1: <strong>Aritmetica</strong> <strong>di</strong> <strong>macchina</strong> 5<br />

ve<strong>di</strong>amo che il calcolatore non è in grado <strong>di</strong> interpretare come un incremento <strong>di</strong>verso<br />

da zero il numero eps(1) quando viene sommato a 1000, mentre lo riconosce come<br />

numero non nullo quando viene sommato a 1. Il più piccolo incremento del numero<br />

1000 riconosciuto dal calcolatore e dell’or<strong>di</strong>ne <strong>di</strong> eps(1000):<br />

>>> 1000+ eps ( 1 0 0 0 )<br />

ans = 1.00000000000000 e+03<br />

>>> 1000+ eps ( 1 0 0 0 ) −1000<br />

ans = 1.13686837721616 e−13<br />

Esempi <strong>di</strong> errori numerici. Cancellazione numerica<br />

Ve<strong>di</strong>amo adesso alcuni esempi <strong>di</strong> errori numerici che ci permettono <strong>di</strong> comprendere<br />

meglio quelli che sono i problemi legati all’aritmetica finita usata dal calcolatore.<br />

Un noto problema numerico è quello della cancellazione <strong>di</strong> cifre significative nella<br />

sottrazione <strong>di</strong> due numeri quasi uguali alla precisione <strong>di</strong> <strong>macchina</strong>. Ad esempio,<br />

calcolando con Matlab/Octave l’espressione ((x + 1) − 1)/x per x = 10 −15 , il cui<br />

risultato esatto ovviamente è 1, si ottiene:<br />

>>> x = 1 . e−15<br />

x = 1.0000 e−15<br />

>>> ( ( 1 + x ) −1)/x<br />

ans = 1.1102<br />

Se effettuiamo le operazioni precedenti in quest’altro or<strong>di</strong>ne:<br />

>>> (1 −1)+x<br />

ans = 1.00000000000000 e−15<br />

possiamo vedere che in generale la somma non è associativa in F.<br />

Esercizio 7 Si prenda x = 1.005, il calcolo del valore del polinomio q7(x) = (x − 1) 7<br />

in questo punto produce come risultato il valore α = 7.8125 · 10−17 , mentre quello del<br />

polinomio p7(x) = x7 − 7x6 + 21x5 − 35x4 + 35x3 − 21x2 + 7x − 1 da come risultato<br />

¯α = −8.88178419700125 · 10−16 . Perché?<br />

α − ¯α<br />

Quanto vale l’errore relativo |<br />

α |?<br />

Svolgimento:<br />

Introduciamo in Matlab/Octave il valore <strong>di</strong> x = 1.005 e calcoliamo q7(x) e p7(x):<br />

>>> x =1.005<br />

x = 1.0050<br />

>>> alpha =(x−1)^7<br />

alpha = 7.8125 e−17


6 Calcolo Numerico LT Informatica A. A. 2011–2012<br />

>>> alpha_bar=x^7−7∗x^6+21∗x^5−35∗x^4+35∗x^3−21∗x^2+7∗x−1<br />

alpha_bar = −8.8818e−16<br />

>>><br />

L’errore relativo calcolato è:<br />

>>> e r r _ r e l =abs ( ( alpha−alpha_bar ) /alpha )<br />

e r r _ r e l = 12.369<br />

Se arrestassimo il calcolo precedente dopo aver effettuato le operazioni x 7 − 7x 6 +<br />

21x 5 − 35x 4 + 35x 3 − 21x 2 + 7x, otterremmo il valore:<br />

>>> format long<br />

>>> beta_bar=x^7−7∗x^6+21∗x^5−35∗x^4+35∗x^3−21∗x^2+7∗x<br />

beta_bar = 0.999999999999999<br />

che dovremmo confrontare con il valore vero q7(x) + 1, cioè, β = 1 + α = 1 +<br />

7.8125 · 10 −17 che in aritmetica <strong>di</strong> <strong>macchina</strong> vale 1. L’errore relativo in questo caso è:<br />

>>> e r r _ r e l 2 =abs ( ( beta−beta_bar ) /beta )<br />

e r r _ r e l 2 = 8.88178419700125 e−16<br />

Osserviamo dunque che l’errore relativo accumulato fino alla penultima operazione<br />

è piccolissimo (dell’or<strong>di</strong>ne della precisione <strong>di</strong> <strong>macchina</strong>), mentre dopo l’ultima sottrazione<br />

l’errore relativo passa ad essere ben maggiore del cento per cento (1236.9%).<br />

Ve<strong>di</strong>amo dunque che i piccoli errori assoluti introdotti durante il calcolo <strong>di</strong> p7(x), che<br />

sono dell’or<strong>di</strong>ne della precisione <strong>di</strong> <strong>macchina</strong>, <strong>di</strong>ventano preponderanti dal momento<br />

che nell’ultima operazione il valore risultato è molto piccolo. Questo ci <strong>di</strong>ce che<br />

gli inevitabili errori introdotti durante le operazioni aritmetiche saranno più o meno<br />

significativi in funzione del valore assoluto del risultato.<br />

Stabilità <strong>di</strong> un algoritmo<br />

Ricor<strong>di</strong>amo che un metodo numerico (formula, algoritmo) si <strong>di</strong>ce stabile se non<br />

propaga eccessivamente gli errori presenti nei dati iniziali. Altrimenti si <strong>di</strong>ce instabile.<br />

La stabilità è quin<strong>di</strong> un concetto legato all’algoritmo usato per risolvere un<br />

determinato problema. Si consideri il seguente esercizio:<br />

Esercizio 8 Per il calcolo della successione <strong>di</strong> integrali definiti<br />

In = 1<br />

1<br />

x<br />

e 0<br />

n e x dx,<br />

si consideri la seguente formula ricorsiva per il calcolo <strong>di</strong> In:<br />

s0 = 1<br />

1<br />

e<br />

e 0<br />

x dx = 1 − 1<br />

e<br />

sn+1 = 1 − (n + 1)sn, n ≥ 0<br />

Ricordando che la successione In è descrescente e verifica 0 < In < 1, ∀n, si scriva un m-file<br />

che implementa l’algoritmo precedente e calcola sn per un n fissato. Si calcoli ad esempio I25.<br />

La ricorrenza è stabile?


Esercitazione 1: <strong>Aritmetica</strong> <strong>di</strong> <strong>macchina</strong> 7<br />

Per calcolare I25 utilizzare un algoritmo stabile. Posto m = 40, si implementi la seguente<br />

ricorrenza:<br />

tm = 1<br />

1<br />

x<br />

e 0<br />

m e x dx<br />

tk−1 = 1 − tk , k = m, m − 1, . . . , 26, . . . , 2<br />

k<br />

dove si pone per esempio tm = 0.5 (valore arbitrario minore <strong>di</strong> 1).<br />

Una possibile implementazione <strong>di</strong> quanto richiesto nell’esercizio potrebbe essere la<br />

seguente:<br />

% SCRIPT MATLAB PER IL CALCOLO DELLA<br />

% SUCCESSIONE RICORRENTE .<br />

% SUCCESSIONE " s_n " ( IN AVANTI) .<br />

%CALCOLA s_n=I_n , PER n=1:25<br />

s ( 1 ) =exp( −1) ;<br />

n=25;<br />

f o r k =1:n−1<br />

s ( k+1)=1−(k+1) ∗ s ( k ) ;<br />

end<br />

% SUCCESSIONE " t_n " (ALL’ INDIETRO) .<br />

% PER CALCOLARE I VALORI TRA<br />

% 25 E 1 , PARTO DAL VALORE I_40 approssimato con 0 .<br />

N=n+15;<br />

% INIZIALIZZAZIONE DEL VETTORE " t " DEI VALORI<br />

%GENERATI CON LA RICORRENZA ALL’ INDIETRO<br />

t =zeros (N, 1 ) ;<br />

f o r k=N: −1:2<br />

j =k−1;<br />

t ( j ) =(1− t ( k ) ) /k ;<br />

end<br />

% ESEGUE UNA MATRICE 2 x 1 DI GRAFICI .<br />

% IL PRIMO GRAFICO LO METTE IN ( 1 , 1 ) .<br />

f i g u r e ( 1 ) ;<br />

c l f ;<br />

%−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

% PRIMO GRAFICO : PLOT SEMI−LOGARITMICO.<br />

%−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

subplot ( 2 , 1 , 1 ) ;<br />

semilogy ( 1 : n , abs ( s ) , ’k−’ , 1 : n , abs ( t ( 1 : n ) ) , ’m−’ ) ;<br />

t i t l e ( ’ Valori c a l c o l a t i in avanti e i n d i e t r o ’ ) ;<br />

% IL SECONDO GRAFICO LO METTE IN ( 1 , 2 ) .<br />

z=s ’− t ( 1 : n ) ;<br />

subplot ( 2 , 1 , 2 ) ;


8 Calcolo Numerico LT Informatica A. A. 2011–2012<br />

semilogy ( 1 : n , abs ( z ) , ’g−’ ) ;<br />

t i t l e ( ’ Differenza t r a i v a l o r i c a l c o l a t i in avanti e i n d i e t r o ’ ) ;<br />

%−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

% ANALISI DI t ( 1 ) PARTENDO DA DIFFERENTI<br />

% t (m) =0; m= 2 , 3 , . . . , 2 0<br />

%−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

t _ 1 _ e x a c t =exp( −1) ;<br />

f o r m=2:20<br />

t t = 0 . 5 ; % INIZIALIZZAZIONE " t " .<br />

f o r k=m: −1:2 % SI OSSERVI CHE IL CICLO VA DA "m" A 2 .<br />

t t =(1− t t ) /k ;<br />

end<br />

e r r _ t _ 1 (m) =abs ( t_1_exact −t t ) ;<br />

f p r i n t f ( ’\n \ t [M] : %2.0 f [ERR . ] : %10.15 f ’ ,m, e r r _ t _ 1 (m) ) ;<br />

end<br />

%−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

% TERZO GRAFICO : ERRORI ASSOLUTI .<br />

%−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

f i g u r e ( 2 ) ;<br />

semilogy ( 2 : 2 0 , abs ( e r r _ t _ 1 ( 2 : 2 0 ) ) , ’b−’ ) ;<br />

t i t l e ( ’Andamento d e l l ’ ’ e r r o r e su I1 ottenuto partendo da m a l l ’ ’ i n d i e t r o ’ ) ;<br />

x l a b e l ( ’m’ ) ;<br />

Dopo aver <strong>di</strong>gitato sulla shell <strong>di</strong> Matlab/Octave il nome del file contenente questo<br />

script (senza l’estensione .m) otteniamo tre grafici 2 . I primi due confrontano i valori<br />

ottenuti con le due successioni: si vede che quella in avanti (in nero) non converge,<br />

mentre quella all’in<strong>di</strong>etro sembra convergere a zero. Il terzo grafico mostra gli errori<br />

della successione all’in<strong>di</strong>etro nell’approssimazione del valore iniziale I0 partendo da<br />

<strong>di</strong>versi valori m. Si osserva come, evidentemente, al crescere <strong>di</strong> m, l’approssimazione<br />

<strong>di</strong>venta sempre più accurata, arrivando ad avere errore nullo dopo 17 iterazioni all’in<strong>di</strong>etro<br />

(si noti che dopo questo numero <strong>di</strong> iterazioni all’in<strong>di</strong>etro l’errore iniziale è<br />

stato <strong>di</strong>viso per 17!).<br />

Esercizi proposti<br />

Esercizio 1 Al variare <strong>di</strong> x = 10−1 , 10−2 , 10−3 , . . . , 10−15 , si definiscano i numeri reali<br />

a = 1 + x e b = −1. Si confronti il valore numerico della somma a + b calcolato con Matlab/Octave<br />

con il valore esatto della somma, cioè x (impostare il formato <strong>di</strong> visualizzazione<br />

|(a + b) − x|<br />

a format long e ). Calcolare l’errore relativo . Commentare l’andamento<br />

x<br />

degli errori al variare <strong>di</strong> x. Qual è la percentuale dell’errore relativo per x = 10−15 ?<br />

Suggerimento:<br />

si possono usare ad esempio le seguenti istruzioni:<br />

x = 1 0 . ^ ( − [ 1 : 1 5 ] ) ’ ;<br />

2 Il comando subplot permette <strong>di</strong> plottare più grafici nella stessa finestra <strong>di</strong> Matlab/Octave senza<br />

sovrapporli. Per ulteriori informazioni consultare la help <strong>di</strong> Matlab/Octave .


a=ones ( 1 5 , 1 ) +x ;<br />

b=−ones ( 1 5 , 1 ) ;<br />

e r r _ r e l =abs ( ( a+b−x ) ./ x ) ;<br />

[ a+b , x , e r r _ r e l ]<br />

Esercitazione 1: <strong>Aritmetica</strong> <strong>di</strong> <strong>macchina</strong> 9<br />

Esercizio 2 Si scriva uno script Matlab/Octave per il calcolo della ra<strong>di</strong>ce <strong>di</strong> minimo modulo<br />

(s1) dell’equazione <strong>di</strong> secondo grado x 2 + bx + c = 0, usando la formula canonica <strong>di</strong><br />

risoluzione (ALG.1) e anche la formula stabile (ALG.2). Assumere b = 10 7 e c = 10 −2 . Per il<br />

calcolo dell’errore relativo usare come soluzione vera la ra<strong>di</strong>ce ottenuta con la formula stabile<br />

(t1 = −10 −9 ).<br />

Suggerimento:<br />

Per la formattazione dell’output, si possono usare i coman<strong>di</strong>:<br />

f p r i n t f ( ’\n \ t [ALG. 1 ] [ 1 ] : %10.19 f ’ , s1 ) ;<br />

f p r i n t f ( ’\n \ t [ALG. 2 ] [ 1 ] : %10.19 f ’ , t1 ) ;<br />

f p r i n t f ( ’\n \ t [REL . ERR . ] [ ALG. 1 ] : %2.2e ’ , r e l e r r s 1 ) ;<br />

che producono il seguente risultato:<br />

[ALG. 1 ] [ 1 ] : −9.31322575e−10<br />

[ALG. 2 ] [ 1 ] : −1.00000000e−09<br />

[REL . ERR . ] [ ALG . 1 ] : 6 . 8 7 e−02<br />

Esercizio 3 Sia<br />

Sn(x) = 1 + x + x2<br />

2<br />

x3 x4 xn<br />

+ + + · · · +<br />

3! 4! n!<br />

la troncata n-esima <strong>di</strong> exp(x). Si prenda x = −20 e si calcoli per n = 1, 2, . . . , 80 l’errore<br />

relativo<br />

|Sn(x) − exp(x)|<br />

exp(x)<br />

Cosa si osserva? Perché ciò accade?<br />

Ripetere l’esercizio con x = 20. Quanto vale l’errore relativo? Commentare i due grafici e<br />

spiegare il perché dei due <strong>di</strong>fferenti risultati ottenuti.<br />

Nota: nel grafico semilogaritmico che si ottiene per per x = −20 si osserva una<br />

gobba che arriva fino a 10 16 e poi scende fino a 1 (errore del 100%). La gobba si<br />

spiega analiticamente in connessione all’approssimazione fornita dalla troncata nesima<br />

della serie <strong>di</strong> Taylor quando |x| ≫ 0. In questo caso, all’inizio (con n piccolo)<br />

ci si allontana dal valore vero, e poi, al crescere <strong>di</strong> n, ci si avvicina al valore vero<br />

e l’errore <strong>di</strong> approssimazione tende a 0 in aritmetica infinita. Al calcolatore invece<br />

l’errore <strong>di</strong> approssimazione del valore finale sarà più o meno grande in funzione del<br />

suo valore: risultato grande implica errore relativo piccolo, mentre risultato piccolo<br />

implica errore relativo grande!


10 Calcolo Numerico LT Informatica A. A. 2011–2012<br />

Suggerimento:<br />

si implementi in un m-file (file con estensione .m) una function Matlab/Octave<br />

che prenda come input n e x, calcoli il valore <strong>di</strong> Sn(x) per ogni n = 1, 2, . . . , 80 e il<br />

vettore degli errori relativi usando come valore vero exp(x). Plottare in un grafico<br />

semilogaritmico l’andamento degli errori al crescere <strong>di</strong> n. Ad esempio si può usare il<br />

seguente m-file:<br />

function [ val , e r r ]= troncata_exp ( x , n )<br />

%Calcola i l valore approssimato <strong>di</strong> exp ( x ) come t r o n c a t a n−esima<br />

%dell ’ espansione in s e r i e <strong>di</strong> Taylor .<br />

add =1; val =1; vero=exp ( x ) ;<br />

f o r i =1:n<br />

add=add∗x/ i ;<br />

val=val+add ;<br />

e r r ( i ) =( val − vero ) /vero ;<br />

end<br />

semilogy ( 1 : n , abs ( e r r ) , ’ r−’ )<br />

Esercizio 4 (Facoltativo) Per il calcolo della seguente successione <strong>di</strong> integrali definiti<br />

1<br />

In =<br />

0<br />

x n<br />

x + 5 dx,<br />

si consideri la seguente formula ricorsiva per il calcolo <strong>di</strong> In:<br />

s0 = ln(1.2)<br />

sn = 1<br />

n − 5sn−1<br />

n<br />

> 0<br />

Ricordando che la successione In è descrescente e verifica 0 < In < 1/6, ∀n, si scriva un mfile<br />

che implementa l’algoritmo precedente e calcola sn per un n fissato. Si calcoli ad esempio<br />

I40. La ricorrenza è stabile? Per calcolare I40 utilizzare un algoritmo stabile.<br />

Suggerimento. Si proceda come nel precedente Esercizio 8. Per l’algoritmo stabile si parta<br />

ad esempio da un valore approssimato <strong>di</strong> I65.<br />

NOTA BENE: Si porti all’esame orale una relazione scritta con la soluzione <strong>di</strong><br />

questi esercizi, i grafici ottenuti e gli m-files Matlab/Octave utilizzati.

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

Saved successfully!

Ooh no, something went wrong!