#ifndef TESTFUN_H #define TESTFUN_H #include "linalg.h" #include "tools.h" #include "config.h" const double pi=fabs(acos(-1.)); // Rosenbrock function void Domain_Rosenbrock(RTBox box) { box.lb=-2.0 ; box.ub=2.0 ; } double Objective_Rosenbrock(RCRVector x) { double a=x(1)-x(0)*x(0) ; double b=1-x(0) ; return 100*a*a + b*b ; } void Gradient_Rosenbrock(RCRVector x, RCRVector grad) { grad(0)=200*(x(1)-x(0)*x(0))*(-2*x(0))-2*(1-x(0)) ; grad(1)=200*(x(1)-x(0)*x(0)) ; } // McCormic function void Domain_McCormick(RTBox box) { box.lb(0)=-1.5 ; box.ub(0)=4.0 ; box.lb(1)=-3.0 ; box.ub(1)=4.0 ; } double Objective_McCormick(RCRVector x) { return sin(x(0)+x(1)) + pow(x(0)-x(1),2.0) - 1.5*x(0) + 2.5*x(1) + 1.0 ; } void Gradient_McCormick(RCRVector x, RCRVector grad) { grad(0)=cos(x(0)+x(1)) + 2*(x(0)-x(1)) - 1.5 ; grad(1)=cos(x(0)+x(1)) - 2*(x(0)-x(1)) + 2.5 ; } // Box and Betts function void Domain_BoxBetts(RTBox box) { box.lb(0)=0.9 ; box.ub(0)=1.2 ; box.lb(1)=9.0 ; box.ub(1)=11.2 ; box.lb(2)=0.9 ; box.ub(2)=1.2 ; } double Objective_BoxBetts(RCRVector x) { double x0=x(0),x1=x(1),x2=x(2) ; double sum=0.0 ; for (int i=1 ; i<=10 ; i++) sum+=pow(exp(-0.1*i*x0)-exp(-0.1*i*x1)-(exp(-0.1*i)-exp(-1.0*i))*x2,2.0); return sum ; } void Gradient_BoxBetts(RCRVector x, RCRVector grad) { double x0=x(0),x1=x(1),x2=x(2) ; double g0=0.0, g1=0.0, g2=0.0 ; for (int i=1 ; i<=10 ; i++) { g0 += -0.2*(exp(-0.1*i*x0)-exp(-0.1*i*x1) -(exp(-0.1*i)-exp(-1.0*i))*x2)*i*exp(-0.1*i*x0); g1 += 0.2*(exp(-0.1*i*x0)-exp(-0.1*i*x1)-(exp(-0.1*i) -exp(-1.0*i))*x2)*i*exp(-0.1*i*x1); g2 += 2.0*(exp(-0.1*i*x0)-exp(-0.1*i*x1) -(exp(-0.1*i)-exp(-1.0*i))*x2)*(-exp(-0.1*i)+exp(-1.0*i)); } grad(0)=g0 ; grad(1)=g1 ; grad(2)=g2 ; } // Paviani function void Domain_Paviani(RTBox box) { box.lb=2.001 ; box.ub=9.999 ; } double Objective_Paviani(RCRVector x) { double a,b,sum=0.0, mul=1.0 ; int n=x.GetLength() ; for (int i=0 ; i=0; --i) { xlocal(i) += step; Fplus = Objective_Goldstein_Price( xlocal ); xlocal(i) -= step; // original x value grad(i) = (Fplus-F)/step; } } // Shekel functions /* The Matrix a and vector c are needed in the Shekel function */ static double a[10][4]={ { 4,4,4,4 } , { 1,1,1,1 } , { 8,8,8,8 } , { 6,6,6,6 } , { 3,7,3,7 } , { 2,9,2,9 } , { 5,5,3,3 } , { 8,1,8,1 } , { 6,2,6,2 } , {7,3.6,7,3.6} }; static double c[10]= { .1 , .2 , .2 , .4 , .4 , .6 , .3, .7 , .5 , .5 }; void Domain_Shekel(RTBox box) { box.lb=0.0 ; box.ub=10.0 ; } double Objective_Shekel(RCRVector x) { int n=x.GetLength() ; double R=0.0, S; for(int i=0;i<10;i++) { S=0; for(int j=0;j 0 ) { height = 2.0*area/b; // height of the triangle: area = 0.5*h*b } else { height = a; } // FN += Sqr( height ); FN += height; } // cout << FN << endl; return FN; } void Gradient_myMinHeight(RCRVector x, RCRVector grad) { // Gradient(0) = { dFN/d(Omega1), // dFN/d(Phi1), // dFN/d(Kappa1), // dFN/d(t1x), // dFN/d(t1y), // dFN/d(t1z), // dFN/d(Omega2), // dFN/d(Phi2), // dFN/d(Kappa2), // dFN/d(t2x), // dFN/d(t2y), // dFN/d(t2z) } // Numerical calculations of gradients const double step = 1e-6; double Fminus, Fplus; int i; RCRVector xlocal(12), NumGrad(12); for(i = 0; i <= 11; i++ ) xlocal(i) = x(i); for(i = 11 ; i>=0; --i) { xlocal(i) -= step; Fminus = Objective_myMinHeight(xlocal); xlocal(i) += 2.0*step; Fplus = Objective_myMinHeight(xlocal); xlocal(i) -= step; // original x value NumGrad(i) = (Fplus-Fminus)/(2.0*step); } for(i = 0; i <= 11; i++ ) grad(i) = NumGrad(i); } #endif