MATLAB學習筆記03——無約束一維極值問題(一)進退法和黃金分割法

無約束一維極值問題求解時一般採用一維搜索法,,其中方法包括多種,線性搜索:黃金分割、斐波那契法、牛頓法等,非線性包括拋物線法和三次插值法。
進退法是一種縮小極值區間的算法,算出的結果是一個包含極值的區間,適用於未知極值範圍的情況下。
黃金分割法適用於在知道極值區間的前提下,利用不斷縮小區間的思想,最終得出極值的近似值。
兩種算法相輔相成。
後續文章會介紹更多求極值算法。
1.進退法
算法步驟
1.給定初始點x0,初始步長h0。令h=h0,x1=x0,k=0
2.令x4=x1+h,置k=k+1
3.若f(x4)
4.令x2=x1。x1=x4,f(x2)=f(x1),f(x1)=f(x4),令h=2h轉2
5.若k=1,則轉6,否則轉7
6.令h=-h,x2=x4,f(x2)=f(x4),轉2
7.令x3=x2,x2=x1,x1=x4,停止計算,極小點包含於【x1,x3】或【x3,x1】
matlab實現代碼:
function [minx,maxx]=minJT(f,x0,h0,eps)
%用進退法搜索一維函數極小點區間
%目標函數f,
%初始點x0,初始步長h0,精度eps,
%極值區間左右點minx,maxx
format long;
if nargin==3
    eps=1.0e-6; %默認搜索精度
end
x1=x0;
k=0;
h=h0;
while 1
    x4=x1+h;%試探步
    k=k+1;
    f4=subs(f,symvar(f),x4);
    f1=subs(f,symvar(f),x1);
    if f4
        x2=x1;
        x1=x4;
        f2=f1;
        f1=f4;
        h=2*h;
    else
        if k==1
            h=-h; %反向搜索
            x2=x4;
            f2=f4;
        else
            x3=x2;
            x2=x1;
            x1=x4;
            break;
        end
    end
end
minx=min(x1,x3);
maxx=x1+x3-minx;
format short;
先利用進退法求出極值點區間
利用一維搜索的方法求出極小值點:
1.黃金分割法
即利用不斷縮小搜索區間的思想,逼近極小點,是一種單端點收縮法,主要思想是先利用黃金分隔比縮小區間
a1=a0+0.382*(b0-a0);
b1=a0+0.618*(b0-a0);
隨後比較F(a1)和F(B1)大小,取函數值較大者的自變量爲新的區間邊界,(因爲函數值大者必然未越界,即達到包含極值且縮小區間的目的)而另一個新邊界則直接用原舊邊界的只,省去計算,這也是用黃金分隔比作爲區間分割比例的原因
(0.618*0.618=0.382,0.382+0.382*0.618=0.618)
    if f1>f2
        a0=a1;%改變左端點,取大值防越界
        a1=b1;
        b1=a0+0.618*(b0-a0);
MATLAB實現代碼:
function [x,minf]=minGoldCut(f,a,b,eps)
%f:函數
%a、b:區間上下界
%eps:精度
format long;
if nargin==3
    eps=1.0e-6;
end
a0=a;
b0=b;
k=0;
tol=abs(b0-a0);
a1=a0+0.382*(b0-a0);
b1=a0+0.618*(b0-a0);
while tol>eps && k<1000
    tol=abs(a0-b0);
    k=k+1;
    f1=subs(f,symvar(f),a1);
    f2=subs(f,symvar(f),b1);
    if f1>f2
        a0=a1;%改變左端點,取大值防越界
        a1=b1;
        b1=a0+0.618*(b0-a0);
    else
        b0=b1;
        b1=a1;
        a1=a0+0.382*(b0-a0);
    end
end
if k==100000
    disp('找不到最小值!');
end
x=(a0+b0)/2;
minf=subs(f,symvar(f),x);
minf=double(minf);%可能由於置換不完全原因,添加此語句將minf格式轉化爲double
format short;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章