鲍威尔法.docx
《鲍威尔法.docx》由会员分享,可在线阅读,更多相关《鲍威尔法.docx(7页珍藏版)》请在冰豆网上搜索。
![鲍威尔法.docx](https://file1.bdocx.com/fileroot1/2022-12/29/37b23e25-2877-4b30-b8b6-10c647e79769/37b23e25-2877-4b30-b8b6-10c647e797691.gif)
鲍威尔法
#include
#defineN2
floatgs(floatz[N])
{floatf;//f=10*(z[0]+z[1]-5)*(z[0]+z[1]-5)+(z[0]-z[1])*(z[0]-z[1]);f=4+4.5*z[0]-4*z[1]+z[0]*z[0]+2*z[1]*z[1]-2*z[0]*z[1]+z[0]*z[0]*z[0]*z[0]-2*z[0]*z[0]*z[1];//f=1.5*z[0]*z[0]+0.5*z[1]*z[1]-z[0]*z[1]-2*z[0];return(f);}floatywyh(floatx[N],floatt,floats[N],floatz[N])
{floatq=0.618,e,A[N],f[2],a,b,c=0.1,d=0.1;inti,j=0;a=0;b=t;f[0]=gs(x);
for(i=0;iz[i]=x[i]+b*s[i];
f[1]=gs(z);
if(f[1]{do{t=2*t;b=b+t;f[0]=f[1];
for(i=0;iz[i]=x[i]+b*s[i];
f[1]=gs(z);
if(f[0]>f[1])
a=b-t;
elsebreak;}
while(f[0]>f[1]);
}
else
{t=0-t;
do
{a=a+t;
f[1]=f[0];
for(i=0;if[0]=gs(z);if(f[1]>f[0])
{b=a-t;
t=2*t;
}
elsebreak;
}
while(f[1]>f[0])
}
do
{j=j+1;
A[0]=b-q*(b-a);
for(i=0;iz[i]=x[i]+A[0]*s[i];
f[0]=gs(z);
A[1]=a+q*(b-a);
for(i=0;iz[i]=x[i]+A[1]*s[i];
f[1]=gs(z);
do{if(f[0]>f[1])
{a=A[0];
A[0]=A[1];
f[0]=f[1];
A[1]=a+q*(b-a);
for(i=0;iz[i]=x[i]+A[1]*s[i];
f[1]=gs(z);
j=j+1;
if(j>50)
break;
}
else
{b=A[1];
A[1]=A[0];
f[1]=f[0];
A[0]=b-q*(b-a);
for(i=0;iz[i]=x[i]+A[0]*s[i];
f[0]=gs(z);
j=j+1;
if(j>50)
break;
}
if((f[1]-f[0])/f[1]>0)
e=(f[1]-f[0])/f[1];
elsee=0-(f[1]-f[0])/f[1];
}
while(e>c)
if((A[1]-A[0])/A[0]>0)
e=(A[1]-A[0])/A[0];
elsee=0-(A[1]-A[0])/A[0];
if(e<=d)break;
else
{a=A[0];
b=A[1];
}
if((A[1]-A[0])/A[0]>0)
e=(A[1]-A[0])/A[0];
elsee=0-(A[1]-A[0])/A[0];
}
while(e>d)
if(f[0]{for(i=0;iz[i]=x[i]+A[0]*s[i];
return(f[0]);
}
else
{for(i=0;iz[i]=x[i]+A[1]*s[i];
return(f[1]);
}
}
voidmain()
{floatxo[N],ss[N][N],z[N],c,d,t,fmin,xooo[N],xoo[N],fi[N],s[N],x[N],xe[N],f[N],fio,dm,dml,df,dx,dxl;
inti,j,k,ks,m;
for(i=0;i{printf("请输入初始点x[%d]=",i);
scanf("%f",&xo[i]);
}
printf("请输入迭代精度Ef,Ex=");
scanf("%f,%f",&c,&d);
printf("请输入步长T=");
scanf("%f",&t);
k=0;ks=0;
for(i=0;ixooo[i]=xo[i];
for(i=0;ifor(j=0;j{if(i==j)ss[i][j]=1;
elsess[i][j]=0;
}
do
{for(i=0;ixoo[i]=xooo[i];
k=k+1;
for(i=0;i{
{for(j=0;js[j]=ss[i][j];
}
fmin=ywyh(xooo,t,s,z);
for(j=0;jfi[i]=fmin;
for(j=0;jxooo[j]=x[j];
}
for(i=0;i{s[i]=x[i]-xoo[i];
xe[i]=2*x[i]-xoo[i];
}
f[0]=gs(xoo);
f[1]=fmin;
f[2]=gs(xe);
fio=f[0];
dm=fio-fi[0];
m=0;
for(i=0;i{dml=fi[i]-fi[i+1];
if(dm{dm=dml;m=i+1;
}
else;
}if((f[0]+f[2]-2*f[1])*(f[0]-f[1]-dm)*(f[0]-f[1]-dm)<0.5*dm*(f[0]-f[2])*(f[0]-f[2])&&f[2]{fmin=ywyh(xooo,t,s,z);
f[1]=fmin;f
or(j=0;jx[j]=z[j];
for(i=0;i{if(i{for(j=0;jss[i][j]=ss[i][j];
}
else
{for(j=0;jss[i][j]=ss[i+1][j];
}
}
for(i=0;iss[N-1][i]=s[i];
ks=ks+1;
}
else
{if(fmin>f[2])
{for(i=0;ix[i]=xe[i];
f[1]=f[2];
fmin=f[2];
}
else
}
for(i=0;ixooo[i]=x[i];
if((f[0]-f[1])/f[1]>0)
df=(f[0]-f[1])/f[1];
elsedf=0-(f[0]-f[1])/f[1];
if(xoo[0]-x[0]>0)dx=xoo[0]-x[0];
else
dx=x[0]-xoo[0];
for(i=1;i{if(xoo[i]-x[i]>0)
dxl=xoo[i]-x[i];
elsedxl=x[i]-xoo[i];
if(dxelse
}
}
while(dx>c||df>d)
for(i=0;iz[i]=x[i];
for(i=0;iprintf("\n最优点坐标x[%i]=%f\n",i,z[i]);
printf("\n最优函数值f(x)=%f\n",fmin);
printf("\n搜索累计次数k=%d\n",k);
printf("\n替换方向累计次数ks=%d\n",ks);}