function [C, Cdelta, Cvega, P, Pdelta, Pvega] = BS(S,E,r,sigma,tau)
%
% Calcula o valor da Fórmula de Black-Scholes e o valor
% da sua derivada em ordem a S (delta) e a sigma (vega)
% para o caso de calls e puts.
%
% Input:  S (valor do activo em t)
%         E (preço de exercício)
%         r (taxa de juro)
%         sigma (volatilidade)
%         tau (distância à maturidade, tau=T-t)
%
% Output: C (valor da call)
%         Cdelta (valor do delta da call)
%         Cvega (valor do vega da call)
%         P (valor da put)
%         Pdelta (valor do delta da put)
%         Pvega (valor do vega da put)
%
% Adaptado por L. Nunes Vicente, Fevereiro de 2006, de
% An Introduction to Financial Option Valuation: Mathematics, 
% Stochastics and Computation, D. J. Higham,
% Cambridge University Press, 2004,
% http://www.maths.strath.ac.uk/~aas96106/option_book.html.
%
if tau > 0
%
   d1 = (log(S/E) + (r + 0.5*sigma^2)*(tau))/(sigma*sqrt(tau));
   d2 = d1 - sigma*sqrt(tau);
   N1 = 0.5*( 1 + erf(d1/sqrt(2)) );
   N2 = 0.5*( 1 + erf(d2/sqrt(2)) );
%
   C      = S*N1 - E*exp(-r*(tau))*N2;
   Cdelta = N1;
   Cvega  = S*sqrt(tau)*exp(-0.5*d1^2)/sqrt(2*pi);
%
   P      = C + E*exp(-r*tau) - S;
   Pdelta = Cdelta - 1;
   Pvega  = Cvega;
%
else
%
   C      = max(S-E,0);
   Cdelta = 0.5*( sign(S-E) + 1 );
   Cvega  = 0;
%
   P      = max(E-S,0);
   Pdelta = Cdelta - 1;
   Pvega  = 0;
%
end
%
% Fim - BS.
