一维搜索-黄金分割法matlab实现
前言
求解优化问题可以用解析解法和数值解法,在很多情况下,机械优化设计问题限制条件比较多,与之对应的数学描述也比较复杂,不便于甚至不可能用解析法求解,只能用数值法求解,如黄金分割法、消去法、牛顿法、二次插值法、共轭梯度法等。本文介绍的是黄金分割法
提示:以下是本篇文章正文内容,下面案例可供参考
1、黄金分割法
1.1 黄金分割法的定义
黄金分割法,又称作0.618法,它是用于一元函数 f (x) 在给定的区间[a b]内搜索极小值点的一种一维搜索方法。“黄金分割”是指将一线段分成两段,使整段长与较长段的长度比值等于较长段与较短段长度的比值,即1:L=L:(1-L),解得:L=0.618.
1.2 黄金分割法的搜索过程
黄金分割法要求插入点 x1 、x2 的位置相对于区间 [a b]两端点具有对称性,即在给定区间 [a b]内取点.
- x1=b-L(b-a)
- x2=a+L(b-a)
如果f(x1)>f(x2).令a=x1;
如果f(x1)<f(x2)令b=x2,重新开始搜索。具体搜索过程见程序框图。
2、黄金分割matlab实现
2.1 求f(x)=x^2-7*x+10的极值
代码如下(示例):
function HJ
syms x
f=@(x)x^2-7*x+10;
a=2;
b=8;
eps=0.35;
l=0.618;
x1=b-l*(b-a);
x2=a+l*(b-a);
y1=f(x1);
y2=f(x2);
i=0;
while abs(b-a)>eps
i=i+1;
if y1>=y2
a=x1;
x1=x2;
y1=y2;
x2=a+l*(b-a);
y2=f(x2);
else
b=x2;
x2=x1;
y2=y1;
x1=b-l*(b-a);
y1=f(x1);
end
end
x=(a+b)/2
y=f(x)
所得结果为:
2.2 解析法验算:
3.黄金分割脚本编码
note:此脚本接上文powell法用
function opt_step=goldsection(x01,x02,d,h0)
l=0.618;
[a,b]=search2(x01,x02,d,h0);
a1=b-l*(b-a);y1=ff(x01+d(1)*a1,x02+d(2)*a1);
a2=a+l*(b-a);y2=ff(x01+d(1)*a2,x02+d(2)*a2);
for n=1:100
if y1>=y2
x1(n)=a1;x2(n)=a2;yp1(n)=y1;yp2(n)=y2;
a=a1;a1=a2;y1=y2;
a2=a+l*(b-a);y2=ff(x01+d(1)*a2,x02+d(2)*a2);
else
x1(n)=a1;x2(n)=a2;yp1(n)=y1;yp2(n)=y2;
b=a2;a2=a1;y2=y1;
a1=b-l*(b-a);y1=ff(x01+d(1)*a1,x02+d(2)*a1);
end
aa(n)=(a+b)/2;
y(n)=ff(x01+d(1)*aa(n),x02+d(2)*aa(n));
e(n)=abs(b-a);
opt_step=(a+b)/2;
if abs(b-a)<1e-5
break;
end
end