1. 程式人生 > >一維搜尋方法/黃金分割法(附matlab程式碼)

一維搜尋方法/黃金分割法(附matlab程式碼)

一維搜尋方法中的黃金分割法(附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 >> 在這裡插入圖片描述