機械優化設計實驗報告_第1頁
機械優化設計實驗報告_第2頁
機械優化設計實驗報告_第3頁
機械優化設計實驗報告_第4頁
機械優化設計實驗報告_第5頁
已閱讀5頁,還剩27頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、機械優化設計實驗報告目錄1.進退法確定初始區間 .31.1進退法基本思路 .31.2進退法程序框圖 .31.3題目 .31.4源程序代碼及運行結果 .32.黃金分割法 .42.2黃金分割法流程圖 .42.3題目 .52.4源程序代碼及結果 .53.牛頓型法 .53.1牛頓型法基本思路 .63.2阻尼牛頓法的流程圖 .63.3題目 .63.4源程序代碼及結果 .64.鮑威爾法 .74.1鮑威爾法基本思路 .74.2鮑威爾法流程圖 .74 3 題目 .84.4源程序代碼及結果 .85.復合形法 .155.1復合行法基本思想 .155.3源程序代碼及結果 .156.外點懲罰函數法 .236.1解題思

2、路: .236.2流程框圖 .236.3題目 .236.4源程序代碼及結果 .237.機械設計實際問題分析 .297.2計算過程如下 .297.3源程序編寫 .308.報告總結 .321.進退法確定初始區間1.1 進退法基本思路: 按照一定的規則試算若干個點,比較其函數值的大小,直至找到函數值按“高 - 低- 高”變化的單峰區間。1.2 進退法程序框圖1.3 題目:用進退法求解函數fxx27x10 的搜索區間1.4 源程序代碼及運行結果#include <stdio.h>#include <math.h>main()float h,h0,y1,y2,y3,a1=0,a2

3、,a3,fa2,fa3;scanf("h0=%f,y1=%f",&h0,&y1);h=h0;a2=h;y2=a2*a2-7*a2+10;if (y2>y1)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;if (y3<y2)goto loop;elseprintf("a1=%f,a2=%f,a3=%f,y1=%f,y2=%f,y3=%fn",a1,a2,a3,y1,y2,y3);搜索區間為 0 62.黃金分割法2.1 黃金分割法基

