1. 程式人生 > >MATLAB 無約束一維極值問題

MATLAB 無約束一維極值問題

無約束一維極值問題

極值問題表示式:min f(x)  x,x[ x1 x2];

一維極值的搜尋方式包括線性搜尋和非線性搜尋,線性搜尋包含黃金分割法、斐波那契法和牛頓法,非線性方法包含拋物線法和三次樣條插值。

1、進退法

演算法原理:

 進退法就是用來確定搜尋區間的演算法,理論依據:f(x)為函式有一極值,且【a b】為極值的區間,對於任一x1 x2屬於【a b】,如果f(x1)<f(x2),則【a x2】為極小值的搜尋區間,如果f(x1)>f(x2),則搜尋區間為【x1 b】為極小值的搜尋區間,

因此,給定初始值x0,初始搜尋步長h的情況下,首先以初始步長進行搜尋,計算f(x0+h)

(1)如果f(x0)<f(x0+h)

則搜尋區間為【x x+h】,為確定x,計算f(x0+ƪh),,

(2)如果f(x0)>f(x0+h)

則搜尋區間為【x+h x】,為確定x,計算f(x0+ƪh),,

演算法步驟:

1、給定初值x(0),初始步長h0,領h=h0,x(1)=x(0),k=0

2、給定x(4)=x(1)+h,k=k+1

3、若f(x(4))<f(x(0)),則轉到4,否則轉到5

4、令x(2)=x(1),x(1)=x(4),f(x(2))=f(x(1)),f(x(1))=f(x(4)),h=2*h

5、若k=1,轉到6,否則轉到7

6、令h=-h,x(2)=x(4),f(x(2))=f(x(4)),

轉到2

7、令x(3)=x(2),x(2)=x(1),x(1)=x(4),停止計算,極小點包含區間[x(0) x(1)],或者【x(3) x(1]

演算法程式碼:

<span style="font-size:18px;"><strong>%進退法
% 功能:用進退法法求解一維函式極值
%目標函式:f
% 初始點:x0
% 初始步長h0
% 精度 eps
% 目標函式取包含極值的區間左端點 minx
% 目標函式取包含極值的區間右端點 maxx
function [minx,maxx]=minJT(f,x0,h0,eps)
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,findsym(f),x4);
    f1=subs(f,findsym(f),x1);
    if f4<f1
        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;</strong></span>