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