ESEMPIO D'USO:
>> [y N]=esp(320,24)
y =9.423976816163541e+138
N = 474
esp.m%ESP% [y N]= esp(x, TOL)% La funzione esp calcola e^x con possibilità di% scegliere il numero di cifre significative esatte% che si cerca nel calcolo.%>> [y N]=esp(320,24)%y =% 9.423976816163541e+138%N =% 474function [y Nadd]= esp(x, TOL)%Controllo sul numero di dati in inputif (nargin ==0)error('Numero di parametri di input insufficiente')end%Controllo sull' esattezza dei dati di input%Il punto in cui calcolare la funzione non può essere un carattereif (ischar(x)==1)error('x deve essere un numero reale')end%Il punto in cui calcolare la funzione non può essere un vettoreif (length(x)~=1)error('x deve essere uno scalare')end%Controllo sull'esattezza della tolleranza se vengono passati due dati%di inputif (nargin==2)%La tolleranza non può essere un carattere o un numero negativoif (ischar(TOL)==1 | TOL<0)error('TOL deve
essere un numero reale maggiore di zero')end
La tolleranza non può essere un vettore
if (length(TOL)~=1)error('TOL deve essere uno scalare')end
end
Scelta della precisione
if (nargin==1)TOL=eps;disp('è stata scelta la massima precisione')else TOL=max(eps,power(10,-TOL));end
Controllo condizioni di Overflow e Underflow e in caso positivo salto i calcoli
if (x<-7.083964185322641e+002)Pongo y=0 in caso di underflowdisp('Questo esponente provocherà underflow')y=0;N=0;return;elseif (x>7.097827128933840e+002)Pongo y=inf in caso di overflowdisp('Questo esponente provocherà overflow')y=inf;N=0;return;end
Calcolo la funzione e^x usando l'algoritmo stabile, con criterio d'arresto e con precisione scelta dall'utente
y=1;N=1;add=abs(x);while (add>(y*TOL))y=y+add;N=N+1;add=(add*(abs(x)/N));end
if(x<0)y=1./y;end
if nargout==2Nadd=N;end
Test dell'Algoritmo
Caso funzionante1: >> [y N]=esp(320,24)y =
9.423976816163541e+138N = 474 Caso funzionante2: >> esp(50)è stata scelta la massima precisione ans = 5.184705528587080e+021 Casi di errore: >>esp??? Error using ==> espNumero di parametri di input insufficiente >> esp('a')??? Error using ==> espx deve essere un numero reale >> a=[1 2 3];>> esp(a)??? Error using ==> esp at 67x deve essere uno scalare >> esp(12,'a')??? Error using ==> esp at 76TOL deve essere un numero reale maggiore di zero >> esp(12,-20)??? Error using ==> esp at 76TOL deve essere un numero reale maggiore di zero >>a=[1 2 3];>> esp(12,a)??? Error using ==> esp at 80TOL deve essere uno scalare >> [a b c]=esp(10, 44)??? Error using ==> espToo many output arguments. >> esp(12, 23, 34)??? Error using ==> espToo many input arguments.Overflow: >> esp(999, 12)Questo esponente provocherà overflow ans = InfUnderflow: >> esp(-999, 12)Questo esponente
provocherà underflow
ans = 0
x esp(x) con Tol massima exp(x)
10 2.202646579480671e+004
53 2.202646579480672e+004
1.041375943302909e+023
1.041375943302909e+023-237
1.180885497174638e-103
1.180885497174638e-103720
Inf (overflow)
Inf-733
0 (underflow)
4.593525935644406e-319
graficoesp.m
clear all;
X=(-4:0.01:3);
for indice=1:length(X)
A(indice)=[esp(X(indice))];
end
subplot(3,1,1)
plot(X,A)
axis('tight')
xlabel('x')
ylabel('y=e^x')
title('Grafico funzione esp')
Y=(3:12);
for indice=1:length(Y)
[r n(indice)]=esp(5,Y(indice));
[r n1(indice)]=esp(-15,Y(indice));
end
subplot(3,1,2)
plot(Y,n, 'o:')
axis('tight')
xlabel('TOLLERANZA')
ylabel('Numero di addizioni')
title('Andamento N addendi con x=5')
grid
subplot(3,1,3);
plot(Y,n1, 'o:')
axis('tight')
xlabel('TOLLERANZA')
ylabel('Numero di addizioni')
title('Andamento N addendi con x=-15')
grid