www.pudn.com > powell4.rar > powell.cpp


#include  
#include  
 
double fxy1(double *p) 
{ 
	return (10*(*p+*(p+1)-5)*(*p+*(p+1)-5)+(*p-*(p+1))*(*p-*(p+1))); 
} 
 
 
double fxy2(double *p) 
{ 
	return ((*p-2)*(*p-2)+(*(p+1)-3)*(*(p+1)-3)+(*(p+2)-10)*(*(p+2)-10)); 
} 
 
double fxy(double *p) 
{  
	return ((*p-2)*(*p-2)+(*(p+1)-3)*(*(p+1)-3)+1.0/(*p)+1.0/(*(p+1)));  
} 
double fxy4(double *p) 
{ 
	return(*p); 
} 
class powell 
{ 
private: 
	int n; 
	double jing; 
	double h; 
 
	double kkk[6]; 
 
 
 
public: 
	void tansuo(double *b,double *e1,int ii) 
	{ 
	   int j;  
 
       double h0; 
	   double yy2; 
	   double x1,x2,x3,y1,y2,y3,xx,yy; 
	  
	   h0 = h; 
	  
	  
	   double *pm = new double [n];  //临时存放前一分量 
	   double *pt = new double [n];  //临时存放探索分量 
	   double *ee = new double [n];  //临时存放方向向量 
 
	   double *p1 = new double [n];  //临时存放区间分量 
	   double *p2 = new double [n];  //临时存放区间分量 
	   double *p3 = new double [n];  //临时存放区间分量 
 
	    
       double aa,bb,cc;  //用于探索区间 
		 
	    
	   for(j=0;jbb)    
		{    
			for(j=0;jcc) 
			{ 
				h = h*2; 
				for(j=0;jjing*100) 
			{ 
				xx2 = xx; 
				 
				xx = 0.5*(x1+x3-((y3-y1)/(x3-x1)*(x2-x3))/((y2-y1)/(x2-x1)-(y3-y1)/(x3-x1)));  //二次插值公式 
				yy2 = y2; 
						 
				for(j=0;j1e+010||yy<-1e+010||yy2>1e+010||yy2<-1e+010) 
				{ 
					xx = xx2; 
					break; 
				} 
 
				 
			} 
		 
 
		  delete zx; 
 
		for(j=0;jjing) 
   {   
	  for(i=1;imaxfc) 
		   { 
			   maxfc = *(fc+i); 
			   m = i; 
		   } 
	   } 
	   delete fc; 
	  
	   delete fx; 
 
	   int some; 
	   some = (F3>F0)&&(((F0-2*F2+F3)*(F0-F2-maxfc)*(F0-F2-maxfc))<(0.5*maxfc*(F0-F3)*(F0-F3))); 
	    
	   if(0) 
	   { 
           h = 10; 
		   for(i=m;ibb) 
		   { 
			   for(i=0;icc) 
			   { 
				   h = h*2; 
				   for(i=0;ijing*jing) 
			{ 
				xx2 = xx; 
				 
				xx = 0.5*(x1+x3-((y3-y1)/(x3-x1)*(x2-x3))/((y2-y1)/(x2-x1)-(y3-y1)/(x3-x1)));  //二次插值公式 
                yy2 = y2; 
 
			for(j=0;j1e+010||yy<-1e+010||yy2>1e+010||yy2<-1e+010) 
				{ 
					xx = xx2; 
					break; 
				} 
									 
			} 
	 
 
		  delete zx; 
 
		   for(i=0;iF3) 
			   for(i=0;i