資源描述:
《機(jī)械優(yōu)化設(shè)計(jì)—復(fù)合形方法及源程序》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、機(jī)械優(yōu)化設(shè)計(jì)——復(fù)合形方法及源程序(一)題目:用復(fù)合形法求約束優(yōu)化問(wèn)題;;的最優(yōu)解?;舅悸罚涸诳尚杏蛑袠?gòu)造一個(gè)具有K個(gè)頂點(diǎn)的初始復(fù)合形。對(duì)該復(fù)合形各頂點(diǎn)的目標(biāo)函數(shù)值進(jìn)行比較,找到目標(biāo)函數(shù)值最大的頂點(diǎn)(即最壞點(diǎn)),然后按一定的法則求出目標(biāo)函數(shù)值有所下降的可行的新點(diǎn),并用此點(diǎn)代替最壞點(diǎn),構(gòu)成新的復(fù)合形,復(fù)合形的形狀每改變一次,就向最優(yōu)點(diǎn)移動(dòng)一步,直至逼近最優(yōu)點(diǎn)。(二)復(fù)合形法的計(jì)算步驟1)選擇復(fù)合形的頂點(diǎn)數(shù)k,一般取,在可行域內(nèi)構(gòu)成具有k個(gè)頂點(diǎn)的初始復(fù)合形。2)計(jì)算復(fù)合形個(gè)頂點(diǎn)的目標(biāo)函數(shù)值,比較其大小,找出最好點(diǎn)xL、最壞點(diǎn)xH、及此壞點(diǎn)xG..3)計(jì)算除
2、去最壞點(diǎn)xH以外的(k-1)個(gè)頂點(diǎn)的中心xC。判別xC是否可行,若xC為可行點(diǎn),則轉(zhuǎn)步驟4);若xC為非可行點(diǎn),則重新確定設(shè)計(jì)變量的下限和上限值,即令,然后轉(zhuǎn)步驟1),重新構(gòu)造初始復(fù)合形。4)按式計(jì)算反射點(diǎn)xR,必要時(shí)改變反射系數(shù)α的值,直至反射成功,即滿足式。然后xR以取代xH,構(gòu)成新的復(fù)合形。5)若收斂條件得到滿足,計(jì)算終止。約束最優(yōu)解為:。(三)復(fù)合形法程序框圖見(jiàn)下圖:..是否否否否是是是是否求反射點(diǎn)計(jì)算各頂點(diǎn)的目標(biāo)函數(shù)值f(xj)(j=1,2,……,k)一次壞點(diǎn)xG代替最壞點(diǎn)xH結(jié)束xR可行?xC可行??計(jì)算出去xH后的各頂點(diǎn)中心將各定點(diǎn)的目標(biāo)函
3、數(shù)值和坐標(biāo)按目標(biāo)函數(shù)值的大小排序形成初始復(fù)合形的k個(gè)頂點(diǎn)xj(j=1,2,……,k)輸入n,k,ε開(kāi)始..(一)源程序如下:/*輸入值選擇n=2,k=3,本程序可以處理n為2或3,k為3或4的情況*/#include#include#include#include#defineE01e-5/*復(fù)合形法收斂控制精度*/double**apply(int,int);/*申請(qǐng)矩陣空間*/doublef(double*);/*目標(biāo)函數(shù)*/double*g(double*);/*約束函數(shù)*/bo
4、oljudge(double*);/*可行點(diǎn)的判斷*/intmain(){intn,k;inti,j,k1;intl;doubletemporary;doublerestrain;/*收斂條件*/doublereflect;/*反射系數(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=(doub
5、le*)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
6、*)calloc(n,sizeof(double));/*存放最壞點(diǎn)的反射點(diǎn)*/printf("本程序中的所有輸入,兩個(gè)數(shù)之間用空格隔開(kāi),然后按enter鍵時(shí)不要長(zhǎng)時(shí)間的按,否則,可能會(huì)出錯(cuò)");printf("請(qǐng)輸入選定的第一個(gè)可行點(diǎn)x1(包含%d個(gè)數(shù)):",n);for(i=0;i7、;i++)scanf("%lf",b+i);printf("輸出輸入結(jié)果為:n=%d,k=%d,x1=(",n,k);/*輸出已知數(shù)據(jù)*/for(i=0;i8、;L1:for(i=1;i