机械优化设计实验指导书Word文档下载推荐.docx
《机械优化设计实验指导书Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《机械优化设计实验指导书Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
本课程实验成绩依据以下几个方面进行考核
1、实验报告
2、考核所编制的程序
3、实验纪律、出勤等
实验一一维搜索方法
本实验求函数f(x)=(x-3)2的搜索区间[a,b]。
并用黄金分割法和插值法分别求最优解
#include<
math.h>
stdio.h>
/*函数f(x)=(x-3)2*/
doublef(doublex)
{
return(x-3)*(x-3);
}
/*求搜索区间[a,b]的函数,x0---初始点;
h0---初始步长*/
voidfind_ab(doublex0,doubleh0,double*a,double*b)
{
doubleh,x1,y1,x2,y2,x3,y3;
h=h0;
x1=x0;
y1=f(x1);
x2=x1+h;
y2=f(x2);
if(y2>
=y1){
h=-h0;
x3=x1;
y3=y1;
x1=x2;
y1=y2;
x2=x3;
y2=y3;
}
for(;
;
){
h*=2.0;
x3=x2+h;
y3=f(x3);
if(y2<
y3)break;
if(h>
0){*a=x1;
*b=x3;
else{*a=x3;
*b=x1;
/*
黄金分割法
a,b---搜索区间[a,b];
e---精度
x,y---最优解X*,F*
*/
voidsearch_gold(doublea,doubleb,doublee,
double*x,double*y)
doublex1,x2,y1,y2;
x1=a+0.382*(b-a);
x2=a+0.618*(b-a);
do{
if(y1<
y2){
b=x2;
x2=x1;
y2=y1;
x1=a+0.382*(b-a);
}else{
a=x1;
x2=a+0.618*(b-a);
}while(b-a>
e);
*x=0.5*(a+b);
*y=f(*x);
二次插值法
xpt,ypt---最优解X*,F*
voidsearch_insert(doublea,doubleb,doublee,
double*xpt,double*fpt)
doublex1,x2,f1,f2,x3,f3,xp,fp,xp0,c1,c2;
intk=1;
x1=a;
x3=b;
x2=0.5*(a+b);
f1=f(x1);
f2=f(x2);
f3=f(x3);
xp0=0;
c1=(f3-f1)/(x3-x1);
c2=((f2-f1)/(x2-x1)-c1)/(x2-x3);
if(c2==0.0){*xpt=x2;
*fpt=f2;
break;
xp=0.5*(x1+x3-c1/c2);
fp=f(xp);
if((xp-x1)*(x3-xp)<
=0.0){
*xpt=x2;
if(k!
=1)if(fabs(xp0-xp)<
=e){
*xpt=xp;
*fpt=fp;
if(xp>
x2)if(f2<
fp){
x3=xp;
f3=fp;
x1=x2;
f1=f2;
x2=xp;
f2=fp;
}elseif(f2<
x1=xp;
f1=fp;
x3=x2;
f3=f2;
xp0=xp;
k++;
实验二无约束优化方法---鲍威尔方法
本实验用鲍威尔方法求函数f(x)=(x1-5)2+(x2-6)2的最优解
stdlib.h>
constMAXN=10;
doublexkk[MAXN],xk[MAXN],sk[MAXN];
intN;
doubleF(double*x)
return4*pow(x[0]-5,2.0)+pow(x[1]-6,2.0);
doublef(doublex)
for(inti=0;
i<
N;
i++)xkk[i]=xk[i]+x*sk[i];
returnF(xkk);
无约束坐标轮换法
x0--初始点
e1--一维搜索精度
e2--求解精度
doublenc_trans(double*x0,doublee1,doublee2)
inti,j,k=1;
doublea,b,ax,ay,d;
for(j=0;
j<
j++)xk[j]=x0[j];
for(i=0;
i++){
for(j=0;
j++)if(j==i)sk[j]=1;
elsesk[j]=0;
find_ab(0,1,&
a,&
b);
search_gold(a,b,e2,&
ax,&
ay);
j++)xk[j]=xkk[j];
d=0;
j++)
d+=(x0[j]-xkk[j])*(x0[j]-xkk[j]);
d=sqrt(d);
printf("
k=%d;
"
k);
j++)
x[%d]=%lf;
j+1,xkk[j]);
d=%lf\n"
d);
if(d<
=e1)break;
j++)x0[j]=xkk[j];
鲍威尔法
doublenc_powell(double*x0,doublee1,doublee2)
inti,j,k=1,m;
doubless[MAXN][MAXN],s1[MAXN],
ff[MAXN],x[MAXN],xn[MAXN],
xn1[MAXN],f0,f1,f2,f3;
i++)for(j=0;
j++)if(j==i)
ss[i][j]=1;
elsess[i][j]=0;
j++)sk[j]=ss[i][j];
ff[i]=F(xk);
j++)xn[j]=xkk[j];
j++){
sk[j]=xkk[j]-x0[j];
s1[j]=sk[j];
find_ab(0,1,&
search_gold(a,b,e2,&
j++)x[j]=xkk[j];
j++)d+=(x[j]-x0[j])*(x[j]-x0[j]);
x[%d]=%lf;
j+1,x0[j]);
=e1){
j++)x0[j]=x[j];
break;
f0=F(x0);
d=f0-ff[0];
m=0;
for(j=1;
j++)if(d<
ff[j-1]-ff[j]){
m=j;
d=ff[j-1]-ff[j];
j++)xn1[j]=2*xn[j]-x0[j];
f1=F(x0);
f2=F(xn);
f3=F(xn1);
if(0.5*(f1-2*f2+f3)>
=d){
if(f2<
f3)for(j=0;
j++)x0[j]=xn[j];
elsefor(j=0;
j++)x0[j]=xn1[j];
for(i=m+1;
ss[i-1][j]=ss[i][j];
j++)ss[N-1][j]=s1[j];
实验三无约束优化方法---DFP方法
本实验用DFP方法求函数f(x)=(x1-5)2+(x2-6)2的最优解
/*DFP法--求梯度*/
doubleDF(double*x,double*df)
df[0]=8*(x[0]-5);
df[1]=2*(x[1]-6);
return(sqrt(df[0]*df[0]+df[1]*df[1]));
/*DFP法--求构造矩阵Ak+1*/
voidcomputer_A(doubleA[][MAXN],double*cc,
double*yy)
doubleB[MAXN][MAXN],C[MAXN][MAXN],
D[MAXN][MAXN],E[MAXN][MAXN];
doublea,b,c;
inti,j,k;
B[i][j]=cc[i]*cc[j];
D[i][j]=yy[i]*yy[j];
j++){
E[i][j]=0;
for(k=0;
k<
k++)E[i][j]+=A[i][k]*D[k][j];
C[i][j]=0;
k++)C[i][j]+=E[i][k]*A[k][j];
a=0;
i++)a+=cc[i]*cc[i];
b=0;
c=0;
j++)c+=yy[j]*A[j][i];
b+=c*yy[i];
A[i][j]+=B[i][j]/a-C[i][j]/b;
DFP法
doublenc_dfp(double*x0,doublee1,doublee2)
doubleA[MAXN][MAXN],gk[MAXN],
g0[MAXN],cc[MAXN],yy[MAXN];
d=DF(x0,g0);
=e1)returnF(x0);
A[i][j]=1;
elseA[i][j]=0;
i++)xk[i]=x0[i];
k++){
sk[j]=0;
for(i=0;
i++)sk[j]+=-A[j][i]*g0[i];
}
printf("
==%lf=="
ax);
d=DF(xk,gk);
j+1,xk[j]);
if(d<
i++)x0[i]=xk[i];
returnF(x0);
for(i=0;
i++){
cc[i]=xk[i]-x0[i];
yy[i]=gk[i]-g0[i];
computer_A(A,cc,yy);
i++){x0[i]=xk[i];
g0[i]=gk[i];
实验四约束优化方法---约束随机方向法
本实验用随机方向法求目标函数的最优解
数学模型:
F(x)=(x1-8)2+(x2-8)2
g1(x)=x1
g2(x)=x2-1
g3(x)=11-x1-x2
time.h>
#definesqr(x)((x)*(x))
#defineN10
intnt;
doublefunt(double*x,double*g,int*b)
{inti;
g[0]=x[0];
g[1]=x[1]-1;
g[2]=11-x[0]-x[1];
*b=1;
nt;
i++)if(g[i]<
0){*b=0;
returnsqr(x[0]-8)+sqr(x[1]-8);
voidfind_sk(intnmax,doublesk[])
{doublesm,c;
inti;
sm=0;
for(i=0;
i<
nmax;
i++){
c=(double)(rand()+1.0)/RAND_MAX;
c=2*c-1;
sm+=c*c;
sk[i]=c;
sm=sqrt(sm);
nmax;
i++)sk[i]=sk[i]/sm;
voidmain()
{doublea,a0,f0,f,e,sk[N],xk[N],x0[N],g[N];
intb1,b2,b,mt,M,i,k;
nt=3;
M=50;
a0=0.4,e=0.01;
x0[0]=2;
x0[1]=3;
mt=2;
f0=funt(x0,g,&
for(i=0;
mt;
if(!
b)return;
k=0;
srand((unsigned)time(NULL));
for(;
if(a0<
=e)break;
if(k==M){a0=0.5*a0;
find_sk(mt,sk);
a=a0;
for(i=0;
i++)xk[i]=x0[i]+a*sk[i];
f=funt(xk,g,&
b1);
if(!
(b1&
&
f<
f0)){
a=-a0;
b2);
if(b2&
f0)b=1;
}elseb=1;
b){k++;
continue;
k=0;
f0=f;
for(i=0;
for(;
if((b1&
f0)){f0=f;
elsebreak;
%s\n"
"
********最优结果*********"
);
i++)printf("
x*[%d]=%lf\n"
i+1,x0[i]);
f*=%lf\n"
f0);
/*********最优结果*********x*[1]=5.511014x*[2]=5.488826f*=12.501044*/
实验五约束优化方法---复合型法
本实验用复合型法求目标函数的最优解
inti;
/*排序--按函数值从小到大*/
voidsort(doublepx[N][N],double*pf,intK,intmt)
doublet;
K-1;
i++)for(j=i+1;
K;
j++)if(pf[j]<
pf[i]){
t=pf[i];
pf[i]=pf[j];
pf[j]=t;
for(k=0;
k++){t=px[i][k];
px[i][k]=px[j][k];
px[j][k]=t;
{inti,j,mt,b;
doublea,f,f0,fr,d,e,c,g[N],x0[N],xr[N];
intH,K;
/*H--坏点,K--复合形顶点数*/
doublepx[N][N],pf[N];
/*复合形顶点及相应的函数值*/
doubleXL[N]={2,2},XH[N]={10,10};
/*给定变量的下限和上限*/
/*不等式个数*/
/*变量个数*/
e=0.001;
K=3;
i++){/*产生初始复合形*/
for(j=0;
j<
mt;
j++){
px[i][j]=XL[j]+c*(XH[j]-XL[j]);
pf[i]=funt(px[i],g,&
}while(!
sort(px,pf,K,mt);
a=1.3;
H=K-1;
){
x0[i]=0;
for(j=0;
j++)if(j!
=H)x0[i]+=px[j][i];
x0[i]/=K-1;
i++)xr[i]=x0[i]+a*(x0[i]-px[H][i]);
fr=funt(xr,g,&