一維搜尋方法/黃金分割法(附matlab程式碼)
阿新 • • 發佈:2018-12-15
一維搜尋方法中的黃金分割法(附matlab程式碼)
一維搜尋方法:一維搜尋,又稱一維優化,是指求解一維目標函式 f(X) 最優解的過程,分為試探法和插值法。 黃金分割法:屬於一維搜尋方法中的試探法,適用於[a,b]區間上的任何單谷函式求極小值問題。 證明r=0.618 黃金分割法要求 1.要求插入點a1、a2的位置關於初始搜尋區間 [a,b] 兩端點對稱 2.分割後在保留下的區間再插入一點,所形成的新三段與原來區間的三段具有相同的比例分佈 用圖來表示如下
設原區間[a,b]的長度為1,保留下來的區間[a,a2]長度為r,則區間縮短率為r。為了保持相同的比例分佈,新插入點a3應在r(1-r)的位置上,a1在原區間的1-r位置應相當於在保留區間的r^2位置上。若保留下來的區間為[a1,b],根據插入點的對稱性,也能推得同樣的r值。 所以
1-r=r^2(r>0)
解得r=0.618
黃金分割法能使相鄰兩次搜尋區間都具有相同的縮短率。
例:求f(x)=cos(x)在[0,2pi]上的極小值點和極小值。
程式框圖:
#用Matlab實現如下(指令碼檔案):
%% 定義函式和初始化 [email protected](x)cos(x); % 所求函式 a=0;b=2*pi; % 初始搜尋區間 Theta_error=0.001; % 收斂精度 r=(sqrt(5)-1)/2; % 給r賦值0.618 a1=b-r*(b-a); a2=a+r*(b-a); y1=feval(f,a1); y2=feval(f,a2); stepNum=0; % 迭代次數初始化 x=a:0.01:b; y=cos(x); plot(x,y) hold on % 繪製函式影象 %% 具體計算過程 while abs((b-a)/b)>=Theta_error || abs((y2-y1)/y2)>=Theta_error stepNum=stepNum+1; if y1>=y2 a=a1; a1=a2; y1=y2; a2=a+r*(b-a); y2=feval(f,a2); else b=a2; a2=a1; y2=y1; a1=b-r*(b-a); y1=feval(f,a1); end end %% 輸出 [ x_opt,y_opt] = golden_opt(f,a,b) % 呼叫函式 x_opt=(a+b)/2;y_opt=feval(f,x_opt); plot(x_opt,y_opt,'r*') % 在影象中標出極小值點 fprintf('程式經過%d次迭代得到函式極小值點為%d ',stepNum,x_opt)
定義的 golden_opt函式(需要另外建一個函式檔案):
function [ x_opt,y_opt] = golden_opt(f,a,b)
x_opt=(a+b)/2;
y_opt=feval(f,x_opt);
end
程式執行結果: x_opt =
3.1425
y_opt =
-1.0000
程式經過16次迭代得到函式極小值點為3.142472e+00 >>