最优化方法课程实验报告 下载本文

下载可编辑

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 #include #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

{ for(j=0;j

}

temp=0;//初值

for(i=0;i