/* 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; }
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 } }
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; }
/* 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;}