线性搜索:0.618法,Fibonacci法,逐次插值逼近法

线性搜索基本迭代格式为x_{k+1}=x_{k}+\alpha _{k}d_{k},其中\alpha _{k}为迭代方向,d_{k}为迭代步长,在确定迭代方向后怎样寻找最佳迭代步长是本章的主要内容(本章不重点涉及迭代方向问题,因为算法比较基础,都是建立在一元函数下,所以只有前和后,故本章不介绍复杂的迭代方向问题)

原理

所谓最佳迭代步长就是在此步长下函数值最小,f(x_{k}+\alpha _{k}d_{k})=min_{\alpha >0} f(x_{k}+\alpha d_{k}),也可表述为\alpha _{k}=min(\alpha >0|\bigtriangledown f(x_{k+\alpha d_{k}})^{T}d_{k}=0),其中\bigtriangledown是求导符号。

0.618法,Fibonacci法

这是两个很早的线性搜索方法,(作为早期的迭代方法,并不实用,铸瓷差值逼近法为重点)共同前提为g(\alpha )=f(x_{k}+\alpha d_{k})为在我们所划定的搜索区间[a,b]为凸函数,原理为a_{0}=a,b_{0}=b,c_{i}=b_{i}-0.618(b_{i}-a_{i}),d_{i}=a_{i}+0.618(b_{i}-a_{i}),取g(c_{i}),g(a_{i}),g(b_{i}),g(d_{i})中最小的三个,取最小的这三个的横坐标中最大的为b_{i+1},最小的为a_{i+1}。重复上述过程,Fibonacci法类似。

代码部分

p=0.382;a=0;b=1;% 0.618
t2=a+p(b-a);
x1=f(t2);% 函数需要你们自己给出
t1=a+b-t2;
x2=f(t1);% 函数需要你们自己给出
x=b-a
while x<=o
    if x1<=x2
        a=t2;
        t2=t1;
        x2=x1;
        t1=a+b-t2;
        x1=f(t1);
    else
        b=t1;
        t1=t2;
        x1=x2;
        t2=a+p(b-a);
        x2=f(t2);
    end
    x=b-a;
end
xo=(a+b)/2;

n=100; % Fibonacci
a=zeros(1,102);
a(1)=1;
a(2)=1;
a=0;
b=1;
q=0.05;
for i=1:n
    a(i+2)=a(i+1)+a(i);
end
l=1;
while (b-a)>=q
    k=a+(1-a(l)/a(l+1))*(b-a);
    j=a+(a(l)/a(l+1))*(b-a);
    if f(j)<f(k) % 函数需要你们自己给出
        b=k;
    else
        a=j;
    end
    l=l+1;
end
t=(a+b)/2;

逐次插值逼近法

逐次插值逼近法是用插值多项式的极小点来逼近或者说收敛于原函数的极小点,在搜索区间内找到三点满足a_{1}<a_{2}<a_{3};g(a_{1})>g(a_{2})<g(a_{3}),通过Language插值法来构造二次函数,然后找到二次函数的极小点a,然后比较g(a_{1}),g(a_{2}),g(a_{3}),g(a)的大小,找到函数值最小的点x和左右两边跟x相距最近的两个点作为新的a_{1},a_{2},a_{3},显然满足a_{1}<a_{2}<a_{3};g(a_{1})>g(a_{2})<g(a_{3}),按此规律不断迭代,直到|a_{2}-a|<\varepsilon,\varepsilon为极小值点的精度。

基本逻辑已经很清楚了,具体迭代公式不再做一一推导,迭代公式结论在代码中,关于其收敛性问题,这里不作为重点,有趣性的读者可以去阅读《最优化方法》。

代码部分

a1=0;a2=2;a3=3;
while abs(a-a2)>=0.05
    a=0.5*((a2^2-a3^2)*f(a1)+(a3^2-a1^1)*f(a2)
    +(a1^2-a2^2)*f(a3))/((a2-a3)*f(a1)+(a3-a1)*f(a2)+(a1-a2)*f(a3));
    % a点的迭代公式,按照基本逻辑很容易推导
    if a>a2
        if f(a)<=f(a2)
            a1=a2;
            a2=a;
        else
            a3=a;
        end
    else
        if f(a)<=f(a2)
            a3=a2;
            a2=a;
        else
            a1=a;
        end
    end
end
t=(a+a2)/2;

(代码如有问题,欢迎指正交流)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的女友叫苏苏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值