By Z.H. Fu
https://fuzihaofzh.github.io/blog/
这是之前的一篇文章,方法是某天中午睡觉的时候突然梦到的。今天把它搬运过来。
利用线性代数的方法求斐波那契数列的通项
程序员们一定知道斐波那契数列的故事斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、34…… 这个数列从第三项开始,每一项都等于前两项之和。以前高中竞赛的时候或许人学习过特征方程来解这个问题,但当时也仅仅是会这种方法,到底是什么原理,还必须从线代的角度上来解释。
我们先来讲讲线性变换的概念怎么用于斐波那契数列。数列一项一项往前递推,就好像线性变换一次又一次地作用到一个向量上,那么作用n次后得到的向量中的某一项,就对应于数列的某一项。我们来看看具体的例子。对于斐波那契数列,我们有 an=an−1+an−2 那么可以用矩阵的形式来表示这个变换:
我们首先通过前几项来找到变换矩阵A
[a2a3]=[????][a1a2]
很明显,通过通项之间的关系可以看出:
A=[0111]
令xn=[anan+1],那么我们根据这个递推关系,很容易得出:
xn=An−1x1
于是,求数列通项的问题就转化成了求矩阵An−1的问题。这个问题很容易用特征值的方法来求。求得A的特征值为:21+5,21−5,他们对应的特征向量为(2−1+5,1)和(2−1−5,1),因此,A有相似对角型D
D=[λ100λ2]=[21+50021−5]
而存在变换矩阵P使得A=PDP−1,而P由A的特征向量组成:
P=[v1v2]=[2−1+512−1−51]
将向量x1向特征向量上分解得x1=C1v1+C2v2
而向量(C1,C2)恰好是向量x1在特征向量张成的空间中的坐标,因此
[C1C2]=P−1x1=[105+35105−35]
而我们知道,线性变换作用在特征向量上,相当于特征向量乘以对应的特征值。因此,我们有:
xn=An−1x1=C1An−1v1+C2An−1v2=C1λ1n−1v1+C2λ2n−1=105+35(21+5)n−1[2−1+51]+105−35(21−5)n−1[2−1−51]
而xn的第一个分量就是an
an=105+5(21+5)n−1+105−5(21−5)n−1
用mathematica验证一下,结果正确!