前言

求解优化问题可以用解析解法和数值解法,在很多情况下,机械优化设计问题限制条件比较多,与之对应的数学描述也比较复杂,不便于甚至不可能用解析法求解,只能用数值法求解,如黄金分割法、消去法、牛顿法、二次插值法、共轭梯度法等。本文介绍的是黄金分割法


提示:以下是本篇文章正文内容,下面案例可供参考

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]内取点.

  1. x1=b-L(b-a)
  2. 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

4.附上powell法链接

powell法

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