實驗一:黃金分割法(0.618法)程式設計
一、實驗目的
透過一維尋優黃金分割法的程式設計,培養學生計算機的應用能力,併為今後無約束最佳化方法的學習和程式設計,奠定基礎;掌握縮小尋優區間的黃金分割法。
二、實驗內容
(1)請用0.618法求解最佳化問題:
的極小點和極小值(進退法確定初始區間),精度為10-6;
(2)根據0.618法演算法步驟編寫Matlab的程式實現0.618搜尋法;
(3)要求輸出內容包括:極小點、極小值、每次迭代的a、b、al、ak的值;
(4)按照模板撰寫實驗報告,要求規範整潔。
三、演算法步驟、程式碼、及結果
1. 演算法步驟
(1)學習MATLAB基礎程式設計知識;
(2)認真學習0.618法演算法步驟,編寫MATLAB程式golds函式;
2. 程式碼
function [s,phis,k,G,E]=golds(phi,a,b,delta)%輸入:phi是目標函式,a,b是搜尋區間的兩個端點delta,epsilon分別是自變數和函式值的容許誤差9%輸出:s,phis分別是近似極小點和極小值,G是nx4矩陣。其第k行分別是a,p,q,b的第k次迭代值[ak,pk,qk,bk],E=[ds,dphi],分別是s和phis的誤差限
t=(sqrt(5)-1)/2;h=b-a;
phia=feval(phi,a);phib=feval(phi,b);
p=a+(1-t)*h;q=a+t*h;
phip=feval(phi,p);phiq=feval(phi,q);k=1;G(k,:)=[a,p,q,b,h];
while(h>delta)
if(phip<phiq)
b=q;phib=phiq;q=p;phiq=phip;
h=b-a;p=a+(1-t)*h;phip=feval(phi,p);
else
a=p; phia=phip;p=q;phip=phiq;
h=b-a; q=a+t*h;phiq=feval(phi,q);
end
k=k+1; G(k,:)=[a,p,q,b,h];
end
ds=abs(b-a);dphi=abs(phib-phia);
if(phip<=phiq)
s=p;phis=phip;
else
s=q;phis=phiq;
end
E=[ds,dphi];
3. 結果
四、心得體會
- 理論與實踐結合的重要性:將數學理論如黃金分割比應用到實際問題中,如最佳化函式的最小值搜尋,能夠深刻理解理論知識的力量和實用性。透過程式設計實現這一演算法,讓抽象的概念變得具體可操作。
- 演算法效率與精度平衡:0.618法以其簡潔的計算規則和快速的收斂速度,在很多情況下都能有效找到極值點。但同時,透過實驗我也會意識到選擇合適的初始區間和終止條件對於提高搜尋效率和保證解的精度至關重要。
- 程式設計技能的提升:編寫和除錯MATLAB程式碼不僅增強了我的程式設計能力,還讓我學會了如何利用程式語言工具解決實際問題。這包括瞭如何定義函式、迴圈控制、條件判斷以及陣列操作等基本技能。
- 資料分析能力:透過觀察每次迭代過程中的a、b、c、d值變化,可以直觀地理解演算法逐步逼近最優解的過程,增強對迭代演算法工作原理的理解,同時也鍛鍊了資料分析和解讀實驗結果的能力。
- 問題解決思路的擴充:面對不同的最佳化問題,學會靈活調整和應用現有的演算法框架,思考如何根據問題特性進行微調,比如調整初始區間的選擇策略、設定更合理的收斂準則等,培養了解決複雜問題的創新思維。
- 實驗報告撰寫技巧:整理實驗過程、分析結果並撰寫報告,鍛鍊了科學嚴謹的寫作習慣,以及如何清晰、邏輯性地表達實驗思想和結論,這對於學術研究和工程實踐都是極其重要的技能。
綜上所述,本次實驗不僅是對0.618法這一經典最佳化演算法的學習和應用,更是對解決問題能力、程式設計技能、資料分析和科研寫作等多方面能力的綜合訓練,對今後的學習和工作都將產生深遠的影響。