Ejemplo n.º 1
0
/* computes a conjugate gradient optimisation */
int methodedugradient(double*w,double *G,double *lambda,double *tirages,double spot, double r,int N )
{
  int i;
  double pas;
  double test;
  double t;
  double *Grad=malloc((N+1)*sizeof(double));
  double *grad=malloc((N+1)*sizeof(double));
  double *mult=malloc((N+1)*sizeof(double));
  double *add=malloc((N+1)*sizeof(double));
  double *Mult=malloc((N+1)*sizeof(double));
  double *lambda0=malloc((N+1)*sizeof(double));
  double*zero=malloc((N+1)*sizeof(double));
  double *direction=malloc((N+1)*sizeof(double));
  for(i=0;i<N;i++)
	{
	  lambda0[i]=1;
	  zero[i]=0;
	} 
	  multiplication(lambda,0,lambda0,spot,r,N);
	  gradient(w,G,Grad,tirages,lambda ,spot,r,N);
	  gradient(w,G,direction,tirages,lambda ,spot,r,N);
	  test=normeinfinie(Grad,lambda,spot,r,N);


	  while ((normeinfinie(lambda0,lambda,spot,r,N)>1E-10)&&(normeinfinie(zero,Grad,spot,r,N)/test>1E-5)){
		printf("W\n");
		t=1;
		pas=RegledeWolfe(w,lambda,direction,t,G,tirages,spot,r,N);
		
	
	for(i=0;i<N;i++){
	  lambda0[i]=lambda[i];
	
  }
	multiplication(Mult,- pas,direction,spot,r,N);
	addition(lambda,lambda0,Mult,spot,r,N);
	gradient(w,G,Grad,tirages,lambda ,spot,r,N);
	gradient(w,G,grad,tirages,lambda0 ,spot,r,N);
	multiplication(mult,produitscalaire(Grad,Grad,spot,r,N)/produitscalaire(grad,grad,spot,r,N),Grad,spot,r,N);
	addition(direction,direction,mult,spot,r,N);
	printf("%g\n",fonctionnelle(w,G,tirages, lambda, spot,r,N));
	  }
	  

	  free(Grad);
	  free(lambda0);
	  free(add);
	  free(mult);
	  free(Mult);
	  free(zero);
	  free(direction);
	  free(grad);
	
  return 0;
}
Ejemplo n.º 2
0
myVecteur2D::myVecteur2D(myVecteur2D* v1, myVecteur2D* v2){ // créer un rebond : premier vecteur sur le deuxième

	vertex originrebond;
	originrebond.x = 0;
	originrebond.y = 0;

	int sens;

	sens = intersectionDroites(v1, v2, originrebond);


	if (sens > 0)
	{
		v1->normalise();
		v2->normalise();
		//std::cout << "V1 : " << v1->getNorme() << "  v2 : " << v2->getNorme() << " v1x : " << v1->getxdir() << " v1y : " << v1->getydir() << " v2x : " << v2->getxdir() << " v2y : " << v2->getydir() << std::endl;

		vertex dirOrtho;
		dirOrtho.x =  v2->getydir();
		dirOrtho.y = - v2->getxdir();

		float psv12 = produitscalaire(v1,v2); //produit scalaire de v1 sur v2
		float psv12ortho = v1->getxdir() * dirOrtho.x + v1->getydir() * dirOrtho.y;



		xdir = psv12*v2->getxdir() - psv12ortho * dirOrtho.x;
		ydir = psv12*v2->getydir() - psv12ortho * dirOrtho.y;
		origin = originrebond;

		//std::cout << "psv12 : " << psv12 << "  ortho " << psv12ortho << "xdir : " << xdir << "direct " << psv12*v2->getxdir() + psv12ortho * dirOrtho.x<< std::endl;

		normalise();

	}
	else
	{
//on ne crée rien
	}


}
Ejemplo n.º 3
0
int methodedugradient2(double *w,double *G,double *lambda,double *tirages,double spot, double r,int N )
{
  int i;
  double pas;
  double test;
  double pasapriori=0.0001;
  int max=floor(((1.3*spot)-(0.7*spot))/5);
  double *Grad=malloc((N+1)*sizeof(double));
  double *mult=malloc((N+1)*sizeof(double));
  double *add=malloc((N+1)*sizeof(double));
  double *Mult=malloc((N+1)*sizeof(double));
  double *lambda0=malloc((N+1)*sizeof(double));
  double*zero=malloc((N+1)*sizeof(double));

  for(i=0;i<N;i++)
	{
	  lambda0[i]=1;
	  zero[i]=0;
	} 
  /* multiplication(lambda,0,lambda0,spot,r,N);*/
  methodedugradient(w,G,lambda,tirages,spot,r,N);
  gradient(w,G,Grad,tirages,lambda ,spot,r,N);
  multiplication(mult,- pasapriori,Grad,spot,r,N);
  addition(add,lambda,mult,spot,r,N);
  test=normeinfinie(Grad,lambda,spot,r,N);


	  while ((normeinfinie(lambda0,lambda,spot,r,N)>1E-10)&&(normeinfinie(zero,Grad,spot,r,N)/test>1E-5)){
		printf("W2\n");
		if((fonctionnelle(w,G,tirages,lambda,spot,r,N)>fonctionnelle(w,G,tirages,lambda0,spot,r,N))){
		  lambda=lambda0;
		  pasapriori=0.001*pasapriori;}
		else {if(fabs(fonctionnelle(w,G,tirages,lambda,spot,r,N)-fonctionnelle(w,G,tirages,lambda0,spot,r,N))<1E-5){
		  pasapriori=0.001*pasapriori;
		} else {
		  pasapriori=1;
		}
		}		

	pas=pasapriori*produitscalaire(Grad,Grad,spot,r,N)/(2*(pasapriori*produitscalaire(Grad,Grad,spot,r,N)-fonctionnelle(w,G,tirages,lambda,spot,r,N)+fonctionnelle(w,G,tirages,add,spot,r,N)));

	
	for(i=0;i<N*max;i++){
	  lambda0[i]=lambda[i];
	
  }
	
	if(pas>=0){
	  if((fonctionnelle(w,G,tirages,add,spot,r,N)-fonctionnelle(w,G,tirages,lambda,spot,r,N))<-0.5*pasapriori*produitscalaire(Grad,Grad,spot,r,N)){
		pas=1;
		multiplication(Mult,- pas*pasapriori,Grad,spot,r,N);
		addition(lambda,lambda0,Mult,spot,r,N);
	  } else {
		multiplication(Mult,-pas*pasapriori,Grad,spot,r,N);
		printf("ok\n");
		addition(lambda,lambda0,Mult,spot,r,N);
	  }
	  
	  
	} else {
	  
	  printf("non!\n");
	  pas=1;
	  multiplication(Mult,- pas*pasapriori,Grad,spot,r,N);
	  addition(lambda,lambda0,Mult,spot,r,N);
	  
	}
	 gradient(w,G,Grad,tirages,lambda ,spot,r,N);
	 multiplication(mult,- pasapriori,Grad,spot,r,N);
	 addition(add,lambda,mult,spot,r,N);
	printf("%g\n",fonctionnelle(w,G,tirages, lambda, spot,r,N));
	   
   }
	  free(Grad);
	  free(lambda0);
	  free(add);
	  free(mult);
	  free(Mult);
	  free(zero);
	
  return 0;
}
Ejemplo n.º 4
0
/* computes the "Regle de Wolfe" */
double  RegledeWolfe(double*w,double *x,double*d,double t,double*G,double *tirages,double spot,double r,int N)
	 
