《 機(jī)械優(yōu)化設(shè)計(jì) 》
實(shí)驗(yàn)報(bào)告
目錄
1、進(jìn)退法確定初始區(qū)間 ................................................................................. 錯(cuò)誤! 未定義書簽。
1、1 進(jìn)退法基本思路 ............................................................................. 錯(cuò)誤! 未定義書簽。
1、2 進(jìn)退法程序框圖誤錯(cuò)? 錯(cuò)誤! 未定義書簽。
1、3 題目誤錯(cuò)? 錯(cuò)誤! 未定義書簽。
1、4 源程序代碼及運(yùn)行結(jié)果誤錯(cuò)? 錯(cuò)誤! 未定義書簽。
2、黃金分割法 ................................................................................................. 錯(cuò)誤! 未定義書簽。
2、2 黃金分割法流程圖誤錯(cuò)? 錯(cuò)誤! 未定義書簽。
2、3 題目誤錯(cuò)? 錯(cuò)誤! 未定義書簽。
2、4 源程序代碼及結(jié)果 ......................................................................... 錯(cuò)誤! 未定義書簽。
3、牛頓型法誤錯(cuò)? 錯(cuò)誤! 未定義書簽。
3、1牛頓型法基本思路 ......................................................................... 錯(cuò)誤! 未定義書簽。
3、2 阻尼牛頓法得流程圖 ................................................................................................. 4 3、3 題目 ............................................................................................... 錯(cuò)誤! 未定義書簽。
3、4 源程序代碼及結(jié)果誤錯(cuò)? 錯(cuò)誤! 未定義書簽。
4、鮑威爾法誤錯(cuò)? 錯(cuò)誤! 未定義書簽。
4、1 鮑威爾法基本思路誤錯(cuò)? 錯(cuò)誤! 未定義書簽。
4、2 鮑威爾法流程圖誤錯(cuò)? 錯(cuò)誤! 未定義書簽。
4.3 題目誤錯(cuò)? 錯(cuò)誤! 未定義書簽。
4、4 源程序代碼及結(jié)果 ....................................................................... 錯(cuò)誤! 未定義書簽。
5、 復(fù)合形法誤錯(cuò)? 錯(cuò)誤! 未定義書簽。
5、1 復(fù)合行法基本思想 ......................................................................... 錯(cuò)誤! 未定義書簽。
5、3 源程序代碼及結(jié)果 ......................................................................... 錯(cuò)誤! 未定義書簽。
6、 外點(diǎn)懲罰函數(shù)法誤錯(cuò)? 錯(cuò)誤! 未定義書簽。
6、1 解題思路:誤錯(cuò)? 錯(cuò)誤! 未定義書簽。
6、2 流程框圖誤錯(cuò)? 錯(cuò)誤! 未定義書簽。
6、3 題目 ............................................................................................... 錯(cuò)誤! 未定義書簽。
6、4 源程序代碼及結(jié)果 ......................................................................... 錯(cuò)誤! 未定義書簽。
7、機(jī)械設(shè)計(jì)實(shí)際問題分析 ............................................................................. 錯(cuò)誤! 未定義書簽。
7、2計(jì)算過程如下誤錯(cuò)? 錯(cuò)誤! 未定義書簽。
7、3 源程序編寫誤錯(cuò)? 錯(cuò)誤! 未定義書簽。
8、報(bào)告總結(jié)誤錯(cuò)? 錯(cuò)誤! 未定義書簽。
1 、進(jìn)退法確定初始區(qū)間 1 、1
進(jìn)退法基本思路 :
按照一定得規(guī)則試算若干個(gè)點(diǎn),比較其函數(shù)值得大小,直至找到函數(shù)值按“高—低-高”變化得單峰區(qū)間。
1 、2 進(jìn)退法程序框圖
1、3 題目: :用進(jìn)退法求解函數(shù) 得搜索區(qū)間
1 、4 源程序代碼及運(yùn)行結(jié)果 #include <stdio、h〉 #include <math、h〉 main() {
;3af,2af,3a,2a,0=1a,3y,2y,1y,0h,h taolf? scanf("h0=%f,y1=%f”,&h0,&y1);
h=h0;a2=h;y2=a2*a2-7*a2+10;
)1y>2y( fi? {?
h=-h;a3=a1;y3=y1; loop:a1=a2;y1=y2;a2=a3;y2=y3;
}? a3=a2+2*h;y3=a3*a3-7*a3+10;
)2y〈3y( fi? {
;pool otog? }
esle?,2a,1a,"n\f%=3y,f%=2y,f%=1y,f%=3a,f%=2a,f%=1a”(ftnirp??a3,y1,y2,y3); } 搜索區(qū)間為0
6 2 、黃金分割法 2、1 黃金分割法基本思路 :
通過不斷得縮短單峰區(qū)間得長(zhǎng)度來搜
索極小點(diǎn)得一種有效方法。按() 縮小
比較大小
確定取舍區(qū)間。
2 、2 黃金分割法流程圖
2 、3
題目 :
對(duì)函數(shù),給定搜索區(qū)間時(shí),試用黃金分割法求極小點(diǎn)
2 、4 源程序代碼及結(jié)果: :
f=inline(’x^2—7*x+9")
a=0;b=8;eps=0、001;
a1=b-0、618*(b—a);y1=f(a1);
a2=a+0、618*(b—a);y2=f(a2);
while(abs(b-a)>eps)
if(y1〉=y(tǒng)2)
a=a1;
a1=a2;
y1=y(tǒng)2;
a2=a+0、618*(b-a);
y2=f(a2);
else
b=a2;a2=a1;y2=y1;
a1=b-0、618*(b-a);
y1=f(a1);
end
end
xxx=0、5*(a+b)
f =
Inline function:
f(x)
= x^2—7*x+9 xxx =
3、4997 3 3 、牛頓型法
3 、1 牛頓型法基本思路 : : 在鄰域內(nèi)用一個(gè)二次函數(shù)
來近似代替原目標(biāo)函數(shù),并將 得極小點(diǎn)作為對(duì)目標(biāo)函數(shù)求優(yōu)得下一個(gè)迭代點(diǎn).經(jīng)多次迭代,使之逼近目標(biāo)函數(shù)得極小點(diǎn)。
3 、2 阻尼牛頓法得流程圖 :
3 、3 題目 :
用牛頓阻尼法求函數(shù)得極小點(diǎn) 3 、4 源程序代碼及結(jié)果: :
k=0;
ptol=1、0e-5;
xk=input(’input x0:’)
itcl=[1;1];
while norm(itcl)>=ptol
f1=[4*xk(1,1)^3—24*xk(1,1)^2+50*xk(1,1)—4*xk(2,1)-32;—4*xk(1,1)+8*xk(2,1)];
G=[12*xk(1,1)^2—48*xk(1,1)+50,-4;-4,8];
dk=-inv(G)*f1; a=-(dk"*f1)/(dk’*G*dk);
xk=xk+a*dk;
開始給定結(jié)束0, ? x2 1[ ( )] ( )k k kf f??? ? ? d x x1:min ( )k k kkk kkf??? ??? ??x x dx d1 k k??? ? x x* 1 k?? x x否是1 k k ? ?0 k ?
itcl=a*dk;
k=k+1;
end
f=(xk(1,1)—2)^4+(xk(1,1)-2*xk(2,1))^2;
fprintf('\n ÓÃ×èÄáÅ£¶Ù·¨µü´ú %d ´ÎºóµÃµ½ ¼«Ð¡µã x*¼°¼«Ð¡Öµ f Ϊ:\n’,k);
disp(xk);
disp(f);
結(jié)果顯示:input x0:[1;1]
用阻尼牛頓法迭代 27 次后得到 極小點(diǎn) x*及極小值 f 為:
2、0000
1、0000 1、3270e—019 4 、鮑威爾法
4 、1 鮑威爾法基本思路 : : 在不用導(dǎo)數(shù)得前提下,在迭代中逐次構(gòu)造 G得共軛方向。
4 、2 鮑威爾法流程圖: :
4。3 題目 : 求函數(shù)f(x)= x[0]*x[0]+x[1]*x[1]-x[0]*x[1]—10*x[0]—4*x[1]+60得最優(yōu)點(diǎn),收斂精度ε=0、001 4 、4 源程序代碼及結(jié)果 :
#include ”stdio、h" #include "stdlib、h" #include "math、h" double objf(double x[])
{double ff; ff=x[0]*x[0]+x[1]*x[1]—x[0]*x[1]—10*x[0]-4*x[1]+60; return(ff);
} void jtf(double x0[],double h0,double s[],int n,double a[],double b[])
{int i; 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); } 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); } 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]); } double gold(double a[],double b[],double eps,int n,double xx[]) {int i; double f1,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++)
{*(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); } 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++)
*(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]);
ff=objf(xx); for(i=0;i〈2;i++) free(x[i]); return(ff); } double oneoptim(double x0[],double s[],double h0,double epsg,int n,double x[]) {double *a,*b,ff; a=(double *)malloc(n*sizeof(double)); 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); } double powell(double p[],double h0,double eps,double epsg,int n,double x[]) {int i,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]; 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); } 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(cuò)(ss); free(s); for(i=0;i〈4;i++)
free(cuò)(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; 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++) *(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++) *(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); } }
} void main()
{double p[]={1,2}; double ff,x[2]; ff=powell(p,0、3,0、001,0、0001,2,x); printf("x[0]=%f,x[1]=%f,ff=%f\n",x[0],x[1],ff); getchar(); }
5 、 復(fù)合形法
5 、1 復(fù)合行法基本思想 :
在可行域中選取 K 個(gè)設(shè)計(jì)點(diǎn) (n+1≤K≤2n)作為初始復(fù)合形得頂點(diǎn)。比較各頂點(diǎn)目標(biāo)函數(shù)值得大小,去掉目標(biāo)函數(shù)值最大得頂點(diǎn)(稱最壞點(diǎn)),以壞點(diǎn)以外其余各點(diǎn)得中心為映射中心,用壞點(diǎn)得映射點(diǎn)替換該點(diǎn),構(gòu)成新得復(fù)合形頂點(diǎn)。
反復(fù)迭代計(jì)算,使復(fù)合形不斷向最優(yōu)點(diǎn)移動(dòng)與收縮,直至收縮到復(fù)合形得頂點(diǎn)與形心非常接近,且滿足迭代精度要求為止.
5 、2 題目: 求函數(shù)f(x)=(x1-5)*(x1—5)+4*(x2—6)*(x2-6)得最優(yōu)點(diǎn),約束條件為g1(x)=64-x1*x1—x2*x2≤0;g2(x)=x2-x1-10≤0;g3(x)=x1-10≤0;收斂精度ε自定義; 5 、3 源程序代碼及結(jié)果:
#include 〈stdio、h>
#include 〈stdlib、h>
#include 〈time、h>
#include <math、h>
#define E0 1e—5 /*復(fù)合形法收斂控制精度*/
double **apply(int,int); /*申請(qǐng)矩陣空間*/
double f(double *); /*目標(biāo)函數(shù)*/
double *g(double *); /*約束函數(shù)*/
bool judge(double *); /*可行點(diǎn)得判斷*/
int main()
{ int n,k;
int i,j,k1;
int l;
double temporary;
double restrain; /*收斂條件*/
double reflect; /*反射系數(shù)*/
srand((unsigned)time(NULL));
printf(”請(qǐng)輸入目標(biāo)函數(shù)得維數(shù) n:”); /*輸入已知數(shù)據(jù)*/
scanf("%d”,&n);
printf("請(qǐng)輸入復(fù)合形得頂點(diǎn)數(shù) k:");
scanf("%d",&k);
double **x=apply(k,n); /*存放復(fù)合形頂點(diǎn)*/
double *y=(double *)calloc(k,sizeof(double)); /*存放目標(biāo)函數(shù)值*/
double *p=(double *)calloc(3,sizeof(double)); /*存放約束函數(shù)值*/
double *a=(double *)calloc(n,sizeof(double)); /*存放設(shè)計(jì)變量得下限*/
double *b=(double *)calloc(n,sizeof(double)); /*存放設(shè)計(jì)變量得上限*/
double *x_c=(double *)calloc(n,sizeof(double)); /*存放可行點(diǎn)中心*/
double *x_r=(double *)calloc(n,sizeof(double)); /*存放最壞點(diǎn)得反射點(diǎn)*/
printf(”請(qǐng)輸入選定得第一個(gè)可行點(diǎn) x1(包含%d 個(gè)數(shù)):”,n);
for(i=0;i<n;i++)
scanf("%lf",*x+i);
printf("請(qǐng)輸入初選變量得下限 a(包含%d 個(gè)數(shù)):",n);
for(i=0;i<n;i++) scanf("%lf”,a+i);
printf("請(qǐng)輸入初選變量得上限 b(包含%d 個(gè)數(shù)):",n);
for(i=0;i<n;i++)
scanf("%lf”,b+i);
printf("輸出輸入結(jié)果為:\nn=%d,k=%d,x1=(",n,k); /*輸出已知數(shù)據(jù)*/
for(i=0;i<n—1;i++)
printf(”%、5lf ”,*(*x+i));
printf(”%、5lf)\na=(",*(*x+n-1)); for(i=0;i<n-1;i++)
printf(”%f ”,*(a+i));
printf(”%、5lf),b=(",*(a+n-1));
for(i=0;i<n—1;i++)
printf("%f ”,*(b+i));
printf("%、5lf)\n",*(b+n-1));
L1: for(i=1;i<k;i++) /*隨機(jī)得到其余(k-1)個(gè)可行點(diǎn)*/
? for(j=0;j<n;j++)
?
*(*(x+i)+j)=*(a+j)+(double)(rand()%10000)/10000*(*(b+j)-*(a+j));
? l=1;
for(i=1;i〈k;i++) /*找出可行點(diǎn)得個(gè)數(shù) l,并把可行點(diǎn)放在前 l 個(gè)位置上*/
? if(judge(*(x+i)))
{? ?
for(j=1;j<k;j++)
?
? if(!judge(*(x+j)))
?? {
for(k1=0;k1<n;k1++)
{????? ?
??? temporary=*(*(x+i)+k1);
?? (*(*?;)1k+)j+x(*(*=)1k+)i+x? ?
?? (*(*
;yraropmet=)1k+)j+x?? ?
??
}
?
;kaerb??
} ????
??
;++l?
}
? 排小到大從值數(shù)函標(biāo)目按點(diǎn)行可個(gè) l 前把*/ )++i;1-l<i;0=i(rof?序*/
)++j;l<j;1+i=j(rof?? ??
)))j+x(*(f〈))i+x(*(f(fi??
?
? for(k1=0;k1<n;k1++)
{? ??
?? temporary=*(*(x+i)+k1);
(*(*? ?;)1k+)j+x(*(*=)1k+)i+x?(*(*??? ?;yraropmet=)1k+)j+x?
???? }
?
/*心中點(diǎn)行可求*/ )++i;n〈i;0=i(rof??
??
*(x_c+i)=0;
??
)++i;l<i;0=i(rof? ?? )++j;n<j;0=j(rof??
(*?;)j+)i+x(*(*=+)j+c_x?
?
?
)++i;n<i;0=i(rof?
?
??
*(x_c+i)/=l;
? ???
if(!judge(x_c)) /*判斷可行點(diǎn)中心就是否可行*/
?
? {
?
?
? for(i=0;i<n;i++)
?
??
{?
???
? (* ;)i+)1-l+x(*(*=)i+a?*(b+i)=*(x_c+i);
??
?
}
??
??? goto L1;
???
}
???
esle? ??
{?
? /*化行可點(diǎn)行可不將*/ )++i;k<i;l=i(rof?
??? od??
?
??
?? {
?
for(j=0;j<n;j++)
?
? (*(* ?)j+)i+x(*(*(*5、0+)j+c_x(*=)j+)i+x?-*(x_c+j));
} ???? ???
?
elihw? ?
?? !(? ?;)))i+x(*(egduj?L2:
/*序排小到大從值數(shù)函標(biāo)目按點(diǎn)行可將*/ )++i;1-k〈i;0=i(rof? ?
?
?? for(j=i+1;j<k;j++)
?
)))j+x(*(f<))i+x(*(f(fi??
?
?
??
)++1k;n〈1k;0=1k(rof? ? ????
??
{?
??
?? temporary=*(*(x+i)+k1);
??
?
?
?? *(*(x+i)+k1)=*(*(x+j)+k1);
?
?? (*(*?;yraropmet=)1k+)j+x?
??
}??? ???
?
????
/*件條斂收求*/ ;0=niartser?
?
?
?
? for(i=0;i<k;i++)
?
??
?
-k+x(*(f-))i+x(*(f(=+niartser?1)))*(f(*(x+i))-f(*(x+k—1)));
??
?
?
;)niartser*)1-k(/0、1(trqs=niartser?
?
?
? if(restrain<E0) /*判斷收斂條件*/
?
??
??
{
?
??
????? printf("\n 求得約束最優(yōu)點(diǎn)為:( ”);
? ??????
)++i;n<i;0=i(rof??
?
??? printf(”%。5f ”,*(*(x+k—1)+i));
?
?
????
?? printf(")\n 目標(biāo)函數(shù)得最優(yōu)解為:%。5f\n",f(*(x+k-1)));
?
?? ???
?
;0 nruter??
? ??????
}
?
?
?
esle? ?
?
?
{ ???L3:心中得點(diǎn)頂個(gè))1-k(得外 x*點(diǎn)壞最去除算計(jì)*/ )++i;n〈i;0=i(rof?*/
?
?
??
*(x_c+i)=0;
?
?
?)++i;k<i;1=i(rof?
?
?
??
??? for(j=0;j<n;j++)
?
? (*?? ??? ? ;)j+)i+x(*(*=+)j+c_x?
???
?? ? )++i;n<i;0=i(rof?
??
?
?
?
? (* ;1-k=/)i+c_x? ?
??????
?
reflect=1、3;
L4:
/*點(diǎn)射反求*/ )++i;n<i;0=i(rof? ? ?????? ???? (* ;))i+x*(*—)i+c_x(*(*tcelfer+)i+c_x(*=)i+r_x?
?????? ?? ? ))r_x(egduj!(fi?
???
?
?
{
??
?? ?;5、0=*tcelfer?
?
?
?;4L otog?
?
}? ????? ??
??
?
fi esle? ?
?
? (? ))x*(f〈)r_x(f?
??
{ ?????
? ?????
for(i=0;i<n;i++)
*(*x+i)=*(x_r+i);
??
??
goto L2;
?
?
}?
?
?
)01-e1=〈tcelfer(fi esle?
???
{
??? ? ;)i+)1+x(*(*=)i+x*(* )++i;n<i;0=i(rof??
????
? ;3L otog?
?
}? ?
??
esle??
? ???
{
?
;5、0=*tcelfer?
?
??
;4L otog?? ??
???
}? ?
????
}
?
?? }
}
double **apply(int row,int col)
/*申請(qǐng)矩陣空間*/
{
;i tni?
;))elbuod(foezis,loc*wor(collac)*elbuod(=x* elbuod?
double **y=(double **)calloc(row,sizeof(double *));
if(!x || !y)
{ printf(”內(nèi)存分配失敗!”);
exit(1);
}
)++i;wor<i;0=i(rof?(*
;y nruter ;loc*i+x=)i+y?? }
double f(double *x)
/*目標(biāo)函數(shù)*/
{
return (*x—5)*(*x-5)+4*(*(x+1)-6)*(*(x+1)—6);
}
double *g(double *x) /*約束函數(shù)*/
{
double *p=(double *)calloc(3,sizeof(double));
)p!(fi?
{ ?
;)”!敗失配分存內(nèi)”(ftnirp??
;)1(tixe?}
*p=64—(*x)*(*x)—(*(x+1))*(*(x+1));
*(p+1)=*(x+1)-*x-10;
(*
;01—x*=)2+p?
return p;
}
bool judge(double *x) /*可行點(diǎn)得判斷*/
{
int i;
double *p=(double *)calloc(3,sizeof(double));
p=g(x);
for(i=0;i<3;i++)
fi? ?
(*(p+i)〉0)
break;
if(i==3)
return true;
else return false;
}
6、 外點(diǎn)懲罰函數(shù)法 6、 、1 解題思路:外點(diǎn)法就是從可行域得外部構(gòu)造一個(gè)點(diǎn)序列去逼近原約束問題得最優(yōu)解。外點(diǎn)法可以用來求解含不等式與等式約束得優(yōu)化問題。外點(diǎn)懲罰函數(shù)得形式為:
6 、2
流程框圖: :
2 21 1( , ) ( ) max[0, ( )] [ ( )]m li ji jr f r g r h ?? ?? ? ?? ?x x x x
6 、3 題目: 求函數(shù) f(x)=(x1—5)*(x1-5)+4*(x2-6)*(x2-6)得最優(yōu)點(diǎn),約束條件:g1(x)=64-x1*x1-x2*x2≤0;g2(x)=x2-x1—10≤0;g3(x)=x1—10≤0;收斂精度ε=0、00001;
6 、4 源程序代碼及結(jié)果 :
#include <stdio、h> #include〈iostream、h〉 #include〈mat(yī)h、h> double lamta[10]={0, 1、0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,1};//鮑威爾方法初始化方向,線性無關(guān) double lamta1[3]={0, 0 , 0};//暫存新得搜索方向 double x1[4]={0, 0 ,0, 0 };//x1到 x3 用于存儲(chǔ)各共軛方向得點(diǎn) double x2[4]={0, 0 ,0, 0 }; double x3[4]={0, 0 ,0, 0 }; double x4[4]={0, 0 ,0, 0 };//x4用于中間判斷 double x5[4]={0, 0 ,0, 0 };//x5 用存放于更換方向后產(chǎn)生得新點(diǎn) int m=0;//標(biāo)志 double x_[4]={0, 0, 0, 0};//暫存鮑威爾最優(yōu)解 double x0[4]={0, 2, 2 , 2};//初值
double c=10;//遞減系數(shù)
double e=0、00001;//精度控制 double r0=1;//初始懲罰因子 double r=1; //函數(shù)聲明部分 void Powell(double r);
//鮑威爾方法函數(shù) double fxy(double x1,double x2,double x3,double r);
//待求函數(shù) double ysearch(double x);
//一維搜索得目標(biāo)函數(shù) void search(double &a,double &b,double h);
//區(qū)間搜索 double
yellowcut(double &a,double &b);
//黃金分割 void sort(double *p,int size);//選擇法排序 void main()
//約束優(yōu)化方法主函數(shù)入口 {
cout〈〈”請(qǐng)輸入精度”〈〈endl;
cin>〉e; changyan:Powell(r);
double cmpare[4];
int flag1=0;
for (int i=1;i〈=3;i++)
{
cmpare[i]=x_[i]—x0[i];
if (fabs(cmpare[i])<e)
{flag1++;}
}
if (flag1==3)
{
printf(”x1=%lf
x2=%lf\n",x_[1],x_[2]); //
cout〈〈"最優(yōu)解為:"<〈"x1=”〈〈x_[1]<<”
"〈<”x2="<〈x_[2]〈<"
"〈<"x3="<〈x_[3]<〈endl ;
cout〈<"最小值為"〈〈fxy(x_[1],x_[2],x_[3],r)〈〈endl;
}
else
{
for (int j=1;j<=3;j++)
{
x0[j]=x_[j];
}
r=c*r;
goto changyan;
} } //子函數(shù)定義部分 double fxy(double x1,double x2,double x3,double r)//待求函數(shù) {
double m,n,p;
m=((64—x1*x1-x2*x2)>0)?(64-x1*x1—x2*x2):0;
n=((x2-x1-10)>0)?(x2-x1-10):0;
p=((x1-10)>0)?(x1—10):0;
return
//懲罰函數(shù) (x1-5)*(x1—5)+4*(x2-6)*(x2-6)+r*(m*m+n*n+p*p)+r*(x3*x3); } void Powell(double r)
//鮑威爾方法函數(shù)定義 {
double det=0、0001;
//迭代精度
int k; my1:
for (k=1;k<=3;k++)
{
m=3*k-2;
double a=0,b=0,xo=0;
search(a,b,1);
//完成區(qū)間搜索
double temp;
temp=y(tǒng)ellowcut(a,b);//黃金分割法
int n=3*k-2;
for (int i=1;i<=3;i++)
{
switch (k)
{
case 1:x1[i]=x0[i]+temp*lamta[n++];break;
case 2:x2[i]=x1[i]+temp*lamta[n++];break;
case 3:x3[i]=x2[i]+temp*lamta[n++];break;
default :break;
}
}
}
double cmp[4];
int flag=0;
for (int i=1;i〈=3;i++)
{
cmp[i]=x3[i]-x0[i];
if (fabs(cmp[i])<det)
{flag++;}}
if (flag==3)
//找到最優(yōu)解
{
x_[1]=x3[1];
x_[2]=x3[2];
x_[3]=x3[3];
}
else
{
double fy[4];
fy[0]=fxy(x0[1],x0[2],x0[3],r);
fy[1]=fxy(x1[1],x1[2],x1[3],r);
fy[2]=fxy(x2[1],x2[2],x2[3],r);
fy[3]=fxy(x3[1],x3[2],x3[3],r); double fyy[3];
for (int ii=0;ii<3;ii++)
{fyy[ii]=fy[ii]—fy[ii+1];}
sort(fyy,3);
for (ii=1;ii〈=3;ii++)
{x4[ii]=2*x3[ii]—x0[ii];}
double f0,f3,f4;
f0=fy[0];
f3=fy[3];
f4=fxy(x4[1],x4[2],x4[3],r);
if ((f0+f4—2*f3)/2〉=fyy[2])
{
if (f3〈f4)
{
for (int t=1;t〈=3;t++)
{x0[t]=x3[t];}
}
else
{
for (int t=1;t<=3;t++)
{x0[t]=x4[t];
}}
goto my1;
}
else{
for (int t=0;t〈3;t++)
{lamta1[t]=x3[t+1]-x0[t+1];}
m=0;
//switch 標(biāo)志!
double aa=0,bb=0;
search(aa,bb,1);
double temp1;
temp1=yellowcut(aa,bb);
for (int i=1;i〈=3;i++)
{x5[i]=x3[i]+temp1*lamta1[i-1];}
for (i=1;i〈=3;i++)
{x0[i]=x5[i];}
for (i=1;i〈=6;i++)
{lamta[i]=lamta[i+3];}
for (i=1;i<=3;i++)
{
lamta[6+i]=lamta1[i—1];}
goto my1; }}} double ysearch(double x)
//一維搜索得目標(biāo)函數(shù) { switch (m)
{ case 1:
return fxy(x0[1]+x*lamta[m],x0[2]+x*lamta[m+1],x0[3]+x*lamta[m+2],r);break; case 4:
return fxy(x1[1]+x*lamta[m],x1[2]+x*lamta[m+1],x1[3]+x*lamta[m+2],r);break; case 7:
return fxy(x2[1]+x*lamta[m],x2[2]+x*lamta[m+1],x2[3]+x*lamta[m+2],r);break; case 0:
return fxy(x3[1]+x*lamta1[0],x3[2]+x*lamta1[1],x3[3]+x*lamta1[2],r);break;//更改方向后得一維搜索 default:return 0; break; } } void search(double &a,double &b,double h)
//區(qū)間搜索 {double a1,a2,a3,y1,y2,y3; h=1; a1=a,y1=ysearch(a1); a2=a+h,y2=y(tǒng)search(a2); if(y2〉=y1){
h=-h,a3=a1,y3=y1;
a1=a2,y1=y2,a2=a3,y2=y3;} a3=a2+h,y3=ysearch(a3); while(y3<=y2){
h=2*h;
a1=a2,y1=y2,a2=a3,y2=y3;
a3=a2+h,y3=y(tǒng)search(a3); } if(h〈0)a=a3,b=a1; else a=a1,b=a3;} double
yellowcut(double &a,double &b){
double e;
//黃金分割法求解
e=0、001;
double c,fc;
c=a+0、382*(b-a);
fc=ysearch(c);
double d,fd;
double xo;
d=a+0、618*(b-a);
fd=ysearch(d); label2: if (fc<=fd)
{b=d;
d=c;
fd=fc;
c=a+0、382*(b—a);
fc=ysearch(c);}
else
{a=c;
c=d;
fc=fd;
d=a+0、618*(b-a);
fd=ysearch(d);}
if ((b—a)〈=e)
{xo=(a+b)/2;}
else
goto label2;
return xo; } void sort(double *p,int size){//選擇法排序
int i,j;
double k;
for(i=0;i〈size-1;i++)
for(j=i+1;j〈size;j++)
if(*(p+i)>*(p+j)){k=*(p+i);*(p+i)=*(p+j);*(p+j)=k;} }
7 、機(jī)械設(shè)計(jì)實(shí)際問題分析
7、1 題目 : 圖 示 為 一 對(duì) 稱 得 兩 桿 支 架 , 在 支 架 得 頂 點(diǎn) 承 受 一 個(gè) 載 荷 為2 2F F= =3 3 00 00 0 00 0
, ,支 支 架 之 間 得 水 平 距離 離
2 2B B= =1 1 52 20 0 m m, ,若 若 已 選 定 壁厚 厚T T= =2 2. . 5 m m鋼 鋼 管 ,密度 度p p= =8 83 30 00 0k kg g/ / m3 3, ,屈 屈 服點(diǎn) 點(diǎn)
, , 材 料 得 彈 性 模量 量
。
要 求 在 滿 足 強(qiáng) 度 與 穩(wěn) 定 性 條 件 下 設(shè) 計(jì) 最 輕 得 支 架 尺寸 寸. .
7 、2 計(jì)算過程如下: 解:計(jì)算壓桿得臨界柔度為:
,
由于支架為空心桿,失效形式主要為屈服,故計(jì)算穩(wěn)定性用屈服極限公式。根據(jù)題意可得方程組:
,
代入整理得到內(nèi)點(diǎn)混合懲罰函數(shù)法得標(biāo)準(zhǔn)形式為:
構(gòu)建懲罰函數(shù): ? ?? ?? ? ? ? ??? ?? ? kk k kr Xrx xx x r x r x r x x22 1 222122212221 ,5 . 246 . 96 86 . 84? ?? ? ? ? ? ? ? ?)
(?
, 取,
? ?? ?0005 . 0 2 24 73 . 1692 11 11?? ?? ? ???kkrx xx r xx?
解得:
令迭代精度為:,由于函數(shù)就是 X 得2次方程,故不必判別函數(shù)值得相對(duì)變化量。
7 、3 源程序編寫
#include <stdio、h> #include 〈math、h〉 double GetX3( double r) {
return (1-42*sqrt(r))*(0、21*sqrt(r)+0、01*r)/(168、172*sqrt(r)—38*r)+0、0025; } double GetX4( double r) { return (0、21*sqrt(r)+0、01*r)/(168、172*sqrt(r)-38*r);
} double F( double x3,double x4)
{
return 42、4315*(x3*x3-x4*x4); } main()
{
double x1=0,x2=0,x3,x4,r=1,c=0、01,m=0、0000001;
int i=1;
x3=GetX3(r);
x4=GetX4(r);
while(1)
{
printf(”迭代次數(shù):%d\n”,i);
printf("r=%。12f\n",r);
printf("x1=%f\n”,x3);
printf("x2=%f\n",x4);
printf("\n");
r=c*r;
x1=x3;
x2=x4;
x3=GetX3(r);
x4=GetX4(r);
if((fabs(x1—x3)<=m)&&(fabs(x4-x2)<=m))
break;
i++;
}
printf("最優(yōu)解為:\n");
printf("R=%f(單位:米)\n",x3);
printf("r=%f(單位:米)\n",x4);
printf(”最小體積V=%f(單位:立方米)\n",F(x3,x4));
return(0); }
用C語言編程計(jì)算,求得結(jié)果為: 最小外徑R=3.749mm, 最小內(nèi)徑 r=1.249mm, 最小體積:v=530000 立方毫米 故滿足強(qiáng)度與穩(wěn)定性條件下最輕得支架尺寸約為外徑 3。75mm,內(nèi)徑1。25mm。
8 、報(bào)告總結(jié)
通過這一段時(shí)間得學(xué)習(xí)我了解到機(jī)械優(yōu)化設(shè)計(jì)就是以數(shù)學(xué)規(guī)劃論為基礎(chǔ),以計(jì)算機(jī)為工具,一種自動(dòng)尋優(yōu)得先進(jìn)得、現(xiàn)代得設(shè)計(jì)方法。根據(jù)設(shè)計(jì)所追求得性能目標(biāo),建立目標(biāo)函數(shù),在滿足給定得各種約束條件下,尋求最優(yōu)得設(shè)計(jì)方案.可見它就是非常經(jīng)典得一門學(xué)科。再加上王衛(wèi)榮老師系統(tǒng)全面科學(xué)得教授過程,更就是使這一學(xué)科魅力十足,強(qiáng)烈地吸引著我對(duì)它得深入學(xué)習(xí)與實(shí)踐。
在課程學(xué)習(xí)過程中我明白了很多工程問題就是可以轉(zhuǎn)化為數(shù)學(xué)模型并可以通過計(jì)算機(jī)求解。
同時(shí)了解了delphi得基本得使用技巧,并且復(fù)習(xí)了C語言與mat(yī)lab編程相關(guān)知識(shí),并將其應(yīng)用到了約束隨機(jī)法、懲罰函數(shù)法去求解問題,收獲頗多。優(yōu)化設(shè)計(jì)同時(shí)也教會(huì)了我如何追求“優(yōu)”,同時(shí)使自己有能力、有辦法“化"到優(yōu)!
推薦訪問: 優(yōu)化設(shè)計(jì) 實(shí)驗(yàn) 報(bào)告同志們:今天這個(gè)大會(huì),是市委全面落實(shí)黨要管黨、從嚴(yán)治黨要求的一項(xiàng)重大舉措,也是對(duì)縣市區(qū)委書記履行基層黨建工作第一責(zé)任人情況的一次集中檢閱,同時(shí)是對(duì)全市基層黨建工作的一次再部署、再落實(shí)的會(huì)議。前面,**
***年,我認(rèn)真履行領(lǐng)班子、帶隊(duì)伍、抓黨員、保穩(wěn)定的基層黨建工作思路,以學(xué)習(xí)貫徹習(xí)近平新時(shí)代中國(guó)特色社會(huì)主義思想和黨的十九大歷次全會(huì)精神為主線,以市局基層黨建工作考核細(xì)則為落腳點(diǎn),落實(shí)全面從嚴(yán)治黨主體
根據(jù)會(huì)議安排,現(xiàn)將2022年履行抓基層黨建工作職責(zé)情況報(bào)告如下:一、履職工作特色和亮點(diǎn)1 突出政治建設(shè),著力在思想認(rèn)識(shí)上提高。牢固樹立抓黨建就是抓政績(jī)的理念,以“黨建工作抓引領(lǐng)、社區(qū)治理求突破,為民服
2022年以來,在**黨委的正確領(lǐng)導(dǎo)下,堅(jiān)持以習(xí)近平新時(shí)代中國(guó)特色社會(huì)主義思想為指導(dǎo),深入學(xué)習(xí)宣傳貫徹黨的二十大精神,以黨建工作為統(tǒng)領(lǐng),扎實(shí)開展夯實(shí)“三個(gè)基本”活動(dòng),以“四化四力”行動(dòng)為抓手,聚力創(chuàng)建
各位領(lǐng)導(dǎo),同志們:根據(jù)會(huì)議安排,現(xiàn)就2022年度抓基層黨建工作情況匯報(bào)如下:一、主要做法及成效(一)強(qiáng)化政治引領(lǐng)。一是不斷強(qiáng)化理論武裝。堅(jiān)持通過黨組會(huì)、中心組學(xué)習(xí)會(huì)和“三會(huì)一課”,第一時(shí)間、第一議題學(xué)
2022年度抓基層黨建工作述職報(bào)告按照黨委工作部署,現(xiàn)將本人2022年度抓基層黨建工作情況報(bào)告如下:一、2022年度抓基層黨建工作情況(一)旗幟鮮明講政治將旗幟鮮明講政治放在全局發(fā)展首要位置,積極開展
2022年,是我在數(shù)計(jì)系黨總支書記這個(gè)新崗位上度過的第一個(gè)完整的工作年度。回首一年來在校黨委的正確領(lǐng)導(dǎo)下,與數(shù)計(jì)系領(lǐng)導(dǎo)班子和全體師生共同走過的日子,艱辛歷歷在目,收獲溫潤(rùn)心田。作為黨總支書記,我始終牢
按照考核要求,現(xiàn)將本人一年來,作為統(tǒng)戰(zhàn)部長(zhǎng)履行職責(zé)、廉潔自律等方面情況報(bào)告如下:一、著眼增強(qiáng)政治素質(zhì),不斷深化理論學(xué)習(xí)堅(jiān)持把旗幟鮮明講政治作為履職從政的第一位要求,帶領(lǐng)統(tǒng)戰(zhàn)系統(tǒng)干部堅(jiān)決擁護(hù)“兩個(gè)確立”
**年,緊緊圍繞黨工委、管委會(huì)的決策部署,全體人員團(tuán)結(jié)協(xié)作、凝心聚力,緊扣黨工委“**”基本工作思路,全力開拓進(jìn)取,認(rèn)真履職盡責(zé),圓滿完成各項(xiàng)工作任務(wù)。一、個(gè)人思想政治狀況檸檬文苑www bgzjy
按照縣委關(guān)于開展抓基層黨建述職評(píng)議會(huì)議的有關(guān)要求,經(jīng)請(qǐng)示縣委組織部同意,今天,我們?cè)诖苏匍_2022年度基層黨組織書記抓基層黨建述職評(píng)議會(huì)議。1 首先,請(qǐng)**黨委書記,**同志述職。**黨委能夠主動(dòng)研究