Aritmetica in Floating Point Esempio di non associatività Alcune proprietà delle operazioni in aritmetica esatta possono non valere in aritmetica finita in virgola mobile (floating point). Ad esempio: >> a=1.0e+308; >> b=1.1e+308; >> c=-1.001e+308; >> (a+b)+c ans = Inf >> a+(b+c) ans = 1.0990e+308 Esempio di cancellazione numerica In aritmetica esatta, usando la nota identità (a+b)(a b) = a 2 b 2, si ottiene facilmente x 1 + 1 x = x 2 x + 1 + x 2 R Calcolando con Matlab: >> x=77777777; >> y1=sqrt(x^2+1)-x y1 = 0 >> y2=1/(sqrt(x^2+1)+x) y2 = 6.4286e-09 >> err=abs((y1-y2)/y2) err = 1
In aritmetica esatta i valori y1 e y2 dovrebbero essere uguali e l errore relativo err nullo. In realtà i risultati ottenuti (y1 e y2) sono assai diversi. Il risultato finale dipende fortemente da come viene effettivamente calcolata la funzione (errore di arrotondamento, dovuto all aritmetica finita del calcolatore). Il risultato corretto `e y2, mentre y1 è soggetto a un fenomeno di cancellazione. Precisione di macchina L errore relativo che si commette approssimando un numero reale x con il numero floating point fl(x) è tale che dove M t = β 1 fl( x) x x Cε ε è detto epsilon macchina, dove β è la base e t il numero di cifre significative dell insieme dei numeri macchina considerato. Nel caso della doppia precisione β = 2 e t = 53. ε M può anche essere definito come il più piccolo numero macchina positivo tale che fl(1 + x) > 1. M Esercizio Verificare (in format hex) che: 1+eps > 1 1+eps/2 =1 10^20 +1 =1 (perchè?); verificare il valore di eps(1e20) ε M non va confuso con il più piccolo numero rappresentabile in un sistema floating point (quello è realmin!!!), esso definisce invece una stima di quanto possa valere al più l errore relativo quando si approssima un numero reale con un numero macchina. In Matlab è predefinita la variabile eps che contiene il suo valore. >> eps ans = 2.2204e-16
Esercizio Calcolare algoritmo: ε M scrivendo un breve codice che implementi il seguente e 0 = 1/2, k = 0 se e k + 1 > 1 allora e k+1 = e k /2 altrimenti STOP Risolvere Esercizi dall 1 al 5 Matlab come linguaggio di programmazione Cicli condizionati (comando while ) Sintassi generale: while (condizione == true) istruzione aggiornamento condizione end Cicli non condizionati con contatore (comando for ) Sintassi generale: for contatore = [elementi di un vettore] istruzione istruzione end
Istruzioni condizionali (comando if ) Sintassi generale: if (condizione1==true) istruzioni 1 elseif (condizione2==true) istruzioni 2 else istruzioni 3 end Operatori relazionali e logici Il valore 1 corrisponde ad una condizione vera, 0 ad una falsa. <, <=, >=, >, = =, ~= a == b 1 se a = b, 0 altrimenti a ~= b 1 se a b, 0 altrimenti &,, ~, xor
Per assegnare le matrici Matrici in Matlab (primi comandi) A = 4 2 5 3 6 1 3 7 21, B = 11 0 >> A=[1 2 3; 4 5 6]; >> B =[ 1 7 21;3 11 0]; Si costruiscono elencandone gli elementi per riga. Matrici particolari Matrici nulle >> zeros(3,2) Matrici con elementi uguali a 1 >> ones(4,2) Matrici di numeri casuali >> ones(4,2) Matrici identità >> I =eye(4) Matrici di Hilbert >> H=hilb(5) Matrici di Vandermonde: sono matrici le cui colonne contengono le potenze successive di un vettore di riferimento x = [x1,..., xn] >> V=vander([1 2 3 4]) Elementi di una matrice Possiamo, usando indici di riga e colonna, estrarre gli elementi ed elaborarli >> s=b(1,2)+a(2,3) oppure riassegnarli: >> B(2,2) =100 (Attenzione: controllate il risultato dell assegnazione B(3,5) = 1 oppure B(4,6) = 5)
Concatenazione (come per i vettori) la virgola accoda in orizzontale, il punto e virgola in verticale. Esempio Date A=[1 2; 3 4], B=[1 2;-1 1] verificare il risultato di >> C = [[A, B]; ones(2,8)]; >> D = [zeros(8,4),[a;b]]; Manipolazione di sottoblocchi di matrici Sia A=eye(4) e B=hilb(2). Per sostituire alle ultime due righe e colonne di A la matrice B: >> A=eye(4); B=hilb(2); >> A(3:4,3:4)=B si utilizzano gli stessi metodi visti con i vettori ma lavorando su due indici. Per estrarre la quarta riga di A: >> r=a(4,:) Per eliminare una colonna usiamo il vettore vuoto []: >> A(:,4)=[] Operazioni tra matrici Possiamo calcolare somma e sottrazione >> C=A+B; >> D=A-B; purché gli addendi abbiano le stesse dimensioni. Sia C = >> C*A 3 2 4 ; l operatore * esegue il prodotto righe per colonne: equivale all oparazione matematica 3 2 4 4 2 5 3 6 9 12 15 = 19 26 33
MEMO: date due matrici S m,n (m righe, n colonne) e R p,q (p righe, q colonne), il prodotto righe per colonne S m,n * R p,q = W m,q se e solo se n = p è possibile solo se n = p e il risultato sarà una matrice di m righe e q colonne Esempio Dati i due vettori a = [1 2 3 4] e b = [5 6 7 8] verificare i risultati delle 4 operazioni: a*b, a *b, a *b, a*b Operazioni elemento per elemento (come per i vettori): >> A=[1 2; 3 4], B=[1 2;-1 1]; >> A.*B; >> A./B; >> A.^B; Risolvere Esercizi 6, 7, 8.