今天我们要“手算”斐波那契数列的任意位置的数字是什么,就是算出它的表达式,利用的方法是矩阵对角化。当然,虽然可以手算,因为涉及的只是2阶矩阵,但为了简便,还是利用程序求解。
首先,一个n阶矩阵可以对角化的前提是有n个线性无关的特征向量。假设A矩阵可对角化,即
其中各项的意义学过线性代数的都知道,不在此赘述。
现有一递归函数为
其中V代表一向量,上式也就是如下意思
在继续进行之前,首先明白一件事,那就是V0可以表示为A的各特征向量的线性组合。因为A是n阶方阵,并且A有n个线性无关的特征向量,所以对于SC=V0这个线性方程组,S矩阵的秩为n,并且S为方阵,所以对于任意V0,该方程组都有且只有唯一解,换句话说,任意V0都能表示为A的特征向量的线性组合。
联立以下各式
可得
对于斐波那契数列,序列中的一个数为前两个数之和,即0,1,1,2,3,5,8,,,,,,
我们设第k个数字是Nk,很容易看出,斐波那契数列满足下列等式
即
接下来要做的只有两件事,1,解出A的特征值和特征向量,2,将V0用A的特征向量线性表示出来,然后就能根据之前推出的公式写出斐波那契数列的表达式了,接下来的几步交给程序去做。
a=2; %要计算的范围
b=10;
A=[1,1;1,0];
[S,D]=eig(A); %求A的特征值对角阵D和特征向量矩阵S
C=S\[1;0]; %求SC=V0的C矩阵
myF=ones(size(a:b)); %初始化一个适当大小的全一矩阵,用于存储
for i=a:b
Vk=S*(D^i)*C; %用推出的公式算出需要范围的斐波那契数,并存入myF矩阵
myF(i-(a-1))=Vk(2);
end
plot([a:b],myF); %画出图像
以下为计算的结果
可以看出这就是正确的斐波那契数列
你可能觉得这个方法一般,这些数口算也能算,那要是算第100个数、第10000个数呢,对这个程序只需改改数值就行了。
我们用tic toc来测试一下算到第100个数,和第10000个数的用时。
首先是100个数
然后是10000个数
计算10000个数比100个数只是多用了0.02878,秒,但如果口算呢???
最后,我们还可以用斐波那契数列得出黄金比例。如下
黄金比例是斐波那契数列的后一个数比前一个数。我们用刚刚算出来的10000个数求一下黄金比例
mysize=size(myF);
G=ones(size(1,mysize(2)-1));
for i=1:(mysize(2)-1)
G(i)=myF(i+1)/myF(i); %代入公式
end
plot(G);
以下为结果
可以看出,越往后越趋于黄金比例,图像如下
其实用不了10000个数,后边就已经是一条直线了。
1.618,记住,这是我们亲自算出来的噢!
以上这种计算递归函数的方法是我看网课学到的,MIT线性代数,有兴趣也可以看看。