MATLAB之斐波那契法

MATLAB之斐波那契

之前在网上看到过很多关于斐波那契算法的文章,我从中吸收了一些知识,觉得对初学者来说很容易理解,再此分享给大家。

一、算法原理

1、引入
我的上一篇博客讲解了黄金分割法,我们以此为突破点,来了解它。
假设函数f(x)的极值坐在区间为(a,b),利用黄金分割点
在区间(a,b)内插入两点:
x1=a+0.382*(b-a);
x2=a+0.618*(b-a);
其中0.382=3/8,0.618=5/8。这两个数就是斐波那契数列中的数。
2、概念
对于这样的一个数列:
1 1 2 3 5 8…,我们可以发现,2=1+1,3=1+2,5=2+3,8=3+5…
后一个数的值总是前两个数值的和。这样一个数列,我们就称它为斐波那契数列。
3.斐波那契算法
那什么时斐波那契算法呢,我们还是用黄金分割法这个例子来分析,
1、假设函数f(x)的极值坐在区间为(a,b),利用黄金分割点
在区间(a,b)内插入两点:
x1=a+0.382*(b-a);
x2=a+0.618*(b-a);
2、x1、x2将搜索区间分为三段:
比较f(x1)f(x2)的大小,
若 f(x1)<f(x2)
新的搜索区间为(a,x2),
a不变,b=x2,x2=x1,新的x1=2/5*(b-a)
否则
新的搜索区间为(x1,b)
b不变,a=x1,x1=x2,x2=3/5*(b-a)
不断循环上述过程,知道区间a,b的值足够小。
3、最后判断 abs(a,b) ,该区间是否足够小,取区间中点作为极值点。
这就是斐波那契法,需要注意的事,我们需要事先来构造一个我们想要的斐波那契数列。

二、matlab程序

clc
clear
f=@(x) 2*x.^4-x.^3-6*x -5; %首先定义一个匿名函数
a1=8*x^3-3*x^2-6;
x1=vpa(solve(a1,x),5);
[x,fx]=Fabonacci(f,[0 2],1e-9)
tol=x-double(x1(1))
function [x,result]=Fabonacci(f,x0,delta) %x0储存极值所在区间
x3=x0(2);
x0=x0(1);
F=[1 1]; %斐波那契数列的前两个数为1
n=3; %从第三个数开始填充
while F(end) < (x3-x0)/delta  %生成斐波那契数列
    F(n)=F(n-1)+F(n-2);
    n=n+1;
end
n=n-1; %while循环最后多加了一个数,这里减一刚好就是斐波那契数列元素的个数
x1=x0+F(n-2)/F(n)*(x3-x0);
x2=x0+F(n-1)/F(n)*(x3-x0);
while n > 3 
    if f(x1) > f(x2)
        n=n-1; %执行一次,斐波那契数列向前推一个数
        x0=x1;
        x1=x2;
        x2=x0+F(n-1)/F(n)*(x3-x0);
    else
        n=n-1;
        x3=x2;
        x2=x1;
        x1=x0+F(n-2)/F(n)*(x3-x0);
    end
end
x=(x0+x3)/2;
result=f(x);
end
发布了10 篇原创文章 · 获赞 8 · 访问量 69

猜你喜欢

转载自blog.csdn.net/STM89C56/article/details/105448489