資源描述:
《黃金分割法程序》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、一維搜索一維優(yōu)化一般分為兩大步驟:(1)確定初始搜索區(qū)間[a,bj,該區(qū)間應(yīng)是包括一維函數(shù)極小點在內(nèi)的單峰區(qū)間;(2)在搜索區(qū)間[a,b]內(nèi)尋找極小點。搜索區(qū)間的確定一進退法基本思路是:由單峰函數(shù)性質(zhì)可知,在極小點a*左邊函數(shù)值應(yīng)嚴格下降,而在極小點右邊函數(shù)值應(yīng)嚴格上升。因此,可從某一個給定的初始點aO出發(fā),以初始步長hO沿著目標函數(shù)值的下降方向,逐步前進或后退,直到找到相繼的3個試點的函數(shù)值按“大…小…■大”變化為止。-:確定搜索區(qū)間的外推法?首先確定函數(shù)的單谷性?然后從起點開始以初始步長向前試探,如果函數(shù)值變大,則改變步長方向。?如果
2、函數(shù)值下降,則維持原來的試探方向,并將步長加倍。搜索區(qū)間的確定流程圖確定搜索區(qū)間的程序代碼voidfindqujian(floata[3],floatf[3J)floatt=steplength,al,fl,ia;a[0]=0;f[0]=fc(a[0]);for(inti=0;;i++){a[l]制0]+t;f[l]=fc(a[l]);if(f[l]=e){t=-t;a[0]=a[l];f[0]=f[l];}else{if(ia==l)return;t=t/2;ia=l;}}f
3、oT(i=0;;i++){a[2]=a[l]+t;f[2]=fc(a[2]);if(f[2]>f[l])break;t=2*t;a[0]=a[l];f[0]=f[l];a[l]=a[21;f[l]=f[2];if(a[0]>a[2]){al=a[OJ;fl=f[OJ;a[0]=a[2];f[0]=f[2];a⑵=al;f[2]=fl;}return;一、黃金分割法黃金分割法是通過不斷縮短搜索區(qū)間的長度來尋求一維函數(shù)的極小點,這種方法的基本原理是:在搜索區(qū)間[a,b]內(nèi)按如下規(guī)則對稱地取兩點al和a2a1=a+0.382(b-a);a2=a
4、+0?618(b-a);黃金分割法的搜索過程是:1)給出初始搜索區(qū)間[a,b]及收斂精度e,將賦以0.6182)計算al和a2,并計算起對應(yīng)的函數(shù)值f(al),f(a2);,3)根據(jù)期間消去法原理縮短搜索區(qū)間,為了能用原來的坐標點計算公式,需進行區(qū)間名城的代換,并在保留區(qū)間中計算一個新的試驗點及其函數(shù)值。4)檢查區(qū)間是否縮短到足夠小和函數(shù)值收斂到足夠近,如果條件不滿足則返回到步驟2。5)如果條件滿足,則取最后兩試驗點的平均值作為極小點的數(shù)值近似解。黃金分割法的流程圖及程序清單需要說明的是搜索區(qū)間血b]不需要給定,只需輸入搜索精度e;程序由
5、四個子程序構(gòu)成;(1):輸入輸出子程序io();(2):floatfc(floatx)求輸入函數(shù)在某一點的值;(3)voidfindqujian(floata[3],floatf[3])確定搜索區(qū)間;(4):floatxunyou(float*value)尋找最小值^include二iostream.h二^include二math?h=^include二saio.h二^include二conio.h二^definesiepcrngth0.01#definen3floate;floata,b,c;floatq[3];voidio(){cou
6、t?n假設(shè)多項式的最高次幕為2n?endl?endl;cout?n設(shè)多項式的一般形式為f=a*xA2+b*x+c',?endl?endl;cout?n請輸入要求解的目標多項式的系數(shù)H?endl?endl;printf(na=H);scanf(n%f&a);q[2]=a;printf(nb=n);scanf(n%f&b);q[l]=b;printf(nc=H);scanf(n%f!,&c);q[O]=c;cout?endl;cout?"請輸入搜索精度en?endl?endl;scanf(H%f&e);cout?endl;}floatf
7、c(floatx){inti;floatu=q[n-l];for(i=n-2;i>=0;i—)u二u*x+q[i];returnu;}voidfindqujian(floata[3],floatf[3]){floatt=float(steplength),al,fl,ia;a[0]=0;f[0]=fc(a[0]);for(inti=0;;i++){a[l]=a[O]+t;f[l]=fc(a[l]);if(f[l]=e){t=-t;a[0]=a[l];f[0]=f[l];}els
8、e{if(ia==l)return;t=t/2;ia=l;}}for(i=0;;i++){a[2]=a[l]+t;f[2]=fc(a[2]);if(f[2]>f[l])break;t=2*t;