static void Drift_Computation(int generator, int step_number, double T, double x, double r, double divid, double sigma, NumFunc_2 *p, double K) { double S_t; double h = T / step_number; /* double sqrt_h = sqrt(h);*/ double trend= (r -divid)- 0.5 * SQR(sigma); double ss_dt=sigma*sqrt(h); double *xmin,*xmax,x_min,x_max,dot2; int i; double g; t=T;ri=r; S0=x;strike=K; sig=sigma; dvd=divid; step_nb=step_number; for(i=0;i<step_number;i++) mu[i]=0.; if((p->Compute) == &Call_OverSpot2) { x_min=2.5*t;x_max=5.0*t; xmin=&x_min;xmax=&x_max; /*trouve le bon intervalle [xmin,xmax]*/ zbrac(ghscall,xmin,xmax); /*resoud l equation ghs(x)=0*/ g=rtbis(ghscall,(*xmin),(*xmax),1e-8); mu[0]=ss_dt*(g+K)/g; dot2=SQR(mu[0]);S_t=1.0; for(i=1;i<step_number;i++) { mu[i]=mu[i-1]-ss_dt*S0*S_t/(step_number*g); S_t=S_t*exp(trend*h+ss_dt*mu[i]); dot2+=SQR(mu[i]); } } else if((p->Compute) == &Put_OverSpot2) { x_min=-5.0;x_max=-0.1; xmin=&x_min;xmax=&x_max; /*trouve le bon intervalle [xmin,xmax]*/ zbrac(ghsput,xmin,xmax); /*resoud l equation ghs(x)=0*/ g=rtbis(ghsput,(*xmin),(*xmax),1e-8); mu[0]=ss_dt*(g-K)/g; dot2=SQR(mu[0]);S_t=1.0; for(i=1;i<step_number;i++) { mu[i]=mu[i-1]+ss_dt*S0*S_t/(step_number*g); S_t=S_t*exp(trend*h+ss_dt*mu[i]); dot2+=SQR(mu[i]); } } return; }
int main(void) { int i,nb=NBMAX; float xacc,root,*xb1,*xb2; xb1=vector(1,NBMAX); xb2=vector(1,NBMAX); zbrak(fx,X1,X2,N,xb1,xb2,&nb); printf("\nRoots of bessj0:\n"); printf("%21s %15s\n","x","f(x)"); for (i=1;i<=nb;i++) { xacc=(1.0e-6)*(xb1[i]+xb2[i])/2.0; root=rtbis(fx,xb1[i],xb2[i],xacc); printf("root %3d %14.6f %14.6f\n",i,root,fx(root)); } free_vector(xb2,1,NBMAX); free_vector(xb1,1,NBMAX); return 0; }