黄金分割法适用于已知极值区间的前提下,利用不断缩小区间的思想,最终得出极值的近似值。该方法只是要求函数单峰,可以不连续。因此,这种方法的适应面非常广泛。
黄金分割法也是建立在区间消去法原理基础上的试探方法,即在搜索区间[a,b]内适当插入两点a1,a2,并计算其函数值。a1,a2 将原来区间分成三段,再应用函数的单峰性质,通过函数值大小的比较,删除其中一段,使搜索区间得以缩小。然后在保留下来的区间上作同样的处理,如此迭代下去,使搜索区间无限缩小,从而得到极小值点的数值近似解
黄金分割法是用于一元函数f(x)在给定的初始区间[a,b]内搜索极小值点a"的一种方法。它是优化计算中的经典算法,以算法简单收敛速度均匀、效果较好而著称,是许多优化算法的基础。但它只适用于一维区间上的凸函数,即只在单峰区间内才能进行一维寻优,其收敛效率较低。其基本原理是依照去劣存优原则,对称原则以及等比收缩原则来逐步缩小搜索区间。
黄金分割法的基本步骤如下:
- 给定区间[a,b]及eps>0;
- 计算r= a+0.382(b-a),u= a+0.618(b-a);
- 若 f® > f(a),则进行下一步,否则直接进行第(5)步;
- 若u - r< eps,则停止计算,输出x" =u , f" = f(u).否则令a=r,r= u,u = a+0.618(b-a),转人第(3)步;
- 若u-r <eps,则停止计算,输出x" =r,f"= f®,否则令 b=u,u=r,r=a +0.382(b-a),转入第(3)步。
根据以上步骤,编写黄金分割算法的MATLAB代码如下:
function [x, fval, iter]= HJ(a,b)
iter= 0;
while abs(b-a) > 1e-5
iter= iter + 1;
lambda = a+ 0.382*(b-a);
miu= a+0.618* (b-a);
[dy, f1] = funHJ(lambda);
[dy, f2] = funHJ(miu);
if f1> f2
a = lambda;
disp( ['the ' ,num2str(iter) ' iteration search area is :[',num2str(a) ',',num2str(b) ']'])
else
b = miu;
disp( ['the ' ,num2str(iter) ' iteration search area is :[',num2str(a) ',',num2str(b) ']'])
end
end
x=(a+ b)/2;
[dy, fval] = funHJ(x);
end
例 根据黄金分割算法编写程序,求函数f(x)= (sinx)6*[tan(1-x)]e30x在区间[0,1]上的极大值。
解:令g(x) = -f(x) = - (sinx)6*[tan(1- x)]e30x ,求ming(x)。x∈ [0.1]
编写函数代码如下:
function [dy, val]= funHJ(x)
val = -((sin(x))^6* tan(1-x) * exp(30* x));
dy = -(6* (sin(x))^5 * cos(x)* tan(1-x)*exp(30*x) +...
(sin(x))^6* (1/cos(1-x))^2*(-1) * exp(30*x) + (sin(x))^6* tan(1-x) * exp(30*x)*30);
end
clear all
clc
[ x, fval,iter]= HJ(0,1)
运行结果
即min g(x)值为 -4.1086e+10。x∈(0,1)