试验一 斐波那契数列一、 实验目的与要求1.认识Fibonacci 数列,体验发现其通项公式的过程;2.了解matlab 软件中进行数据显示与数据拟合的方式;3.掌握matlab 软件中plot, polyfit 等函数的基本用法;4.提高对数据进行分析与处理的能力。
二、 问题描述某人养了一对兔,一个月后生育了一对小兔。
假设小兔一个月后就可以长大成熟,而每对成熟的兔每月都将生育一对小兔,且兔子不会死亡。
问:一年后共有多少对兔子?三、 问题分析这个问题,最早由意大利数学家斐波那契(Fibonacci),于1202年在其著作《珠算原理》中提出。
根据问题的假设,兔子的总数目是如下数列: 1,1,2,3,5,8,13,21,34,55,89,144,233,…问题的答案就是此数列的第12项,即一年后共有144对兔子。
这个数列通常被称为斐波那契(Fibonacci)数列,研究这个问题就是研究Fibonacci 数列。
把这个问题作更深入的研究,我们会问:第n 个月后,总共有多少对兔子?即Fibonacci 数列的第n 项是多少?这就需要我们探素Fibonacci 数列的通项公式。
根据问题的描述,我们知道第n+2个月后兔子的对数,等于第n+1个月后兔子的对数(表示原来就有的老兔子对数),加上第n 个月后兔子的对数(表示生育出来的新兔子对数)。
这样就得到关于Fibonacci 数列的一个递推公式:21n n n F F F ++=+利用matlab 软件的数据可视化功能将这些数据显示成平面曲线的形式后,我们可以观察到Fibonacci 数列的变化规律;通过matlab 软件的数据拟合功能,我们可以大概知道Fibonacci 数列的函数关系式,结合上面的递推公式,就可以推导出来Fibonacci 数列的通项公式。
四、 背景知识介绍1. 数据的可视化。
将离散的数据:1234,,,,,,n F F F F F ,看成平面坐标系里的点:1234(1,),(2,),(3,),(4,),,(,),n F F F F n F ,利用matlab 软件的plot 函数在平面坐标系里划出一个点列,就可以实现离散数据的可视化。
plot 函数的基本使用格式为:plot(y),其中参数y 表示竖坐标,即需要显示的数据。
例1 y=1:20;y=y.^3;plot(y)2. 数据的拟合。
数据拟合就是寻找一个目标函数,作为被拟合数据的近似函数关系。
目标函数的类型,可以是多项式、指数函数等。
作数据拟合,首先需要估计目标函数的类型,这一点可以通过数据可视化来观察得到,而一阶多项式是最常见的目标函数,此时称为线性回归。
确定拟合系数的原则是最小二乘法,即所有误差的平方和取最小值。
在matlab 软件中以多项式为目标函数作数据拟合的函数是polyfit ,它的基本使用格式为:polyfit (x,y,n)。
其中(x,y)是被拟合的数据,即平面上的一个点列,而n 是事先确定的多项式的阶数。
例2 x=[1,3,4,5,6,7,8,9,10];y=[10,5,4,2,1,1,2,3,4]; polyfit (x,y,2)结果:20.2676t - 3.6053t + 13.45973. 数列的通项公式。
寻找一个整标函数,使得它在n 处的函数值,等于数列的第n 项的值,这个函数就是数列的通项公式。
4. 黄金分割。
把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比(如下图)。
其比值是一个无理数1)2-÷,取其前三位数字的近似值是0.618。
由于按此比例设计的造型十分协调美观,因此称之为黄金分割。
五、 实验过程本试验将Fibonacci 数列的有限项,看成是待处理的数据。
首先利用matlab 软件的可视化功能,将这些数据显示在平面坐标系中,观察其图形类似什么曲线,结论是:指数函数的曲线。
进一步,利用指数函数与对数函数的互逆关系,将原有数据取对数,再观察其曲线形状是否类似直线,以验证原来的观察是否正确。
通过观察到的目标函数,然后利用matlab 软件的数据拟合功能,得到Fibonacci 数列通项公式的近似关系。
最后,从近似关系出发,推导出来Fibonacci 数列的通项公式。
1. 观察数据的大概函数关系。
为了研究Fibonacci 数列的变化规律,我们取此数列的前30项来观察。
利用Matlab 软件的数据可视化功能,将这些数据显示在平面坐标系中,观察其中蕴涵的函数关系。
具体的实现流程为:(1)定义数组fn ;(2)显示数组fn 。
具体的代码如下:function plotfibo(n) %定义函数显示Fibonacci 数列前n 项fn=[1,1]; %将数列的前两项放到数组fn 中for i=3:n %fn 的第3项到第n 项AM:AB=MB:AMfn=[fn,fn(i-2)+fn(i-1)]; %将第i项添加到数组fn中end %循环结束plot(fn) %将装有数列前n项的数组显示出来这个函数的调用方式是:plotfibo(30),显示出来的图像为图1,经观察,觉得曲线的形状象指数函数的曲线,其数据无限增大。
可以改变参数n的值,反复观察。
图1 n=30 图2 n=50图3 n=500 图4 n=10002.进一步验证上一步得到的结论。
经过上一步的观察,觉得这些数据应该是指数函数的形式。
为了进一步验证这个结论是否正确,可以利用指数函数与对数函数的互逆关系。
如果这些数据确实是指数函数的形式,则经过取对数后应该是一个线性关系,即一阶多项式,从图形上看应该象一条直线。
因此,再利用Matlab软件的数据可视化功能,将这些数据取对数后显示在平面坐标系中,观察它是否象一条直线。
具体的实现流程为:(1)定义数组fn;(2)数组fn取对数;(3)显示数组fn。
具体的代码如下:function plotlnfibo(n) %显示取对数后的前n项fn=[1,1]; %将数列的前两项放到数组fn中for i=3:n %fn的第3项到第n项fn=[fn,fn(i-2)+fn(i-1)]; %将第i项添加到数组fn中end %循环结束fn=log(fn) %将原来的数据取对数plot(fn) %将装有数列前n 项的数组显示出来这个函数的调用方式是:plotlnfibo(30),显示出来的图像为图5,经观察,觉得它确实象一条直线。
可以改变参数n 的值,反复观察。
图5 n=30 图6 n=50图7 n=500 图8 n=10003. 获得数据的近似关系式。
经过以上第一步的观察,确定Fibonacci 数列的数据是指数函数的关系,第二步验证了第一步得到的结论,因此我们认为Fibonacci 数列的数据关系就是指数函数,取对数后就是线性函数,即一阶多项式。
利用Matlab 软件的数据拟合功能,通过取对数后的数据,用一阶多项式拟合出它的函数关系式,可以得到Fibonacci 数列通项公式的一个近似表达式。
具体的实现流程为:(1)定义数组fn ;(2)数组fn 取对数;(3)用一阶多项式拟合数组fn 。
具体的代码如下:function fitlnfibo(n) %根据取对数后的数据,拟合出线性表达式fn=[1,1]; %将数列的前两项放到数组fn 中for i=3:n %fn 的第3项到第n 项fn=[fn,fn(i-2)+fn(i-1)]; %将第i 项添加到数组fn 中end %循环结束xn=1:n; %定义横坐标fn=log(fn) %将原来的数据取对数polyfit(xn,fn,1) %拟合装有数列前n项的数组这个函数的调用方式是:fitlnfibo(30),运行后返回结果是:0.4799,-0.7768。
这两个数据就是一阶多项式的系数,即:F≈-log()0.7768+0.4799nn为了提高精度,可以加大n的值。
取n=1000时得到:F≈-log()0.8039+0.4812nn从上面的表达式,可以得到数列通项公式的近似:nF≈⨯0.4476 1.6180n4.观察拟合数据与原始数据的吻合程度。
经过第三步的拟合,得到了Fibonacci数列近似的通项公式,为了观察其吻合程度,我们将Fibonacci数列的拟合数据与原始数据的图形显示出来,进行对比观察。
具体的实现流程为:(1)定义数组fn1,fn2;(2)显示数组fn1,fn2。
具体的代码如下:function plotfibo2(n) %显示拟合数据与原始数据的前n项fn1=[]; %装拟合数据的数组for i=1:n %fn1的第1项到第n项fn1=[fn1,0.4476*1.618^i]; %将第i项添加到数组fn1中endfn2=[1,1]; %装原始数据的数组,前两项放到数组fn2中for i=3:n %fn2的第3项到第n项fn2=[fn2,fn2(i-2)+fn2(i-1)]; %将第i项添加到数组fn2中endx=1:n;plot(x,fn1,x,fn2,'r*') %显示, fn1―兰线,fn2-红星这个函数的调用方式是:fitlnfibo2(20),显示出来的图像为图9,或fitlnfibo2(50),显示出来的图像为图10。
图9 n=20 图10 n=505. 推导Fibonacci 数列的通项公式(1)。
通过以上的观察和分析,我们知道Fibonacci 数列的数据大概是指数函数的关系。
因此,我们猜测它的通项公式具有形式:n n F k r =⨯。
将这个表达式代入递推公式21n n n F F F ++=+中,得到:21n n n k r k r k r ++⨯=⨯+⨯。
经过简化得到:21r r =+这是一个一元二次的代数方程,其两个根形式如下:(12r =±÷考虑到Fibonacci 数列的数据无限增大,我们取(12r =+÷,于是得到通项公式如下:[(12]n n F k =⨯+÷上面的公式对吗?我们可以来验证。
取n=1和n=2代入上面的公式中计算,显然得不到121,1F F ==,因此它不是Fibonacci 数列的通项公式。
但这个公式并非一无是处,我们可以来考虑这个公式与Fibonacci 数列到底相差多少。
因此,我们引入以下一个数列:[(12]n n n T F k =-⨯+÷可以验证,这个新的数列也满足同样的递推公式:21n n n T T T ++=+,因此我们猜测它同样是指数函数的形式,可以假设其表达式为:n n T r λ=⨯,代入递推公式后,同样可以得到:21r r =+。
这里的r 显然不同于上面的r ,故这个r 取值为:(12r =-÷,从而得到:[(12]n T λ=⨯÷。