vuoi
o PayPal
tutte le volte che vuoi
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 esponenteprovocherà 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