当前位置:文档之家› 鲍威尔法编程-powell法编程 c语言编程 c++6.0

鲍威尔法编程-powell法编程 c语言编程 c++6.0

k=0;ks=0;
for(i=0;i<N;i++)
xooo[i]=xo[i];
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
if(i==j)
ss[i][j]=1;
else
ss[i][j]=0;
}
do
{
for(i=0;i<N;i++)
xoo[i]=xooo[i];
k=k+1;
for(i=0;i<N;i++)
{
{
for(j=0;j<N;j++)
s[j]=ss[i][j];
}
fmin=ywyh(xooo,t,s,z);
for(j=0;j<N;j++)
x[j]=z[j];
fi[i]=fmin;
for(j=0;j<N;j++)
xooo[j]=x[j];
}
for(i=0;i<N;i++)
{
s[i]=x[i]-xoo[i];xe[i]=2*x[i]-xoo[i];
//f=1.5*z[0]*z[0]+0.5*z[1]*z[1]-z[0]*z[1]-2*z[0];
return(f);
}
float ywyh(float x[N],float t,float s[N],float z[N])
{
float q=0.618,e,A[N],f[2],a,b,c=0.1,d=0.1;
{
fmin=ywyh(xooo,t,s,z);f[1]=fmin;
for(j=0;j<N;j++)
x[j]=z[j];
for(i=0;i<N-1;i++)
{
if(i<m)
{
for(j=0;j<N;j++)
ss[i][j]=ss[i][j];
}
else
{
for(j=0;j<N;j++)
ss[i][j]=ss[i+1][j];
if(f[0]>f[1])
a=b-t;
else break;}
while(f[0]>f[1]);
}
else
{
t=0-t;
do
{a=a+t;f[1]=f[0];
for(i=0;i<N;i++)
z[i]=x[i]+a*s[i];
f[0]=gs(z);
if(f[1]>f[0])
{
b=a-t;t=2*t;
}
else break;}
while(f[1]>f[0]);
}
do
{
j=j+1;
A[0]=b-q*(b-a);
for(i=0;i<N;i++)
z[i]=x[i]+A[0]*s[i];
f[0]=gs(z);
A[1]=a+q*(b-a);
for(i=0;i<N;i++)
z[i]=x[i]+A[1]*s[i];
df=(f[0]-f[1])/f[1];
else
df=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<N;i++)
{
if(xoo[i]-x[i]>0)
dxl=xoo[i]-x[i];
else
}
}
for(i=0;i<N;i++)
ss[N-1][i]=s[i];
ks=ks+1;
}
else
{
if(fmin>f[2])
{
for(i=0;i<N;i++)
x[i]=xe[i];
f[1]=f[2];fmin=f[2];
}
else ;
}
for(i=0;i<N;i++)
xooo[i]=x[i];
if((f[0]-f[1])/f[1]>0)
int i,j,k,ks,m;
for(i=0;i<N;i++)
{
printf("请输入初始点x[%d]=",i);
scanf("%f",&xo[i]);
}
printf("请输入迭代精度Ef,Ex=");
scanf("%f,%f",&c,&d);
printf("请输入步长T=");
scanf("%f",&t);
}
f[0]=gs(xoo);f[1]=fmin;f[2]=gs(xe);fio=f[0];
dm=fio-fi[0];m=0;
for(i=0;i<N-1;i++)
{
dml=fi[i]-fi[i+1];
if(dm<dml)
{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]<f[0])
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;i<N;i++)
z[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];
printf("\n搜索累计次数k=%d\n",k);
printf("\n替换方向累计次数ks=%d\n",ks);
}
dxl=x[i]-xoo[i];
if(dx<dxl)
dx=dxl;
else ;
}
}
while(dx>c||df>d);
for(i=0;i<N;i++)
z[i]=x[i];
for(i=0;i<N;i++)
printf("\n最优点坐标x[%i]=%f\n",i,z[i]);
printf("\n最优函数值f(x)=%f\n",fmin);
int i,j=0;
a=0;b=t;
f[0]=gs(x);
for(i=0;i<N;i++)
z[i]=x[i]+b*s[i];
f[1]=gs(z);
if(f[1]<f[0])
{
do
{t=2*t;b=b+t;f[0]=f[1];
for(i=0;i<N;i++)
z[i]=x[i]+b*s[i];
f[1]=gs(z);
}while(e>d);
if(f[0]<f[1])
{
for(i=0;i<N;i++)
z[i]=x[i]+A[0]*s[i];
return(f[0]);
}
else
{
for(i=0;i<N;i++)
z[i]=x[i]+A[1]*s[i];
return(f[1]);
}
}
void main()
{
float xo[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;
if((A[1]-A[0])/A[0]>0)
e=(A[1]-A[0])/A[0];
else
e=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];
else
e=0-(A[1]-A[0])/A[0];
#include <stdio.h>
#define N 2
float gs(float z[N])
{
float f;
//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];
A[0]=b-q*(b-a);
for(i=0;i<N;i++)
z[i]=x[i]+A[0]*s[i];
相关主题