{ double m1=0.4;
  double m2=0.8;
  double td=0;
  double tg=0;
  double a=2;
  double *Grad=malloc((N+1)*sizeof(double));
  double *grad=malloc((N+1)*sizeof(double));
  double *add=malloc((N+1)*sizeof(double));
  double *mult=malloc((N+1)*sizeof(double));
  multiplication(mult,-t,d,spot,r,N);
  addition(add,x,mult,spot,r,N);
  gradient(w,G,Grad,tirages,x ,spot,r,N);
  gradient(w,G,grad,tirages,add ,spot,r,N);
	
  while((fonctiondemerite(w,x,t,d,G,tirages,spot,r,N)>fonctiondemerite(w,x,0,d,G,tirages,spot,r,N)-m1*t*produitscalaire(Grad,Grad,spot,r,N))||(produitscalaire(Grad,grad,spot,r,N)>m2*produitscalaire(Grad,Grad,spot,r,N))){printf("no\n");printf("%f %f\n",tg,td);
  
  	while (td==0){
	  printf("ok\n");
	  if (fonctiondemerite(w,x,t,d,G,tirages,spot,r,N)>fonctiondemerite(w,x,0,d,G,tirages,spot,r,N)-m1*t*produitscalaire(Grad,Grad,spot,r,N)){td=t;
	} else {
	t=a*t;
	}
	}

	t=0.5*(td+tg);
	
	
	if(fonctiondemerite(w,x,t,d,G,tirages,spot,r,N)>fonctiondemerite(w,x,0,d,G,tirages,spot,r,N)-m1*t* produitscalaire(Grad,Grad,spot,r,N)){
	td=t;

	} else {
	 
	
  	tg=t;
	
	  }
	if(fabs(td-tg)<1E-6){
	  return tg;
	} else {
	  t=0.5*(td+tg);
	}

	multiplication(mult,-t,d,spot,r,N);
	addition(add,x,mult,spot,r,N);
	gradient(w,G,grad,tirages,add ,spot,r,N);

	}		 
  free(Grad);
  free(grad);
  free(add);
  free(mult);
  
  return t;}