|
Appunti informatica |
|
Visite: 1333 | Gradito: | [ Picolo appunti ] |
Leggi anche appunti:Illustrazione del sistema di monitoraggioIllustrazione del sistema di monitoraggio L'obiettivo HardwareHARDWARE UNITA' CENTRALE DI ELABORAZIONE Definita con la sigla CPU, l'unità Il problema generale dell'interfaccia software e i livelli iso-osiIl problema generale dell'inteRfaccia software e i livelli ISO-OSI 1. Interfaccia |
FUNZIONE ESPO
Scopo: la funzione calcola ex, nel caso in cui x è negativo calcolerà 1/ex. In più restituisce un altro valore, il numero delle somme effettuate dall'algoritmo nel calcolo di ex
Specifica: l'intestazione della funzione è [y,n]=espo(x,tol)
Parametri di ingresso: - x è valore dell'esponente. È di tipo reale.
- tol è la tolleranza, numero di cifre esatte richieste.
Che in realtà tol=10^-k (k=cifre esatte richieste), ma ciò è calcolato già dalla funzione. È di tipo intero positivo.
Parametri di uscita: - y è il risultato della funzione e^x oppure di 1/e^x.È di tipo reale positivo.
n è il numero delle somme effettuate dall'algoritmo usando la serie di Taylor. È di tipo intero positivo.
err indicatore di errore che visualizza dei messaggi di errore specifico.
tol accuratezza richiesta dall'utente (parametro omesso all'uscita perché inserito già in ingresso).
Descrizione: la funzione calcola ex data una certa tolleranza. Se essa non viene inserita, la funzione calcola ex con la massima precisione(tol=epsilon macchina). Inoltre se x=0 il risultato sarà e=1.
Indicatori di errore: - Too many input arguments = indica che sono stati inseriti più parametri di ingresso da quelli consentiti. (Questo indicatore di errore è definito dal Matlab)
- Too many output arguments = indica che sono stati inseriti più parametri di uscita da quelli consentiti. (Questo indicatore di errore è definito dal Matlab)
- Attenzione nessun input specificato = cioè non sono stati inseriti parametri di ingresso.
- Formato non corretto di x. Inserirlo come numero reale = compare quando si da a x il valore di un carattere o di una parola.
- Formato non esatto. Inserire uno scalare = visualizza questo errore se in x vi è un vettore.
- Formato non corretto di tol. Inserirlo come numero naturale = indica che tol è stato inserito in modo errato(es.: negativo, carattere)
- Attenzione! Situazione di overflow = si verifica se il risultato è in overflow
- Attenzione! Situazione di underflow = si verifica se il ris. è in underflow
Esempio d'uso: 1)esempio con tolleranza
>>[y,n]=espo(59,12)
y = 4.201210403483852e+025
n = 115
2)esempio senza tolleranza cioè a precisione massima
>> [y,n]=espo(32)
y = 7.896296018268023e+013
n = 85
Situazioni di errore: 1) >> [y,n]=espo(3,7,6)
??? Error using ==> espo
Too many input arguments.
2) >> [y,n,m]=espo(3,7)
Error using ==> espo
Too many output arguments.
3) >> [y,n]=espo
??? Error using ==> espo
Attenzione nessun input specificato
4) >> [y,n]=espo('a',10)
??? Error using ==> espo
Formato non corretto di x. Inserirlo come numero reale
5) >> [y,n]=espo([2 3 4; 5 6 7],10)
??? Error using ==> espo
Formato non esatto. Inserire uno scalare
6) >> [y,n]=espo(10,'a')
??? Error using ==> espo
Formato non corretto di tol. Inserirlo come numero naturale
7) >> [y,n]=espo(10,-10)
??? Error using ==> espo
Formato non corretto di tol. Inserirlo come numero naturale
8) >> [y,n]=espo(730,13)
??? Error using ==> espo
Attenzione! Situazione di overflow
9) >> [y,n]=espo(-730,13)
??? Error using ==> espo
Attenzione! Situazione di underflow
Test dei casi funzionanti: 1) >> [y,n]=espo(32,13) (ex con tolleranza>epsilon macchina)
y = 7.896296018230850e+013
n = 78
2) >> [y,n]=espo(-32,14) (1/ex con tolleranza>epsilon macchina)
y = 1.266416554909790e-014
n = 81
3) >> [y,n]=espo(32) (senza tolleranza)
la funzione è stata calcolata con la massima precisione
y = 7.896296018268023e+013
n = 85
4) >> [y,n]=espo(0) (con x=0)
y = 1
n = 1
5) >> [y,n]=espo(4,18) (con tolleranza<epsilon macchina)
y = 54.59815003314422
n = 29
6) >> [y,n]=espo(10^-309) (quando x è più piccolo di realmin viene y = 1 approssimato ad esso per non causare n = 1 underflow, ma poi è talmente piccolo . perciò è come se fosse 0 e quindi e=1)
Confronto con Matlab:
Funzioni per il calcolo di ex |
ESPO (senza tolleranza) |
EXP di Matlab |
X=1 |
|
|
X=5 |
1.484131591025765e+002 |
1.484131591025766e+002 |
X=30 |
1.068647458152442e+013 |
1.068647458152446e+013 |
x=100 |
2.688117141816041e+043 |
2.688117141816136e+043 |
x=350 |
1.007090887027834e+152 |
1.007090887028080e+152 |
x=710 |
overflow (inf.) |
infinito |
x=-710 |
underflow (0) |
4.476286225675130e-309 |
Come si può notare dalla tabella, con l'aumentare di x le cifre esatte della ESPO diminuiscono rispetto alla funzione del Matlab. Inoltre la funzione ESPO nel caso x=-710 da underflow mentre la funzione EXP da un determinato valore perchè quest'ultima gestisce i subnormal number.
M-FILE:
function [y,n]=espo(x,tol)
% ESPO calcola l'esponenziale di x, nel caso in cui x è
% negativo la funzione calcolerà 1/e^x.
% parametri di ingresso:
x=valore dell'esponente
tol=tolleranza, numero di cifre esatte richieste.
In realtà tol=10^-k (k=cifre esatte richieste)
ma ciò è calcolato già dalla funzione
% parametri di uscita:
y=risultato della funzione e^x oppure di 1/e^x
n=numero delle somme effettuate dall'algoritmo usando
la serie di Taylor
% esempio d'uso: tenendo conto di [y,n]=espo(x,tol) si può avere:
1)l'esponenziale con tolleranza
>>[y,n]=espo(59,12)
y = 4.201210403483852e+025
n = 115
% 2)l'esponenziale con la massima precisione
>> [y,n]=espo(32)
y = 7.896296018268023e+013
n = 85
format long;
if (nargin==0) %Visualizza un errore se non c'è input
error('Attenzione nessun input specificato');
end
if (ischar(x)==1) %Controlla se x è un numero reale
error('Formato non corretto di x. Inserirlo come numero reale');
end
dim=prod(size(x));
if (dim~=1) %Visualizza un errore se non si inserisce uno scalare
error('Formato non esatto. Inserire uno scalare');
end
if (nargin==1)
disp('la funzione è stata calcolata con la massima precisione');
tol=eps;
else
if (ischar(tol)==1)|(tol<0)%Controlla se tol è un numero naturale
error('Formato non corretto di tol. Inserirlo come numero naturale');
end
tol=power(10,-tol);
end
if(x==0) %Pone il risultato della funzione =1 se x=0
y=1;
end
tol=max(tol,eps); %Verifica per valori di tol impossibili
if (tol~=0) %Verifica tol underflow
if (abs(x)>=realmin/tol)
tol=abs(x)*tol;
else
tol=realmin;
end
end
y=1; %Calcolo di e^x con tol
n=1;
temp=abs(x);
while (abs(temp)>y*tol)
y=y+temp;
n=n+1;
temp=temp*(abs(x)/n);
end
if(x<0) %Verifica esponente negativo
y=1/y;
end
if (y==inf) %Verifica se c'è stato overflow
error('Attenzione! Situazione di overflow');
end
if (y==0) %Verifica se c'è stato underflow
error('Attenzione! Situazione di underflow');
end
Appunti su: |
|