一维搜索-黄金分割法matlab实现

一维搜索-黄金分割法matlab实现

  • 前言
  • 1、黄金分割法
    • 1.1 黄金分割法的定义
    • 1.2 黄金分割法的搜索过程
  • 2、黄金分割matlab实现
    • 2.1 求f(x)=x^2-7*x+10的极值
    • 2.2 解析法验算:
  • 3.黄金分割脚本编码
  • 4.附上powell法链接


前言

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


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

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) 一维搜索-黄金分割法matlab实现_第1张图片

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)

所得结果为:
一维搜索-黄金分割法matlab实现_第2张图片

2.2 解析法验算:

一维搜索-黄金分割法matlab实现_第3张图片

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法

你可能感兴趣的:(优化算法,算法)