下载可编辑
beta=(sqrt(5)-1.0)/2; t2=a+beta*(b-a); f2=f(x,p,t2); t1=a+b-t2; f1=f(x,p,t1); while(1) {
if(fabs(t1-t2) { if(f1 t1=a+b-t2; f1=f(x,p,t1); } else { a=t1; t1=t2; f1=f2; t2=a+beta*(b-a); f2=f(x,p,t2); } } } t=(t1+t2)/2; return t; } void gtd() { double x[N],g[N],p[N],t=0,f0,mod1=0,mod2=0,nanda=0; printf(\请输入函数的元数值n=\ scanf(\ printf(\请输入初始值:\\n\for(i=0;i mod1=sqrt(pow(g[0],2)+pow(g[1],2));/*求梯度的长度*/ p[0]=-g[0]; p[1]=-g[1]; k=0; int i,k,n; if(mod1>eps) { .专业.整理. 下载可编辑 } printf(\最优解为x1=%lf,x2=%lf\ } main() { } gtd(); printf(\最终的函数值为%lf\ while(1) { t=hjfg(x,p);/*调用黄金分割法求t的值*/ printf(\ x[0]=x[0]+t*p[0]; x[1]=x[1]+t*p[1]; g[0]=2*x[0]; g[1]=50*x[1]; /*printf(\ mod2=sqrt(pow(g[0],2)+pow(g[1],2)); /*求梯度的长度*/ if(mod2<=eps) break; if(k+1==n) { g[0]=2*x[0]; g[1]=50*x[1]; p[0]=-g[0]; p[1]=-g[1]; k=0; else { } else { nanda=pow(mod2,2)/pow(mod1,2); printf(\ p[0]=-g[0]+nanda*p[0]; p[1]=-g[1]+nanda*p[1]; mod1=mod2; k++; } } } printf(\ 附录10 #include 下载可编辑 int const n=2;//正定二次函数的自变量个数 double fun(double x[n],double f_xs[n+n+1+(n-1)*n/2]);//输入变量为函数自变量初值 void Q_fun(double f_xs[n+n+1+(n-1)*n/2],double Q[n][n+1]); void D_fun(double x[n],double Q[n][n+1],double g0[n]); int H(double g0[n],double c);//判别准则:返回1结束,返回0继续迭代 void abc(double x[n],double p[n],double f_xs[n+n+1+(n-1)*n/2],double t[3]); double t_c(double t[3]);//二次函数一阶导为零计算t的值,t>0 void main() { double f_xs[n+n+1+(n-1)*n/2]={4,1,-40,-12,136,0}; double x[n]={8,9};//函数自变量初值 double f0;//函数值 double g0[n];//梯度的值 double Q[n][n+1];//求梯度处值设置的中间变量,包含两部分:正定二次函数对应的实对称矩阵,还有一次项系数 double c=0.01;//H准则限值 double t[3];//返回求minf()时t的二次函数的a,b,c的系数值 double t_bc;//步长 double p[n];//保存下降方向 double H0[n][n];//保存模拟Hesse矩阵的逆 double y[n];//y(k)=g0(k+1)-g0(k) double s[n];//s(k)=X(k+1)-X(k) double s_temp[n][n]={0};//计算保存矩阵 double s_temp2[n][n]={0}; double s_temp3[n][n]={0}; double s_tl[n]={0}; double temp;//临时值 int i,j,k,flag=0,tap=0;//迭代次数 Q_fun(f_xs,Q);//计算正定二次函数对应的实对称矩阵 f0=fun(x,f_xs);//求函数初值 D_fun(x,Q,g0);//返回梯度的初值 do { for(i=0;i for(i=0;i for(j=0;j if(i==j) else H0[i][j]=0; H0[i][j]=1; .专业.整理. 下载可编辑 do { p[i]=(-1)*g0[i]; k=0;//step 2; .专业.整理. abc(x,p,f_xs,t);//开始计算minf(Xk+tPk)时的步长t的值, t_bc=t_c(t);//求一阶导来计算t for(i=0;i s[i]=t_bc*p[i];//保存计算之值X(k+1)-X(k) } for(i=0;i y[i]=g0[i];//保存之类的 f0=fun(x,f_xs); D_fun(x,Q,g0);//step 3; for(i=0;i { if(k!=n) { //y //s have done! temp=0;//初值 for(i=0;i { for(j=0;j } }//求出S(k)S(k)t/S(k)tyk for(i=0;i