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
  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 以下是FibonacciMATLAB代码: function [x, fval, n] = fibonacci(f, a, b, tol) % 输入: % f:目标函数 % a, b:搜索区间 % tol:容差 % 输出: % x:最优解 % fval:最优解对应的函数值 % n:迭代次数 % 初始化 n = ; L = b - a; F = [1 1]; while F(end) < L / tol F = [F F(end) + F(end-1)]; end k = length(F) - 1; x1 = a + F(k-1) / F(k+1) * L; x2 = a + F(k) / F(k+1) * L; f1 = f(x1); f2 = f(x2); n = n + 2; % 迭代 while L > tol if f1 < f2 b = x2; x2 = x1; f2 = f1; L = b - a; k = k - 1; x1 = a + F(k-1) / F(k+1) * L; f1 = f(x1); n = n + 1; else a = x1; x1 = x2; f1 = f2; L = b - a; k = k - 1; x2 = a + F(k) / F(k+1) * L; f2 = f(x2); n = n + 1; end end % 输出结果 x = (a + b) / 2; fval = f(x); end ### 回答2: Fibonacci序列是一个非常经典的数学序列,其中每个数都是前两个数的和。在Matlab中,我们可以使用递归或循环来实现Fibonacci代码。 1. 使用递归实现Fibonacci: ```matlab function res = fibonacci(n) if n <= 2 res = 1; % Fibonacci序列的前两个数是1 else res = fibonacci(n-1) + fibonacci(n-2); % 递归调用 end end ``` 在这段代码中,我们定义了一个函数`fibonacci`,它接受一个参数`n`,表示要计算Fibonacci序列的第n个数。当n小于等于2时,直接返回1;否则,我们通过递归调用`fibonacci(n-1)`和`fibonacci(n-2)`来计算第n个数。 2. 使用循环实现Fibonacci: ```matlab function res = fibonacci(n) a = 1; % Fibonacci序列的第一个数 b = 1; % Fibonacci序列的第二个数 for i = 3:n temp = a + b; a = b; b = temp; end res = b; % 返回第n个数 end ``` 在这段代码中,我们使用循环来解Fibonacci序列。我们首先初始化变量a和b,分别表示Fibonacci序列的第一个和第二个数。然后,通过一个循环从第三个数开始计算,每次计算后更新a和b的值。最后,返回第n个数的值。 这两种方都可以计算Fibonacci序列,递归方更直观,但效率较低,循环方更高效,适用于需要计算大量Fibonacci数的情况。 ### 回答3: Fibonacci数列是一个经典的数学问题,它的定义如下:F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) (n > 1)。编写MATLAB代码来生成Fibonacci数列如下: ``` function fibonacci(n) a = 0; b = 1; fprintf('Fibonacci数列前%d项为:', n); fprintf('%d ', a); for i = 2:n fprintf('%d ', b); c = a + b; a = b; b = c; end fprintf('\n'); end ``` 这段代码使用了迭代的方式来生成Fibonacci数列,通过输入一个正整数n,它将打印出Fibonacci数列的前n项。代码首先声明了两个变量a和b,分别初始化为0和1,用来保存Fibonacci数列的前两项。然后,通过一个for循环,从第三项开始,每次计算下一项并打印出来。在每次迭代中,将a和b的值更新为前两项的和。最后,打印出Fibonacci数列的前n项。 要使用这个代码,只需要调用`fibonacci(n)`函数,其中n是一个正整数。例如,`fibonacci(10)`将打印出Fibonacci数列的前10项。 注意:这段代码假设输入的n是一个正整数,没有进行错误处理。如果需要处理错误的情况,例如输入非正整数或者其他类型的值,可以在代码中添加相应的检查和处理逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值