机械优化设计惩罚函数内点法Word格式.doc
《机械优化设计惩罚函数内点法Word格式.doc》由会员分享,可在线阅读,更多相关《机械优化设计惩罚函数内点法Word格式.doc(6页珍藏版)》请在冰豆网上搜索。
//s=x[0]*x[0]+x[1]*x[1];
s=x[0]*x[0]+x[1]*x[1]+x[2]*x[2]+x[3]*x[3];
returns;
doublef(doublex[],doubler)
doubles,t,t2;
//t=1-x[0];
t=1-x[0];
t2=2-x[1];
//s=yuanhansu(x)-r*log(fahansu(t));
s=yuanhansu(x)-r*log(fahansu(t))-r*log(fahansu(t2));
voidjintuifa(doubleab[m][m],intn,doublex0[],doubleh,intij,doublea[],doubleb[],doubler0)
inti,j,z;
doublex1[m],x2[m],x3[m],f1,f2,f3;
doubles[m];
for(i=0;
i<
n;
i++)
{
s[i]=ab[i][ij];
}
for(i=0;
i<
n;
i++)
{
x1[i]=x0[i];
x2[i]=x0[i]+(double)h*s[i];
}
f1=f(x1,r0);
f2=f(x2,r0);
if(f2>
=f1)
h=(-1)*h;
for(i=0;
x3[i]=x1[i];
f3=f1;
x1[i]=x2[i];
f1=f2;
x2[i]=x3[i];
f2=f3;
x3[i]=x2[i]+(double)h*s[i];
f3=f(x3,r0);
while(f3<
f2)
h=2*h;
x3[i]=x2[i]+(double)h*s[i];
f3=f(x3,r0);
if(x1[i]<
x3[i])
a[i]=x1[i];
b[i]=x3[i];
}
else
a[i]=x3[i];
b[i]=x1[i];
voidhongjinfa(intn,doublea[],doubleb[],doubleflag,doublex[],doubler0)
inti;
doublex1[m],x2[m],f1,f2;
while
(1)
x1[i]=b[i];
f1=f(x1,r0);
x2[i]=a[i];
f2=f(x2,r0);
if(fabs((f2-f1)/f2)<
=flag)
{
for(i=0;
x[i]=(double)(b[i]+a[i])/2.0;
break;
}
else
x1[i]=b[i]-(double)0.618*(b[i]-a[i]);
x2[i]=a[i]+(double)0.618*(b[i]-a[i]);
if(f(x1,r0)>
f(x2,r0))
for(i=0;
a[i]=x1[i];
else
b[i]=x2[i];
voidbaoweifa(intn,doublex0[],doubleh,doubleflag,doublea[],doubleb[],doublex[],doubler0)
inti,j,k,r,sum,p,e;
doublex1[m],x2[m],abc[m],kr[m],f0,f1,f2,fn[m],c[m],q,wo;
k=0;
doubleab[m][m];
{
for(j=0;
j<
j++)
{
if(i==j)
ab[i][j]=1;
else
ab[i][j]=0;
}
wo=f(x0,r0);
for(p=0;
p<
p++)
q=f(x0,r0);
jintuifa(ab,n,x0,h,p,a,b,r0);
hongjinfa(n,a,b,flag,x1,r0);
for(e=0;
e<
e++)
{
x0[e]=x1[e];
}
fn[p]=(double)(q-f(x1,r0));
k=k+1;
x2[i]=(double)2*x1[i]-x0[i];
c[i]=(double)x1[i]-x0[i];
r=0;
if(fn[0]<
=fn[i])
fn[0]=fn[i];
r=i;
}
f0=f(x0,r0);
if(f2>
=f0||((double)f0-(double)2*f1+(double)f2)*((double)f0-(double)f1-(double)fn[0])*((double)f0-(double)f1-(double)fn[0])>
=0.5*fn[0]*(double)(f0-f2)*(double)(f0-f2))
if(f1<
x0[i]=x1[i];
x0[i]=x2[i];
intij;
ij=n-1;
for(i=0;
kr[i]=x1[i];
for(i=0;
{
for(j=0;
n-1;
{
if(j>
=r)
ab[i][j]=ab[i][j+1];
}
ab[i][n-1]=c[i];
}
jintuifa(ab,n,kr,h,ij,a,b,r0);
hongjinfa(n,a,b,flag,x1,r0);
x0[i]=x1[i];
if((fabs(f(x0,r0)-wo))/f(x0,r0)<
break;
x[i]=x0[i];
intmain()
intv,i,n;
doubleh,flag,x0[m],a[m],b[m],x[m];
doublefom,fxo,c,r0;
c=0.5;
r0=100.0;
fom=100;
printf("
请输入维数:
\n"
);
scanf("
%d"
&
n);
请输入初始点:
"
printf("
\nx0[%d]="
i);
scanf("
%lf"