《 機械優化設計 》
實驗報告
目錄
1、進退法確定初始區間 ................................................................................. 錯誤! 未定義書簽。
1、1 進退法基本思路 ............................................................................. 錯誤! 未定義書簽。
1、2 進退法程序框圖誤錯? 錯誤! 未定義書簽。
1、3 題目誤錯? 錯誤! 未定義書簽。
1、4 源程序代碼及運行結果誤錯? 錯誤! 未定義書簽。
2、黃金分割法 ................................................................................................. 錯誤! 未定義書簽。
2、2 黃金分割法流程圖誤錯? 錯誤! 未定義書簽。
2、3 題目誤錯? 錯誤! 未定義書簽。
2、4 源程序代碼及結果 ......................................................................... 錯誤! 未定義書簽。
3、牛頓型法誤錯? 錯誤! 未定義書簽。
3、1牛頓型法基本思路 ......................................................................... 錯誤! 未定義書簽。
3、2 阻尼牛頓法得流程圖 ................................................................................................. 4 3、3 題目 ............................................................................................... 錯誤! 未定義書簽。
3、4 源程序代碼及結果誤錯? 錯誤! 未定義書簽。
4、鮑威爾法誤錯? 錯誤! 未定義書簽。
4、1 鮑威爾法基本思路誤錯? 錯誤! 未定義書簽。
4、2 鮑威爾法流程圖誤錯? 錯誤! 未定義書簽。
4.3 題目誤錯? 錯誤! 未定義書簽。
4、4 源程序代碼及結果 ....................................................................... 錯誤! 未定義書簽。
5、 復合形法誤錯? 錯誤! 未定義書簽。
5、1 復合行法基本思想 ......................................................................... 錯誤! 未定義書簽。
5、3 源程序代碼及結果 ......................................................................... 錯誤! 未定義書簽。
6、 外點懲罰函數法誤錯? 錯誤! 未定義書簽。
6、1 解題思路:誤錯? 錯誤! 未定義書簽。
6、2 流程框圖誤錯? 錯誤! 未定義書簽。
6、3 題目 ............................................................................................... 錯誤! 未定義書簽。
6、4 源程序代碼及結果 ......................................................................... 錯誤! 未定義書簽。
7、機械設計實際問題分析 ............................................................................. 錯誤! 未定義書簽。
7、2計算過程如下誤錯? 錯誤! 未定義書簽。
7、3 源程序編寫誤錯? 錯誤! 未定義書簽。
8、報告總結誤錯? 錯誤! 未定義書簽。
1 、進退法確定初始區間 1 、1
進退法基本思路 :
按照一定得規則試算若干個點,比較其函數值得大小,直至找到函數值按“高—低-高”變化得單峰區間。
1 、2 進退法程序框圖
1、3 題目: :用進退法求解函數 得搜索區間
1 、4 源程序代碼及運行結果 #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); } 搜索區間為0
6 2 、黃金分割法 2、1 黃金分割法基本思路 :
通過不斷得縮短單峰區間得長度來搜
索極小點得一種有效方法。按() 縮小
比較大小
確定取舍區間。
2 、2 黃金分割法流程圖
2 、3
題目 :
對函數,給定搜索區間時,試用黃金分割法求極小點
2 、4 源程序代碼及結果: :
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〉=y2)
a=a1;
a1=a2;
y1=y2;
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 牛頓型法基本思路 : : 在鄰域內用一個二次函數
來近似代替原目標函數,并將 得極小點作為對目標函數求優得下一個迭代點.經多次迭代,使之逼近目標函數得極小點。
3 、2 阻尼牛頓法得流程圖 :
3 、3 題目 :
用牛頓阻尼法求函數得極小點 3 、4 源程序代碼及結果: :
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;
開始給定結束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);
結果顯示:input x0:[1;1]
用阻尼牛頓法迭代 27 次后得到 極小點 x*及極小值 f 為:
2、0000
1、0000 1、3270e—019 4 、鮑威爾法
4 、1 鮑威爾法基本思路 : : 在不用導數得前提下,在迭代中逐次構造 G得共軛方向。
4 、2 鮑威爾法流程圖: :
4。3 題目 : 求函數f(x)= x[0]*x[0]+x[1]*x[1]-x[0]*x[1]—10*x[0]—4*x[1]+60得最優點,收斂精度ε=0、001 4 、4 源程序代碼及結果 :
#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(ss); free(s); for(i=0;i〈4;i++)
free(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 、 復合形法
5 、1 復合行法基本思想 :
在可行域中選取 K 個設計點 (n+1≤K≤2n)作為初始復合形得頂點。比較各頂點目標函數值得大小,去掉目標函數值最大得頂點(稱最壞點),以壞點以外其余各點得中心為映射中心,用壞點得映射點替換該點,構成新得復合形頂點。
反復迭代計算,使復合形不斷向最優點移動與收縮,直至收縮到復合形得頂點與形心非常接近,且滿足迭代精度要求為止.
5 、2 題目: 求函數f(x)=(x1-5)*(x1—5)+4*(x2—6)*(x2-6)得最優點,約束條件為g1(x)=64-x1*x1—x2*x2≤0;g2(x)=x2-x1-10≤0;g3(x)=x1-10≤0;收斂精度ε自定義; 5 、3 源程序代碼及結果:
#include 〈stdio、h>
#include 〈stdlib、h>
#include 〈time、h>
#include <math、h>
#define E0 1e—5 /*復合形法收斂控制精度*/
double **apply(int,int); /*申請矩陣空間*/
double f(double *); /*目標函數*/
double *g(double *); /*約束函數*/
bool judge(double *); /*可行點得判斷*/
int main()
{ int n,k;
int i,j,k1;
int l;
double temporary;
double restrain; /*收斂條件*/
double reflect; /*反射系數*/
srand((unsigned)time(NULL));
printf(”請輸入目標函數得維數 n:”); /*輸入已知數據*/
scanf("%d”,&n);
printf("請輸入復合形得頂點數 k:");
scanf("%d",&k);
double **x=apply(k,n); /*存放復合形頂點*/
double *y=(double *)calloc(k,sizeof(double)); /*存放目標函數值*/
double *p=(double *)calloc(3,sizeof(double)); /*存放約束函數值*/
double *a=(double *)calloc(n,sizeof(double)); /*存放設計變量得下限*/
double *b=(double *)calloc(n,sizeof(double)); /*存放設計變量得上限*/
double *x_c=(double *)calloc(n,sizeof(double)); /*存放可行點中心*/
double *x_r=(double *)calloc(n,sizeof(double)); /*存放最壞點得反射點*/
printf(”請輸入選定得第一個可行點 x1(包含%d 個數):”,n);
for(i=0;i<n;i++)
scanf("%lf",*x+i);
printf("請輸入初選變量得下限 a(包含%d 個數):",n);
for(i=0;i<n;i++) scanf("%lf”,a+i);
printf("請輸入初選變量得上限 b(包含%d 個數):",n);
for(i=0;i<n;i++)
scanf("%lf”,b+i);
printf("輸出輸入結果為:\nn=%d,k=%d,x1=(",n,k); /*輸出已知數據*/
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++) /*隨機得到其余(k-1)個可行點*/
? 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++) /*找出可行點得個數 l,并把可行點放在前 l 個位置上*/
? 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?
}
? 排小到大從值數函標目按點行可個 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?
???? }
?
/*心中點行可求*/ )++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)) /*判斷可行點中心就是否可行*/
?
? {
?
?
? for(i=0;i<n;i++)
?
??
{?
???
? (* ;)i+)1-l+x(*(*=)i+a?*(b+i)=*(x_c+i);
??
?
}
??
??? goto L1;
???
}
???
esle? ??
{?
? /*化行可點行可不將*/ )++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:
/*序排小到大從值數函標目按點行可將*/ )++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 求得約束最優點為:( ”);
? ??????
)++i;n<i;0=i(rof??
?
??? printf(”%。5f ”,*(*(x+k—1)+i));
?
?
????
?? printf(")\n 目標函數得最優解為:%。5f\n",f(*(x+k-1)));
?
?? ???
?
;0 nruter??
? ??????
}
?
?
?
esle? ?
?
?
{ ???L3:心中得點頂個)1-k(得外 x*點壞最去除算計*/ )++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:
/*點射反求*/ )++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)
/*申請矩陣空間*/
{
;i tni?
;))elbuod(foezis,loc*wor(collac)*elbuod(=x* elbuod?
double **y=(double **)calloc(row,sizeof(double *));
if(!x || !y)
{ printf(”內存分配失敗!”);
exit(1);
}
)++i;wor<i;0=i(rof?(*
;y nruter ;loc*i+x=)i+y?? }
double f(double *x)
/*目標函數*/
{
return (*x—5)*(*x-5)+4*(*(x+1)-6)*(*(x+1)—6);
}
double *g(double *x) /*約束函數*/
{
double *p=(double *)calloc(3,sizeof(double));
)p!(fi?
{ ?
;)”!敗失配分存內”(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) /*可行點得判斷*/
{
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、 外點懲罰函數法 6、 、1 解題思路:外點法就是從可行域得外部構造一個點序列去逼近原約束問題得最優解。外點法可以用來求解含不等式與等式約束得優化問題。外點懲罰函數得形式為:
6 、2
流程框圖: :
2 21 1( , ) ( ) max[0, ( )] [ ( )]m li ji jr f r g r h ?? ?? ? ?? ?x x x x
6 、3 題目: 求函數 f(x)=(x1—5)*(x1-5)+4*(x2-6)*(x2-6)得最優點,約束條件:g1(x)=64-x1*x1-x2*x2≤0;g2(x)=x2-x1—10≤0;g3(x)=x1—10≤0;收斂精度ε=0、00001;
6 、4 源程序代碼及結果 :
#include <stdio、h> #include〈iostream、h〉 #include〈math、h> double lamta[10]={0, 1、0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,1};//鮑威爾方法初始化方向,線性無關 double lamta1[3]={0, 0 , 0};//暫存新得搜索方向 double x1[4]={0, 0 ,0, 0 };//x1到 x3 用于存儲各共軛方向得點 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 用存放于更換方向后產生得新點 int m=0;//標志 double x_[4]={0, 0, 0, 0};//暫存鮑威爾最優解 double x0[4]={0, 2, 2 , 2};//初值
double c=10;//遞減系數
double e=0、00001;//精度控制 double r0=1;//初始懲罰因子 double r=1; //函數聲明部分 void Powell(double r);
//鮑威爾方法函數 double fxy(double x1,double x2,double x3,double r);
//待求函數 double ysearch(double x);
//一維搜索得目標函數 void search(double &a,double &b,double h);
//區間搜索 double
yellowcut(double &a,double &b);
//黃金分割 void sort(double *p,int size);//選擇法排序 void main()
//約束優化方法主函數入口 {
cout〈〈”請輸入精度”〈〈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〈〈"最優解為:"<〈"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;
} } //子函數定義部分 double fxy(double x1,double x2,double x3,double r)//待求函數 {
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
//懲罰函數 (x1-5)*(x1—5)+4*(x2-6)*(x2-6)+r*(m*m+n*n+p*p)+r*(x3*x3); } void Powell(double r)
//鮑威爾方法函數定義 {
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);
//完成區間搜索
double temp;
temp=yellowcut(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)
//找到最優解
{
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 標志!
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)
//一維搜索得目標函數 { 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)
//區間搜索 {double a1,a2,a3,y1,y2,y3; h=1; a1=a,y1=ysearch(a1); a2=a+h,y2=ysearch(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=ysearch(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 、機械設計實際問題分析
7、1 題目 : 圖 示 為 一 對 稱 得 兩 桿 支 架 , 在 支 架 得 頂 點 承 受 一 個 載 荷 為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, ,屈 屈 服點 點
, , 材 料 得 彈 性 模量 量
。
要 求 在 滿 足 強 度 與 穩 定 性 條 件 下 設 計 最 輕 得 支 架 尺寸 寸. .
7 、2 計算過程如下: 解:計算壓桿得臨界柔度為:
,
由于支架為空心桿,失效形式主要為屈服,故計算穩定性用屈服極限公式。根據題意可得方程組:
,
代入整理得到內點混合懲罰函數法得標準形式為:
構建懲罰函數: ? ?? ?? ? ? ? ??? ?? ? 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?
解得:
令迭代精度為:,由于函數就是 X 得2次方程,故不必判別函數值得相對變化量。
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(”迭代次數:%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("最優解為:\n");
printf("R=%f(單位:米)\n",x3);
printf("r=%f(單位:米)\n",x4);
printf(”最小體積V=%f(單位:立方米)\n",F(x3,x4));
return(0); }
用C語言編程計算,求得結果為: 最小外徑R=3.749mm, 最小內徑 r=1.249mm, 最小體積:v=530000 立方毫米 故滿足強度與穩定性條件下最輕得支架尺寸約為外徑 3。75mm,內徑1。25mm。
8 、報告總結
通過這一段時間得學習我了解到機械優化設計就是以數學規劃論為基礎,以計算機為工具,一種自動尋優得先進得、現代得設計方法。根據設計所追求得性能目標,建立目標函數,在滿足給定得各種約束條件下,尋求最優得設計方案.可見它就是非常經典得一門學科。再加上王衛榮老師系統全面科學得教授過程,更就是使這一學科魅力十足,強烈地吸引著我對它得深入學習與實踐。
在課程學習過程中我明白了很多工程問題就是可以轉化為數學模型并可以通過計算機求解。
同時了解了delphi得基本得使用技巧,并且復習了C語言與matlab編程相關知識,并將其應用到了約束隨機法、懲罰函數法去求解問題,收獲頗多。優化設計同時也教會了我如何追求“優”,同時使自己有能力、有辦法“化"到優!
推薦訪問: 優化設計 實驗 報告上一篇:數據庫實驗報告
下一篇:信號與系統實驗報告,(2)
同志們:今天這個大會,是市委全面落實黨要管黨、從嚴治黨要求的一項重大舉措,也是對縣市區委書記履行基層黨建工作第一責任人情況的一次集中檢閱,同時是對全市基層黨建工作的一次再部署、再落實的會議。前面,**
***年,我認真履行領班子、帶隊伍、抓黨員、保穩定的基層黨建工作思路,以學習貫徹習近平新時代中國特色社會主義思想和黨的十九大歷次全會精神為主線,以市局基層黨建工作考核細則為落腳點,落實全面從嚴治黨主體
根據會議安排,現將2022年履行抓基層黨建工作職責情況報告如下:一、履職工作特色和亮點1 突出政治建設,著力在思想認識上提高。牢固樹立抓黨建就是抓政績的理念,以“黨建工作抓引領、社區治理求突破,為民服
2022年以來,在**黨委的正確領導下,堅持以習近平新時代中國特色社會主義思想為指導,深入學習宣傳貫徹黨的二十大精神,以黨建工作為統領,扎實開展夯實“三個基本”活動,以“四化四力”行動為抓手,聚力創建
各位領導,同志們:根據會議安排,現就2022年度抓基層黨建工作情況匯報如下:一、主要做法及成效(一)強化政治引領。一是不斷強化理論武裝。堅持通過黨組會、中心組學習會和“三會一課”,第一時間、第一議題學
2022年度抓基層黨建工作述職報告按照黨委工作部署,現將本人2022年度抓基層黨建工作情況報告如下:一、2022年度抓基層黨建工作情況(一)旗幟鮮明講政治將旗幟鮮明講政治放在全局發展首要位置,積極開展
2022年,是我在數計系黨總支書記這個新崗位上度過的第一個完整的工作年度。回首一年來在校黨委的正確領導下,與數計系領導班子和全體師生共同走過的日子,艱辛歷歷在目,收獲溫潤心田。作為黨總支書記,我始終牢
按照考核要求,現將本人一年來,作為統戰部長履行職責、廉潔自律等方面情況報告如下:一、著眼增強政治素質,不斷深化理論學習堅持把旗幟鮮明講政治作為履職從政的第一位要求,帶領統戰系統干部堅決擁護“兩個確立”
**年,緊緊圍繞黨工委、管委會的決策部署,全體人員團結協作、凝心聚力,緊扣黨工委“**”基本工作思路,全力開拓進取,認真履職盡責,圓滿完成各項工作任務。一、個人思想政治狀況檸檬文苑www bgzjy
按照縣委關于開展抓基層黨建述職評議會議的有關要求,經請示縣委組織部同意,今天,我們在此召開2022年度基層黨組織書記抓基層黨建述職評議會議。1 首先,請**黨委書記,**同志述職。**黨委能夠主動研究