⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 powellsg.cpp

📁 共轭梯度的几种方法对标准函数的测试结果比较 附比较结果
💻 CPP
字号:
#include<iostream.h>
#include<math.h>
#define N 3
//C
//C   EXTENDED POWELL SINGULAR FUNCTION 
//C
//!    INITIAL POINT SHOULD BE [3,-1,0,1,----,3,-1,0,1]
//!
void CALF(int n,double X[N],double &F){
	
	int M=N/4;
//C
//C     N SHOULD BE A MULTIPLY OF 4
//C     STANDARD INITIAL POINT(3,-1,0,1)
      F=0.0;
//C
	double A,B,C,D;
	  for(int I=0;I<M;I++){
	A=X[4*I-3]+10.1*X[4*I-2];
	B=sqrt(5.0)*(X[4*I-1]-X[4*I]);
	C=(X[4*I-2]-2.0*X[4*I-1])*(X[4*I-2]-2.0*X[4*I-1]);
	D=sqrt(10.0)*(X[4*I-3]-X[4*I])*(X[4*I-3]-X[4*I]);
	F=F+0.50*(A*A+B*B+C*C+D*D);}
}
//C
//C
//C
void CALG(int n,double X[N],double G[N]){
	int M=N/4;
	double A1,B1,C1,D1;
	for(int I=0;I<M;I++){
      A1=X[4*I-3]+10.0*X[4*I-2];
	B1=(X[4*I-1]-X[4*I]);
	C1=(X[4*I-2]-2.00*X[4*I-1]);
	D1=(X[4*I-3]-X[4*I]);
	G[4*I-3]=A1+20.0*pow(D1,3);
	G[4*I-2]=10.0*A1+2.0*pow(C1,3);
	G[4*I-1]=5.0*B1-4.0*pow(C1,3);
	G[4*I]=-5.0*B1-20.0*pow(D1,3);
	}
}


double DOIT(double m1[N],double m2[N]){
	double sum=0;
	for(int i=0;i<N;i++)
		sum+=m1[i]*m2[i];
	return sum;
}//DOIT
int wolf1(double x[],double work[],double g[],double alpha,double c1,double c2){
	double f1,f2;
	double temp[N];
	CALF(N,x,f1);
	for(int i=0;i<N;i++)
		temp[i]=x[i]+alpha*work[i];
	CALF(N,temp,f2);
	double temp1=DOIT(g,work);
	double temp2=-c1*alpha*temp1;
	if((f1-f2)>=temp2)return 1;
	else return 0;
}//wolf1
int wolf2(double x[],double work[],double g[],double alpha,double c1,double c2){
	double ng[N];
	double temp[N];
	for(int i=0;i<N;i++)
		temp[i]=x[i]+alpha*work[i];
	CALG(N,temp,ng);
	double temp1=DOIT(ng,work);
	double temp2=c2*fabs(DOIT(g,work));
	if(temp1<=temp2)return 1;
	else return 0;
}//wolf2
void main()
{	
	double x[N],G[N],work[N];
	double c1=0.1,c2=0.5;
	double alpha=1;
	double a=0,b=1000;
	double temp,temp1,temp2,temp3,temp_x[N],temp_g[N];
	int k=0;
	for(int i=0;i<N;i++){
         if(i%4==0)x[i]=3;
		 if(i%4==1)x[i]=-1;
	     if(i%4==2)x[i]=0;
		 if(i%4==3)x[i]=1;
	}
    CALG(N,x,G);
	for(i=0;i<N;i++)
		work[i]=-G[i];
	CALF(N,x,temp1);
	temp2=DOIT(G,work);
step2:
    for(i=0;i<N;i++)
		   temp_x[i]=x[i]+alpha*work[i];
	CALF(N,temp_x,temp);
	if(wolf1(x,work,G,alpha,c1,c2))
		goto step3;
	else{
		b=alpha;
		alpha=a+(alpha-a)/(2*(1+(temp1-temp)/((alpha-a)*temp2)));
		k++;
		goto step2;
	}
step3:
	for(i=0;i<N;i++)
		   temp_x[i]=x[i]+alpha*work[i];
	CALG(N,temp_x,temp_g);
	temp3=DOIT(temp_g,work);
	if(wolf2(x,work,G,alpha,c1,c2))
		goto step4;
	else{
		 a=alpha;
		 alpha=alpha+((alpha-a)*temp3)/(temp2-temp3);
		 temp1=temp;
		 temp2=temp3;
		 k++;
		 goto step2;
		
	}
step4:
	cout<<"迭带步数"<<k<<'\n';
	cout<<"alpha:"<<alpha<<'\n';

}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -