斐波那契数列

文章通过MATLAB代码展示了斐波那契数列的计算,包括递归和非递归方法,并讨论了数列与黄金分割率的关系。此外,还介绍了创建用户界面控件和图形对象属性的操作,以及如何进行性能测试和图形显示。
摘要由CSDN通过智能技术生成

目录

斐波那契数列

斐波那契数列和黄金分割率的关联

解析表达式

练习


斐波那契数列


一个人将一对兔子放到一个封闭的围墙内,并假设每对兔子每个月都繁殖出一对兔子,且新生兔子从第二个月开始有繁殖能力,那么一年以后这个封闭的围墙内有多少只兔子。

本月月底的兔子的对数等于月初兔子对数加上刚成熟的新生兔子的对数。

(bunny通常指的是小兔子)

persistent var1 ... varN 将变量 var1 ... varN 声明为持久变量。持久变量是声明它们的函数的局部变量;但其值保留在对该函数的各次调用所使用的内存中。当 MATLAB 首次遇到特定 persistent 语句时,它将持久变量初始化为空矩阵 ([])。

clf - 清空图窗
    此 MATLAB 函数 删除当前图窗中具有可见句柄的所有子级。

shg - 显示当前图窗
    此 MATLAB 函数 使当前图窗可见,并将其置于屏幕上所有其他图窗的前面。这与使用命令figure(gcf) 一样。

cat 当 A 和 B 具有兼容的大小(除运算维度 dim 以外的维度长度匹配)时,C = cat(dim,A,B) 沿维度 dim 将 B 串联到 A 的末尾。

C = cat(dim,A1,A2,…,An) 沿维度 dim 串联 A1A2、…、An

您可以使用方括号运算符 [] 进行串联。例如,[A,B] 或 [A B] 将水平串联数组 A 和 B,而 [A; B] 将垂直串联它们。

uicontrol - 创建用户界面控件

c = uicontrol 在当前图窗中创建一个普通按钮(默认用户界面控件),并返回 UIControl 对象。如果图窗不存在,则 MATLAB® 调用 figure 函数以创建一个图窗。

c = uicontrol(Name,Value) 创建一个用户界面控件,其中包含使用一个或多个名称-值对组参数指定的属性值。例如,'Style','checkbox' 会创建一个复选框。

c = uicontrol(parent) 在指定的父容器中创建默认用户界面控件,而不是默认为在当前图窗中。

c = uicontrol(parent,Name,Value) 指定用户界面控件的父容器和一个或多个名称-值对组参数。

uicontrol(c) 将焦点放在一个以前定义的用户界面控件上。

set 设置图形对象属性

set(H,Name,Value) 为 H 标识的对象指定其 Name 属性的值。使用时须用单引号将属性名引起来,例如,set(H,'Color','red')。如果 H 是对象的向量,则 set 会为所有对象设置属性。如果 H 为空(即 []),set 不执行任何操作,但不返回错误或警告。

set(H,NameArray,ValueArray) 使用元胞数组 NameArray 和 ValueArray 指定多个属性值。要为 m 个图形对象中的每个图形对象设置 n 个属性值,请将 ValueArray 指定为 m×n 的元胞数组,其中 m = length(H),而 n 等于 NameArray 中包含的属性名的数量。

set(H,S) 使用 S 指定多个属性值,其中 S 是一个结构体,其字段名称是对象属性名称,字段值是对应的属性值。

s = set(H) 返回 H 标识的对象的、可由用户设置的属性及其可能的值。s 是一个字段名称是对象属性名称且字段值是对应属性的可能值的结构体。如果您不指定输出参数,MATLAB 软件会在屏幕上显示该信息。H 必须为单个对象。

values = set(H,Name) 返回指定属性的可能值。如果可能的值为字符向量,则 set 会在元胞数组 values 的元胞中返回每个值。对于其他属性而言,set 会返回一个指示 Name 没有一组固定属性值的语句。如果您不指定输出参数,MATLAB 会在屏幕上显示该信息。H 必须为单个对象。

findobj 查找具有对应属性的图形对象

h = findobj 返回图形根对象及其所有后代。

h = findobj(prop,value) 返回层次结构中属性 prop 设置为 value 的所有对象。

h = findobj('-not',prop,value) 返回其指定属性未设置为指定值的所有对象。

h = findobj(prop1,value1,oper,prop2,value2) 将逻辑运算符 oper 应用于 prop,value 对组。例如,h = findobj('LineStyle','--','-and','Marker','o') 返回具有虚线线型和圆形标记的所有对象。

h = findobj('-regexp',prop,expr) 使用正则表达式来查找具有特定属性值的对象。函数返回属性值满足正则表达式的对象。

h = findobj('-property',prop) 返回具有指定属性的所有对象。

h = findobj(prop1,value1,...,propN,valueN) 返回层次结构中指定属性设置为指定值的所有对象。您可以用上述语法中的其他输入参数组合替换 prop,value 对组。

function rabbits(handle)
% RABBITS  Fibonacci's rabbit pen.
%   How fast does the population grow?
%   rabbits, with no arguments, initializes the simulation.
%   rabbits(handle) is the callback with each button click.

% Initialize with a blue bunny in the center of the figure.
% Clicking on a blue bunny turns it into a blue rabbit.
% Clicking on a blue rabbit creates a gray bunny and turns the rabbit gray.
% Clicking on a gray bunny or gray rabbit does nothing.
% When all the bunnies and rabbits are gray, count them and turn them all blue.

   % R = structure of rabbit images.
   % pos = history of positions.
   persistent R pos

   if nargin == 0
      % Initialize single blue bunny and uicontrols.
      init_graphics

   else
      % Process a button click.
      switch get(handle,'tag')
         case 'bluebunny'
            % A blue bunny turns into a gray rabbit.
            bluebunny(handle)
         case 'bluerabbit'
            % A blue rabbit creates a gray bunny and turns gray itself.
            bluerabbit(handle)
         case 'graybunny'
            % A gray bunny does nothing.
         case 'grayrabbit'
            % A gray rabbit does nothing.
      end

      % When all are gray, turn them all blue.
      update
      
   end

% ------------------------------

   function init_graphics
      clf reset
      shg

      R = load('rabbits.mat');
      R.graybunny = cat(3,R.bunny,R.bunny,R.bunny); 
      R.grayrabbit = cat(3,R.rabbit,R.rabbit,R.rabbit); 
      R.bluebunny = cat(3,R.bunny,R.bunny,255*ones(size(R.bunny),'uint8'));
      R.bluerabbit = cat(3,R.rabbit,R.rabbit,255*ones(size(R.rabbit),'uint8'));

      f = get(gcf,'position');
      p = .45*f(3:4);
      pos = p;

      % Single bunny
      uicontrol('style','pushbutton','position',[p 80 80], ...
         'background','white','cdata',R.bluebunny,'tag','bluebunny', ...
         'callback','rabbits(gcbo)');

      % Population counter
      uicontrol('style','text','fontsize',12,'fontweight','bold', ...
         'position',[f(3)/2-14 f(4)-40 28 28],'string','1')

      % Auto toggle
      uicontrol('style','toggle','position',[20 20 60 20], ...
         'string','auto','callback',@auto)
   end

% ------------------------------

   function bluebunny(handle)
      % A blue bunny turns into a gray rabbit.
      set(handle,'cdata',R.grayrabbit,'tag','grayrabbit', ...
         'callback','rabbits(gcbo)')
   end

% ------------------------------

   function bluerabbit(handle)
      % A blue rabbit creates a gray bunny and turns gray itself.
      p = find_good_position;
      uicontrol('style','pushbutton','position',[p 80 80], ...
         'background','white','cdata',R.graybunny,'tag','graybunny', ...
         'callback','rabbits(gcbo)');
      set(handle,'cdata',R.grayrabbit,'tag','grayrabbit', ...
         'callback','rabbits(gcbo)');
   end

% ------------------------------

   function p = find_good_position
      % Avoid toggle and population counter.
      f = get(gcf,'position');
      ds = -Inf;
      % Choose best of several random positions.
      for k = 1:20
         p = .80*f(3:4).*rand(1,2);
         % Avoid toggle in lower right hand corner.
         if p(1) < 80 && p(2) < 40
            continue
         end
         % Avoid population counter centered near the top.
         f = get(gcf,'pos');
         if (p(2)+80 > f(4)-40) && (p(1)+80 > f(3)/2-14) ...
            && (p(1) < f(3)/2+14)
            continue
         end
         r = p(ones(size(pos,1),1),:);
         d = min(min(abs(pos-r)'));
         if d > ds
            ds = d;
            ps = p;
         end
      end
      p = ps;
      pos = [pos; p];
   end

% ------------------------------

   function update
      % When all are gray, turn them all blue.
      b = findobj(gcf,'style','pushbutton');
      n = length(b);
      c = get(b,'tag');
      if n == 1
         c = {c};
      end
      % Check for all gray.
      if length(findstr([c{:}],'gray')) == n
         pause(1.0)
         for k = 1:n
            if findstr(c{k},'graybunny')
               set(b(k),'cdata',R.bluebunny,'tag','bluebunny', ...
                  'callback','rabbits(gcbo)')
            else
               set(b(k),'cdata',R.bluerabbit,'tag','bluerabbit', ...
                  'callback','rabbits(gcbo)');
            end
         end
         % Update population counter.
         set(findobj(gcf,'style','text'),'string',n)
      end
   end

% ------------------------------

   function auto(handle,~)
      % Auto toggle callback
      % Complete one month's growth
      set(handle,'enable','off')
      b = [findobj(gcf,'tag','bluebunny')
          findobj(gcf,'tag','bluerabbit')];
      n = length(b);
      b = b(randperm(n));
      for k = 1:n
          rabbits(b(k))
          pause(.1)
      end
      set(handle,'enable','on','value',0)
   end

end % rabbits

 斐波那契数列实现

function f = fibnum(n)
%FIBNUM  Fibonacci number.
%   FIBNUM(n) demonstrates recursion by generating the n-th Fibonacci number.
%   Warning: FIBNUM(50) takes a very long time.

if n <= 1
   f = 1;
else
   f = fibnum(n-1) + fibnum(n-2);
end
function f = fibonacci(n)
%FIBONACCI  Fibonacci sequence
%   f = FIBONACCI(n) generates the first n Fibonacci numbers.
f = zeros(n,1);
f(1) = 1;
f(2) = 2;
for k = 3:n
   f(k) = f(k-1) + f(k-2);
end

斐波那契数列和黄金分割率的关联


斐波那契的兔子并非每个月增加一杯,而是在前一个月的基础上乘以一个黄金分割比。

n=40
f=fibonacci(n)
r=f(2:n)./f(1:n-1)
phi=(1+sqrt(5))/2
r-phi
%得出来值为1.618

解析表达式


n=(1:40)';
f=(phi.^(n+1)-(1-phi).^(n-1))/(2*phi-1)
f = round(f)

练习


tic - 启动秒表计时器
    此 MATLAB 函数 与 toc 函数结合使用,可以测量经过的时间。tic 函数记录当前时间,toc
    函数使用记录的值计算经过的时间。

 toc - 从秒表读取已用时间
    此 MATLAB 函数 读取由调用 tic 函数启动秒表计时器以来经过的时间。MATLAB 读取执行 toc函数时的内部时间,并显示最近一次不带输出调用 tic 函数以来经过的时间。经过的时间以秒为单位表示。


奇偶性

clear
n=100
f=fibonacci(n)
for k = 1:n 
    if mod(f(k),2)==1
        fprintf('第%d个斐波那契数为奇数\n',k)
    elseif mod(f(k),2)==0
         fprintf('第%d个斐波那契数为偶数\n',k)
    end
end

质数

isprime - 确定哪些数组元素为质数
    此 MATLAB 函数 返回与 X 大小相同的逻辑数组。如果 X(i) 为质数,则 TF(i) 的值为
    true。否则,值为 false。

for k = 1:n 
    if isprime(f(k))== 1
        fprintf('第%d个斐波那契数质数\n',k)
    elseif isprime(f(k))==0
         fprintf('第%d个斐波那契数不是质数\n',k)
    end
end

求解方程

mldivide - 求解关于 x 的线性方程组 Ax = B
    此 MATLAB 函数 对线性方程组 A*x = B 求解。矩阵 A 和 B 必须具有相同的行数。如果 A
    未正确缩放或接近奇异值,MATLAB 将会显示警告信息,但还是会执行计算。

    x = A\B
    x = mldivide(A,B)

Matlab学习笔记(6.2)线性方程组求解 - 知乎

clear
syms c1 c2 phi;
eq1=c1+c2-1
eq2=c1*phi+c2*(1-phi)-1
syms x y;
[c1,c2]=solve(eq1,eq2,c1,c2)
phi=(1+sqrt(5))/2
A=[1 1; phi 1-phi]
B=[-1 -1]
x=A/B

对数绘图


semilogy(fibonacci(18),'-o')

  semilogy - 半对数图(y 轴有对数刻度)
    此 MATLAB 函数 在 x 轴上使用线性刻度、在 y 轴上使用以 10 为底的对数刻度来绘制 x 和y 坐标。 要绘制由线段连接的一组坐标,请将 X 和 Y 指定为相同长度的向量。 要在同一组坐标轴上绘制多组坐标,请将 X 或 Y 中的至少一个指定为矩阵。

%%
semilogy(fibonacci(18),'-o')
%自变量
a1 = 1 : 18;
%因变量
b1 = log(fibonacci(18));
xiuu  = polyfit(a1,b1,1);
k = xiuu(1)
b=xiuu(2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值