1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| double valeur(double K, double x)
{
double e = exp(x);
return K>e? K-e:0;
}
// Les coefficients du binôme
long cnp(int n,int p)
{
long C = 1;
int i;
if(p<0) return 0;
for(i=1; i<=p; i++)C= C*(n-i+1)/i;
return C ;
}
double calc2(double u, double K,double SigmaDel,double pn, double n,double x)
{
double del = (x-u)/SigmaDel/2;
double expo = pow(pn,n);
double fact = (1-pn)/pn;
int q = n/2;
int i;
long coef;
int m0;
int i0;
double result=0;
if(x>=u) return 0;
if(n==0)return valeur(K,x);
i0 = ceil(n/2.0+del);
i0 = i0<0 ? 0 : i0;
for(i = i0; i <= n; i++)
{
m0 = ceil(n-i+2*del);
m0 = m0<0? 0 : m0;
coef =0;
if(i<n-q && m0<=i) coef = cnp(n,i)-cnp(n,m0-1);
if(i>=n-q && m0<=n-i) coef = cnp(n,n-i)-cnp(n,m0-1);
if(coef!=0)result += expo*valeur(K,x+(n-2*i)*SigmaDel)* coef;
expo = expo*fact;
}
return result;
}
double phi(double u, double K,double T,double sigma,double N,double r,long i,double x)
{
double sq = sqrt(T/N);
double pn=0.5+(r-sigma*sigma/2)*sq/(2*sigma);
return calc2(u,K,sigma*sq,pn,i,x);
} |