Matlab优化设计及其应用
上QQ阅读APP看书,第一时间看更新

3.1 黄金分割法

3.1.1 黄金分割法的基本原理

黄金分割法又称0.618法,它是通过不断缩短搜索区间的长度来寻求一维函数f(x)的极小点。对于单峰函数f(x),在其极值存在的某个区间[a,b]内取若干个点,计算这些点的函数值并进行比较,总可以找到极值存在的更小区间。在这更小区间内增加计算点,又可以将区间逐步缩小。当区间足够小,即满足精度要求时,就可以用该区间内任意一点的函数值来近似表达函数的极值。

设单变量函数f(x)在区间[a,b]上有定义,若存在一点x*∈(a,b),使得f(x)在区间[a,x*]上严格单调减,f(x)在区间[x*,b]上严格单调增,则称f(x)是区间[a,b]上的(下)单峰函数。显然x*是f(x)在区间[a,b]上的唯一的极小值点。

根据(下)单峰函数所具有的性质,对在某区间[a,b]上的(下)单峰函数f(x)可采用黄金分割法进行搜索其在区间[a,b]内的极小值点。该方法只需计算函数值,用途很广。

3.1.2 黄金分割法的计算方法

设区间[a,b]的长度为L,在区间内取点λ1,从而将区间分割为两部分,线段aλ1的长度记作λ,如图3-2(a)所示。并满足:

由上式有λ2+Lλ-L2=0,两边同除L2

即q2+q-1=0

则有,取正根有。q称为区间收缩率,它表示每次缩小所得的新区间长度与缩小前区间长度之比。这种分割称为黄金分割法。

将黄金分割法用于一维搜索时,在区间内取两对称点λ1,λ2,并满足

显然,经一次分割后,所保留的极值存在的区间要么是[a,λ2],要么是[λ1,b],如图3-2(b)所示。而经k次分割后,所保留的区间的长度为:λk=qkL=0.618kL。

由于区间收缩率q是一个近似值,每次分割必定带来一定的舍入误差。因此,分割次数太多时,计算会失真。经验表明,黄金分割的次数应限制在k=11内。

图3-2 黄金分割法

3.1.3 黄金分割法的计算框图和Matlab程序

1.黄金分割法的计算框图

图3-3是黄金分割法的计算框图。图中ε1,ε2为给定的任意小的精度,k为区间缩短的次数。

2.Matlab程序

%golden_search

function[xo,fo]=golden_search(f,a,b,r,TolX,TolFun,k)

kk=1;

while kk>0

h=b-a;rh=r*h;c=b-rh;d=a+rh;

图3-3 黄金分割法程序框图

fc=feval(f,c);fd=feval(f,d);

if k<=0||abs(h)<TolX&&abs(fc-fd)<TolFun

if fc<=fd

xo=c;fo=fc;

kk=0;

else

xo=d;fo=fd;

kk=0;

end

if k==0;fprintf('达到计算次数');kk=0;end

else

if fc<fd

b=d;k=k-1;

else

a=c;k=k-1;

end

end

end

【例3-1】 计算目标函数

f(x)=2+x2

在区间[-2,2]内的极小点。

解:用户程序如下:

%golden_s_test1.m

function golden_s_test1

clc;

clear all;

gs_fun=inline('2+x^2','x');

a=-2;b=2;r=(sqrt(5)-1)/2;TolX=1e-7;TolFun=1e-7;MaxIter=50;

[xo,fo]=fminbnd(gs_fun,a,b)

[xo,fo]=golden_search(gs_fun,a,b,r,TolX,TolFun,MaxIter)

计算结果为:

xo=-5.55e-17;fo=2