4、本思路 : 通過不斷的縮短單峰區間的長度來搜索極小點的一種有效方法。按(0.618) 縮小比較 f (x) 大小確定取舍區間。2.2 黃金分割法流程圖2.3 題目:對函數 f xx27 x9 ,給定搜索區間 0x8 時,試用黃金分割法求極小點2.4 源程序代碼及結果:f=inline('x2-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)

5、;y2=f(a2);elseb=a2;a2=a1;y2=y1;a1=b-0.618*(b-a);y1=f(a1);endendxxx=0.5*(a+b)f =Inline function:f(x) = x2-7*x+9xxx =3.49973. 牛頓型法3.1 牛頓型法基本思路 :在 xk 鄰域內用一個二次函數x來近似代替原目標函數,并將x 的極小點作為對目標函數 fx 求優的下一個迭代點 xk 1 。經多次迭代,使之逼近目標函數 f x 的極小點。3.2 阻尼牛頓法的流程圖:開始給定 x 0 ,k0dk 2 f ( xk ) 1 f (xk )xk 1xkkdkk k 1k : min f

6、 (xkdk )是否xk 1xkx*xk 1結束3.3 題目 :用牛頓阻尼法求函數 f x1 , x2x1 24的極小點x1 2x23.4 源程序代碼及結果:k=0;ptol=1.0e-5;xk=input('input x0:')itcl=1;1;whilenorm(itcl)>=ptolf1=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&

7、#39;*G*dk);xk=xk+a*dk;itcl=a*dk;k=k+1;endf=(xk(1,1)-2)4+(xk(1,1)-2*xk(2,1)2;fprintf( 'n ó ?×è ?á ? ?ù·¨üú%d?oó ?D? ? x*? ° ?D? f ?a:n' ,k); disp(xk);disp(f);結果顯示: input x0:1;1用阻尼牛頓法迭代27次后得到極小點 x* 及極小值 f為 :2.00001.00001.3270e-0194.鮑威爾法4.1

8、 鮑威爾法基本思路 :在不用導數的前提下,在迭代中逐次構造G的共軛方向。4.2 鮑威爾法流程圖:43 題目 :求函數 f(x)= x0*x0+x1*x1-x0*x1-10*x0-4*x1+60 的最優點,收斂精度 =0.0014.4 源程序代碼及結果:#include "stdio.h"#include "stdlib.h"#include "math.h"double objf(double x)double ff;ff=x0*x0+x1*x1-x0*x1-10*x0-4*x1+60;return(ff);void jtf(doub

9、le x0,double h0,double s,int n,double a,double b)int i;double *x3,h,f1,f2,f3;for(i=0;i<3;i+)xi=(double *)malloc(n*sizeof(double);h=h0;for(i=0;i<n;i+)*(x0+i)=x0i;f1=objf(x0);for(i=0;i<n;i+)*(x1+i)=*(x0+i)+h*si;f2=objf(x1);if(f2>=f1)h=-h0;for(i=0;i<n;i+)*(x2+i)=*(x0+i);f3=f1;for(i=0;i&l

10、t;n;i+)*(x0+i)=*(x1+i);*(x1+i)=*(x2+i);f1=f2;f2=f3;for(;)h=2*h;for(i=0;i<n;i+)*(x2+i)=*(x1+i)+h*si;f3=objf(x2);if(f2<f3) break;else for(i=0;i<n;i+)*(x0+i)=*(x1+i);*(x1+i)=*(x2+i);f1=f2;f2=f3;if(h<0)for(i=0;i<n;i+)ai=*(x2+i);bi=*(x0+i);elsefor(i=0;i<n;i+)ai=*(x0+i);bi=*(x2+i);for(i=

11、0;i<3;i+)free(xi);double gold(double a,double b,double eps,int n,double xx)int i;double f1,f2,*x2,ff,q,w;for(i=0;i<2;i+)xi=(double *)malloc(n*sizeof(double);for(i=0;i<n;i+)*(x0+i)=ai+0.618*(bi-ai);*(x1+i)=ai+0.382*(bi-ai);f1=objf(x0);f2=objf(x1);doif(f1>f2)for(i=0;i<n;i+)bi=*(x0+i);*(

12、x0+i)=*(x1+i);f1=f2;for(i=0;i<n;i+)*(x1+i)=ai+0.382*(bi-ai);f2=objf(x1);else for(i=0;i<n;i+) ai=*(x1+i); *(x1+i)=*(x0+i); f2=f1; for(i=0;i<n;i+) *(x0+i)=ai+0.618*(bi-ai); f1=objf(x0);q=0;for(i=0;i<n;i+) q=q+(bi-ai)*(bi-ai); w=sqrt(q); while(w>eps); for(i=0;i<n;i+) xxi=0.5*(ai+bi);

13、ff=objf(xx); for(i=0;i<2;i+)free(xi);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

14、 p,double h0,double eps,double epsg,int n,double x)int i,j,m;double *xx4,*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+)xxi=(double

15、 *)malloc(n*sizeof(double);for(i=0;i<n;i+)*(xx0+i)=pi;for(;)for(i=0;i<n;i+)*(xx1+i)=*(xx0+i);xi=*(xx1+i);f0=f1=objf(x);dlt=-1;for(j=0;j<n;j+)for(i=0;i<n;i+)*(xx0+i)=xi;*(s+i)=*(ss+i*(n+1)+j);f=oneoptim(xx0,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+fab

16、s(xi-(*(xx1+i);if(sdx<eps)free(ss);free(s);for(i=0;i<4;i+)free(xxi);return(f);for(i=0;i<n;i+)*(xx2+i)=xi;f2=f;for(i=0;i<n;i+)*(xx3+i)=2*(*(xx2+i)-(*(xx1+i);xi=*(xx3+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(

17、i=0;i<n;i+)*(xx0+i)=*(xx2+i);elsefor(i=0;i<n;i+)*(xx0+i)=*(xx3+i);elsefor(i=0;i<n;i+)*(ss+(i+1)*(n+1)=xi-(*(xx1+i);*(s+i)=*(ss+(i+1)*(n+1);f=oneoptim(xx0,s,h0,epsg,n,x);for(i=0;i<n;i+)*(xx0+i)=xi;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

18、=1,2;double ff,x2;ff=powell(p,0.3,0.001,0.0001,2,x);printf("x0=%f,x1=%f,ff=%fn",x0,x1,ff);getchar();5. 復合形法5.1 復合行法基本思想: 在可行域中選取K 個設計點 (n+1K 2n)作為初始復合形的頂點。比較各頂點目標函數值的大小,去掉目標函數值最大的頂點 ( 稱最壞點 ) ,以壞點以外其余各點的中心為映射中心, 用壞點的映射點替換該點, 構成新的復合形頂點。 反復迭代計算,使復合形不斷向最優點移動和收縮,直至收縮到復合形的頂點與形心非常接近,且滿足迭代精度要求為止。5

19、.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-100;收斂精度 自定義;5.3 源程序代碼及結果 :#include <stdio.h>#include <stdlib.h>#include <time.h>#include <math.h>#define E0 1e-5 /*復合形法收斂控制精度 */double *apply(int,int); /* 申請矩陣空間 */doubl

20、e 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);print

21、f(" 請輸入復合形的頂點數 scanf("%d",&k);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(

22、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)

23、;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(

24、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=

25、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);*(*(x+i)+k1)=*(*(x+j)+k1);*(*(x+j)+k1)=temporary;break;l+;for(i=0;i<l-1;i+) /* 把前 l 個可行點按目標函數值從大到小排序 */ for(j=i+1;j<l;j+)if(f(*(x+i)<f(*(x+j)for

26、(k1=0;k1<n;k1+)temporary=*(*(x+i)+k1);*(*(x+i)+k1)=*(*(x+j)+k1);*(*(x+j)+k1)=temporary;for(i=0;i<n;i+) /* 求可行點中心 */*(x_c+i)=0;for(i=0;i<l;i+)for(j=0;j<n;j+)*(x_c+j)+=*(*(x+i)+j);for(i=0;i<n;i+)*(x_c+i)/=l;if(!judge(x_c) /* 判斷可行點中心是否可行*/for(i=0;i<n;i+)*(a+i)=*(*(x+l-1)+i);*(b+i)=*(x

27、_c+i);goto L1;elsefor(i=l;i<k;i+) /* 將不可行點可行化 */dofor(j=0;j<n;j+)*(*(x+i)+j)=*(x_c+j)+0.5*(*(*(x+i)+j)-*(x_c+j);while(!judge(*(x+i);L2: for(i=0;i<k-1;i+) /*將可行點按目標函數值從大到小排序*/for(j=i+1;j<k;j+)if(f(*(x+i)<f(*(x+j)for(k1=0;k1<n;k1+)temporary=*(*(x+i)+k1);*(*(x+i)+k1)=*(*(x+j)+k1);*(*(

28、x+j)+k1)=temporary;restrain=0; /*求收斂條件 */for(i=0;i<k;i+)restrain+=(f(*(x+i)-f(*(x+k-1)*(f(*(x+i)-f(*(x+k-1); restrain=sqrt(1.0/(k-1)*restrain);if(restrain<E0) /* 判斷收斂條件*/printf("n求得約束最優點為 :( ");for(i=0;i<n;i+)printf("%.5f",*(*(x+k-1)+i);printf(")n目標函數的最優解為 :%.5fn&qu

29、ot;,f(*(x+k-1);return 0;elseL3: for(i=0;i<n;i+) /*計算除去最壞點 *x 外的 (k-1) 個頂點的中心 */*(x_c+i)=0;for(i=1;i<k;i+)for(j=0;j<n;j+)*(x_c+j)+=*(*(x+i)+j);for(i=0;i<n;i+)*(x_c+i)/=k-1;reflect=1.3;L4: for(i=0;i<n;i+) /*求反射點 */*(x_r+i)=*(x_c+i)+reflect*(*(x_c+i)-*(*x+i);if(!judge(x_r)reflect*=0.5;go

30、to L4;else if(f(x_r)<f(*x)for(i=0;i<n;i+) *(*x+i)=*(x_r+i);goto L2;else if(reflect<=1e-10)for(i=0;i<n;i+) *(*x+i)=*(*(x+1)+i);goto L3;elsereflect*=0.5;goto L4;double *apply(int row,int col) /* 申請矩陣空間 */int i;double *x=(double*)calloc(row*col,sizeof(double);double *y=(double *)calloc(row,

31、sizeof(double *);if(!x | !y) printf(" 內存分配失敗 !");exit(1);for(i=0;i<row;i+)*(y+i)=x+i*col; return 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);if(!p)printf(" 內存分配失敗 !");ex

32、it(1);*p=64-(*x)*(*x)-(*(x+1)*(*(x+1);*(p+1)=*(x+1)-*x-10;*(p+2)=*x-10;return p;bool judge(double *x) /* 可行點的判斷 */int i;double *p=(double *)calloc(3,sizeof(double);p=g(x);for(i=0;i<3;i+)if(*(p+i)>0) break;if(i=3) return true;else return false;6. 外點懲罰函數法6.1 解題思路:外點法是從可行域的外部構造一個點序列去逼近原約束問題的最優解。

33、外點法可以用來求解含不等式和等式約束的優化問題。外點懲罰函數的形式為:ml( x, r )f ( x)rmax0, gi ( x)2r hj ( x) 2i 1j 16.2 流程框圖: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

34、.h>double lamta10=0, 1.0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,1;/鮑威爾方法初始化方向,線性無關 double lamta13=0, 0 , 0;/ 暫存新的搜索方向double x14=0, 0 ,0, 0 ;/x1 到 x3 用于存儲各共軛方向的點double x24=0, 0 ,0, 0 ;double x34=0, 0 ,0, 0 ;double x44=0, 0 ,0, 0 ;/x4 用于中間判斷double x54=0, 0 ,0, 0 ;/x5 用存放于更換方向后產生的新點 int m=0;/標志double x_4=0, 0, 0, 0;

35、/ 暫存鮑威爾最優解double x04=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);/ 區間搜索doub

36、leyellowcut(double &a,double &b);/黃金分割void sort(double *p,int size);/ 選擇法排序void main()/約束優化方法主函數入口cout<<"請輸入精度 "<<endl;cin>>e;changyan:Powell(r);double cmpare4;int flag1=0;for (int i=1;i<=3;i+)cmparei=x_i-x0i;if (fabs(cmparei)<e)flag1+;if (flag1=3)printf(&qu

37、ot;x1=%lfx2=%lfn",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;elsefor (int j=1;j<=3;j+)x0j=x_j;r=c*r;goto changyan;/子函數定義部分double fxy(double x1,double x2,double x3,do

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論