修正鲍威尔

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*(xx[0]+i)=x[i];
for(j=m+1;j<=n;j++)
for(i=0;i<n;i++)
*(ss+i*(n+1)+j-1)=*(ss+i*(n+1)+j);
}
}
}
voidmain()
{double p[]={2.15,2.15};
doubleff,x[2];
ff=powell(p,0.3,0.001,0.0001,2,x);
{inti,j,m;
double*xx[4],*ss,*s;
double f,f0,f1,f2,f3,fx,dlt,df,sdx,q,d;
ss=(double *)malloc(n*(n+1)*sizeof(double));
s=(double *)malloc(n*sizeof(double));
for(i=0;i<n;i++)
{for(j=0;j<=n;j++)
*(ss+i*(n+1)+j)=0;
*(ss+i*(n+1)+i)=1;
}
for(i=0;i<4;i++)
xx[i]=(double *)malloc(n*sizeof(double));
for(i=0;i<n;i++)
*(xx[0]+i)=p[i];
}
f1=f2;
f2=f3;
}
}
if(h<0. )
for(i=0;i<n;i++)
{a[i]=*(x[2]+i);
b[i]=*(x[0]+i);
}
else
for(i=0;i<n;i++)
{a[i]=*(x[0]+i);
b[i]=*(x[2]+i);
}
for(i=0;i<3;i++)
free(x[i]);
b=(double *)malloc(n*sizeof(double));
jtf(x0,h0,s,n,a,b);
ff=gold(a,b,epsg,n,x);
free(a);
free(b);
return(ff);
}
doublepowell(double p[],double h0,doubleeps,doubleepsg,intn,doublex[])
(5)确定映射点
=( =( )
鲍威尔条件
( )2 ( )2
若至少其中之一成立转下步,否则转步骤(7)。
(6)置k+1环的基本方向组和起始点为 (即取老方向组)
令k 返回步骤(2)。
(7)置k+1环的基本方向组和起始点为 , ,…, )
令k 返回步骤(2)。
3、修正鲍威尔的流程图
4、修正鲍威尔的程序源代码
free(xx[i]);
return(f);
}
for(i=0;i<n;i++)
*(xx[2]+i)=x[i];
f2=f;
for(i=0;i<n;i++)
{*(xx[3]+i)=2.*(*(xx[2]+i)-(*(xx[1]+i)));
x[i]=*(xx[3]+i);
}
fx=objf(x);
f3=fx;
修正鲍威尔法
1、题目:用改进的鲍威尔法求目标函数 的最优解。已知起始点[2.15、2.15]T,迭代精度 。
2、修正鲍威尔的迭代步骤
修正鲍威尔法的步骤如下:
(1)任选初始迭代点 ,选定迭代精度 ,取初始基本方向组为单位坐标矢量系 其中, 然后令k=1(环数)开始下面的迭代。
(2)沿 诸方向依次进行n次一维搜索,确定各最优步长 ,
ff=objf(xx);
for(i=0;i<2;i++)
free(x[i]);
return(ff);
}
doubleoneoptim(double x0[],double s[],double h0,doubleepsg,intn,doubleห้องสมุดไป่ตู้[])
{double*a,*b,ff;
a=(double *)malloc(n*sizeof(double));
}
f1=f2;
f2=f3;
}
for(;;)
{h=2. *h;
for(i=0;i<n;i++)
*(x[2]+i)=* (x[1]+i) +h*s[i];
f3=objf(x[2]);
if(f2<f3)
break;
else
{ for(i=0;i<n;i++)
{*(x[0]+i)= *(x[1]+i);
*(x[1]+i)= *(x[2]+i);
for(;;)
{for(i=0;i<n;i++)
{*(xx[1]+i)=*(xx[0]+i);
x[i]=*(xx[1]+i);
}
f0=f1=objf(x);
dlt=-1;
for(j=0;j<n;j++)
{for(i=0;i<n;i++)
{*(xx[0]+i)=x[i];
*(s+i)=*(ss+i*(n+1)+j);
*(xx[0]+i)=*(xx[3]+i);
}
else
{for(i=0;i<n;i++)
{*(ss+(i+1)*(n+1))=x[i]-(*(xx[1]+i));
*(s+i)=*(ss+(i+1)*(n+1));
}
f=oneoptim(xx[0],s,h0,epsg,n,x);
for(i=0;i<n;i++)
}
f1=f2;
for(i=0;i<n;i++)
*(x[1]+i)=a[i]+0.382*(b[i]-a[i]);
f2=objf(x[1]);
}
else
{for(i=0;i<n;i++)
{a[i]=*(x[1]+i);
*(x[1]+i)=*(x[0]+i);
}
f2=f1;
for(i=0;i<n;i++)
}
doublegold(double a[],double b[],doubleeps,intn,doublexx[])
{
inti;
doublef1,f2,*x[2],ff,q,w;
for(i=0;i<2;i++)
x[i]=(double*)malloc(n*sizeof(double));
for(i=0;i<n;i++)
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
doubleobjf(double x[])
{doubleff;
ff=x[0]*x[0]+2*x[1]*x[1]-4*x[0]-2*x[0]*x[1];
return(ff);
}
voidjtf(double x0[ ],double h0,double s[ ],intn,doublea[ ],double b[ ])
q=(f1-2*f2+f3)*(f1-f2-dlt)*(f1-f2-dlt);
d=0.5*dlt*(f1-f3)*(f1-f3);
if((f3<f1)||(q<d))
{if(f2<=f3)
for(i=0;i<n;i++)
*(xx[0]+i)=*(xx[2]+i);
else
for(i=0;i<n;i++)
printf("输出最优点及其目标函数值:\n");
printf("x[0]=%f,x[1]=%f,ff=%f",x[0],x[1],ff);}
}
f=oneoptim(xx[0],s,h0,epsg,n,x);
df=f0-f;
if(df>dlt)
{dlt=df;
m=j;
}
}
sdx=0.;
for(i=0;i<n;i++)
sdx=sdx+fabs(x[i]-(*(xx[1]+i)));
if(sdx<eps)
{free(ss);
free(s);
for(i=0;i<4;i++)
{*(x[0]+i)=a[i]+0.618*(b[i]-a[i]);
*(x[1]+i)=a[i]+0.382*(b[i]-a[i]);
}
f1=objf(x[0]);
f2=objf(x[1]);
do
{if(f1>f2)
{for(i=0;i<n;i++)
{b[i]=*(x[0]+i);
*(x[0]+i)=*(x[1]+i);
使F( )=minF( )
得到点列 = ,i=1,2,..n
构成新生方向
沿 方向进行一维搜索求得优化步长 ,得
=
(3)判断是否满足迭代终止条件。若满足
则可以结束迭代,得最优解为 ,
停止计算,否则继续进行下步。
(4)计算各迭代点的函数值F( ),并找出相邻点的函数值最大者 = ( m )及与之相对应的两个点 ,并以 表示该两点的连线方向。
{inti;
double*x[3],h,f1,f2,f3;
for(i=0;i<3;i++)
x[i]=(double *)malloc(n*sizeof(double));
h=h0;
for(i=0;i<n;i++)
*(x[0]+i)=x0[i];
f1=objf(x[0]);
for(i=0;i<n;i++)
*(x[1]+i)=*(x[0]+i)+h*s[i];
f2=objf(x[1]);
if(f2>=f1)
{h= -h0;
for(i=0;i<n;i++)
*(x[2]+i)=*(x[0]+i);
f3=f1;
for(i=0;i<n;i++)
{*(x[0]+i)= *(x[1]+i);
*(x[1]+i)= *(x[2]+i);
*(x[0]+i)=a[i]+0.618*(b[i]-a[i]);
f1=objf(x[0]);
}
q=0;
for(i=0;i<n;i++)
q=q+(b[i]-a[i])*(b[i]-a[i]);
w=sqrt(q);
}while(w>eps);
for(i=0;i<n;i++)
xx[i]=0.5*(a[i]+b[i]);
相关文档
最新文档