資源描述:
《matlab 黃金分割法》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、黃金分割法東南大學(xué)機(jī)械學(xué)院**一黃金分割法基本思路黃金分割法適用于[a,b]區(qū)間上的任何單谷函數(shù)求極小值問(wèn)題,對(duì)函數(shù)除要求“單谷”外不做其他要求,甚至可以不連續(xù)。因此,這種方法的適應(yīng)面非常廣。黃金分割法也是建立在區(qū)間消去法原理基礎(chǔ)上的試探方法,即在搜索區(qū)間[a,b]內(nèi)適當(dāng)插入兩點(diǎn)a1,a2,并計(jì)算其函數(shù)值。a1,a2將區(qū)間分成三段,應(yīng)用函數(shù)的單谷性質(zhì),通過(guò)函數(shù)值大小的比較,刪去其中一段,是搜索區(qū)間得以縮小。然后再在保留下來(lái)的區(qū)間上作同樣的處理,如此迭代下去,是搜索區(qū)間無(wú)限縮小,從而得到極小點(diǎn)的數(shù)值近似解。二黃金分割法的基本原理一維搜索是解函數(shù)極小值的方法之一,其解法思想為沿某一
2、已知方向求目標(biāo)函數(shù)的極小值點(diǎn)。一維搜索的解法很多,這里主要采用黃金分割法(0.618法)。該方法用不變的區(qū)間縮短率0.618代替斐波那契法每次不同的縮短率,從而可以看成是斐波那契法的近似,實(shí)現(xiàn)起來(lái)比較容易,也易于人們所接受。黃金分割法是用于一元函數(shù)f(x)在給定初始區(qū)間[a,b]內(nèi)搜索極小點(diǎn)xmin的一種方法。它是優(yōu)化計(jì)算中的經(jīng)典算法,以算法簡(jiǎn)單、收斂速度均勻、效果較好而著稱(chēng),是許多優(yōu)化算法的基礎(chǔ),但它只適用于一維區(qū)間上的凸函數(shù),即只在單峰區(qū)間內(nèi)才能進(jìn)行一維尋優(yōu),其收斂效率較低。其基本原理是:依照“去劣存優(yōu)”原則、對(duì)稱(chēng)原則、以及等比收縮原則來(lái)逐步縮小搜索區(qū)間。具體步驟是:在區(qū)間
3、[a,b]內(nèi)取點(diǎn):a1,a2把[a,b]分為三段。①如果f(a1)>f(a2),令a=a1,a1=a2,a2=a+0.618*(b-a);②如果f(a1)4、行結(jié)果例如:f=x^2+2*x,給定搜索區(qū)間[-3,5],求此函數(shù)的極小點(diǎn)。1.首先運(yùn)行主程序:2.會(huì)提示你輸入各個(gè)變量的值:2.輸完各個(gè)變量的值,以及所求函數(shù)后,再運(yùn)行:xmin=golden(f,a,b,e)系統(tǒng)調(diào)用m文件的內(nèi)容,這時(shí)候matlab就會(huì)輸出函數(shù)的最優(yōu)值。即該函數(shù)的最小值點(diǎn)在x=-1,最小點(diǎn)的函數(shù)值fmin=-1,一共經(jīng)過(guò)了29次迭代。五實(shí)驗(yàn)心得通過(guò)此次實(shí)驗(yàn),加深了對(duì)黃金分割法的基本理論和算法框圖及步驟的全面理解,掌握了matlab的使用方法。此方法適用于一維函數(shù)求最小值的問(wèn)題。原理比較簡(jiǎn)單,稍微復(fù)雜一點(diǎn)的就是縮小區(qū)間的時(shí)候怎么進(jìn)行換名,另外一個(gè)難點(diǎn)就是如何用
5、matlab來(lái)實(shí)現(xiàn),此次實(shí)驗(yàn)通過(guò)自學(xué)matlab的基本操作以及matlab編程語(yǔ)言,最后完成了此次實(shí)驗(yàn)。附錄matlab程序代碼主程序:symsxabe;%定義變量a=input('搜索區(qū)間的第一點(diǎn)a=');%確定搜索區(qū)間b=input('搜索區(qū)間的第二點(diǎn)b=');e=input('搜索精度e=');%收斂精度disp('需求的優(yōu)化函數(shù)f=f(x),調(diào)用xmin=golden(f,a,b,e)');m文件:functionxmin=golden(f,a,b,e)k=0;a1=b-0.618*(b-a);%插入點(diǎn)的值a2=a+0.618*(b-a);whileb-a>e%
6、循環(huán)條件y1=subs(f,a1);y2=subs(f,a2);ify1>y2%比較插入點(diǎn)的函數(shù)值的大小a=a1;%進(jìn)行換名a1=a2;y1=y2;a2=a+0.618*(b-a);elseb=a2;a2=a1;y2=y1;a1=b-0.618*(b-a);endk=k+1;end%迭代到滿足條件為止就停止迭代xmin=(a+b)/2;fmin=subs(f,xmin)%輸出函數(shù)的最優(yōu)值fprintf('k=');%輸出迭代次數(shù)disp(k);