Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}