龙听期货论坛's Archiver

C
+
+


 微信: QQ:

龙听 发表于 2021-10-15 09:59

斐波那契数列(Fibonacci sequence)研究

斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

[b]定义[/b]

斐波那契数列指的是这样一个数列:[attach]29078[/attach]

这个数列从第3项开始,每一项都等于前两项之和。
斐波那契数列的定义者,是意大利数学家莱昂纳多·斐波那契(Leonardo Fibonacci),生于公元1170年,卒于1250年,籍贯是比萨。他被人称作“比萨的莱昂纳多”。1202年,他撰写了《算盘全书》(Liber Abacci)一书。他是第一个研究了印度和阿拉伯数学理论的欧洲人。他的父亲被比萨的一家商业团体聘任为外交领事,派驻地点于阿尔及利亚地区,莱昂纳多因此得以在一个阿拉伯老师的指导下研究数学。他还曾在埃及、叙利亚、希腊、西西里和普罗旺斯等地研究数学。另外斐波纳契还在计算机C语言程序题中应用广泛

[b]通项公式[/b]

[b]递推公式[/b]

斐波那契数列:[attach]29078[/attach]

[attach]29079[/attach]

显然这是一个线性递推数列。

通项公式

⑴.[attach]29080[/attach]

(如上,又称为“比内公式”,是用无理数表示有理数的一个范例。)

注:此时[attach]29081[/attach]

⑵ an=[(2/√5+1)-1/(√5+1/2)ⁿ]/√5

通项公式推导

[b]方法一:利用特征方程(线性代数解法)[/b]

线性递推数列的特征方程为:

[attach]29082[/attach]

[b]方法二:待定系数法构造等比数列1(初等代数解法)[/b]

[attach]29083[/attach]

[b]方法三:待定系数法构造等比数列(初等代数解法)[/b]

[attach]29084[/attach]

方法四:母函数法。

[attach]29085[/attach]

龙听 发表于 2021-10-15 10:05

[b]与黄金分割的关系[/b]

有趣的是,这样一个完全是自然数的数列,通项公式却是用无理数来表达的。而且当趋向于无穷大时,前一项与后一项的比值越来越逼近黄金分割0.618(或者说后一项与前一项的比值小数部分越来越逼近 0.618)。

[attach]29086[/attach]

[b]证明[/b]

[attach]29087[/attach]

所以极限是黄金分割比。

[b]特性[/b]

[b]平方与前后项[/b]

从第二项开始(构成一个新数列,第一项为1,第二项为2,……),每个偶数项的平方都比前后两项之积多1,每个奇数项的平方都比前后两项之积少1。

如:第二项 1 的平方比它的前一项 1 和它的后一项 2 的积 2 少 1,第三项 2 的平方比它的前一项 1 和它的后一项 3 的积 3 多 1。

(注:奇数项和偶数项是指项数的奇偶,而并不是指数列的数字本身的奇偶,比如从数列第二项 1 开始数,第 4 项 5 是奇数,但它是偶数项,如果认为 5 是奇数项,那就误解题意,怎么都说不通)

[attach]29088[/attach]

[b]与集合子集[/b]

斐波那契数列的第n+2项同时也代表了集合[attach]29089[/attach]中所有不包含相邻正整数的子集个数。

[attach]29090[/attach]

龙听 发表于 2021-10-15 10:19

[b]应用[/b]

[b]黄金分割[/b]

随着数列项数的增加,前一项与后一项之比越来越逼近黄金分割的数值 0.6180339887..…

[b]杨辉三角[/b]

将杨辉三角左对齐,成图1所示排列,将同一斜行的数加起来,即得一数列 1、1、2、3、5、8、……

[attach]29091[/attach]

公式表示如下:

[attach]29092[/attach]

[b]矩形面积[/b]

斐波那契数列与矩形面积的生成相关,由此可以导出一个斐波那契数列的一个性质。

[attach]29094[/attach]

斐波那契数列前几项的平方和可以看做不同大小的正方形,由于斐波那契的递推公式,它们可以拼成一个大的矩形。这样所有小正方形的面积之和等于大矩形的面积。则可以得到如下的恒等式:

[attach]29093[/attach]

[b]质数数量[/b]

斐波那契数列的整除性与质数生成性
[attach]29095[/attach]
每3个连续的数中有且只有一个被 2 整除,
每4个连续的数中有且只有一个被 3 整除,
每5个连续的数中有且只有一个被 5 整除,
每6个连续的数中有且只有一个被 8 整除,
每7个连续的数中有且只有一个被 13 整除,
每8个连续的数中有且只有一个被 21 整除,
每9个连续的数中有且只有一个被 34 整除,
.......
我们看到第5、7、11、13、17、23位分别是质数:5,13,89,233,1597,28657(第19位不是)

斐波那契数列的质数无限多吗?

[b]尾数循环[/b]

斐波那契数列的个位数:一个60步的循环

11235,83145,94370,77415,61785,38190,
99875,27965,16730,33695,49325,72910…

进一步,斐波那契数列的最后两位数是一个300步的循环,最后三位数是一个1500步的循环,最后四位数是一个15000步的循环,最后五位数是一个150000步的循环。

[b]自然界中“巧合”[/b]

斐波那契数列在自然科学的其他分支,有许多应用。例如,树木的生长,由于新生的枝条,往往需要一段“休息”时间,供自身生长,而后才能萌发新枝。所以,一株树苗在一段间隔,例如一年,以后长出一条新枝;第二年新枝“休息”,老枝依旧萌发;此后,老枝与“休息”过一年的枝同时萌发,当年生的新枝则次年“休息”。这样,一株树木各个年份的枝桠数,便构成斐波那契数列。这个规律,就是生物学上著名的“鲁德维格定律”。
[attach]29096[/attach]
另外,观察延龄草、野玫瑰、南美血根草、大波斯菊、金凤花、耧斗菜、百合花、蝴蝶花的花瓣,可以发现它们花瓣数目具有斐波那契数:3、5、8、13、21……

其中百合花花瓣数目为 3,梅花 5 瓣,飞燕草 8 瓣,万寿菊 13 瓣,向日葵 21 或 34 瓣,雏菊有 34、55 和 89 三个数目的花瓣。

斐波那契螺旋:具有 13 条顺时针旋转和 21 条逆时针旋转的螺旋的蓟的头部

这些植物懂得斐波那契数列吗?应该并非如此,它们只是按照自然的规律才进化成这样。这似乎是植物排列种子的“优化方式”,它能使所有种子具有差不多的大小却又疏密得当,不至于在圆心处挤了太多的种子而在圆周处却又稀稀拉拉。叶子的生长方式也是如此,对于许多植物来说,每片叶子从中轴附近生长出来,为了在生长的过程中一直都能最佳地利用空间(要考虑到叶子是一片一片逐渐地生长出来,而不是一下子同时出现的),每片叶子和前一片叶子之间的角度应该是 222.5°,这个角度称为“黄金角度”,因为它和整个圆周 360° 之比是黄金分割数0.618033989……的倒数,而这种生长方式就决定了斐波那契螺旋的产生。向日葵的种子排列形成的斐波那契螺旋有时能达到 89,甚至 144 条。1992 年,两位法国科学家通过对花瓣形成过程的计算机仿真实验,证实了在系统保持最低能量的状态下,花朵会以斐波那契数列长出花瓣。

[b]数字谜题[/b]

三角形的三边关系定理和斐波那契数列的一个联系:

现有长为 144 cm 的铁丝,要截成n小段(n>2),每段的长度不小于 1 cm,如果其中任意三小段都不能拼成三角形,则n的最大值为多少?

分析:由于形成三角形的充要条件是任何两边之和大于第三边,因此不构成三角形的条件就是存在两边之和不超过另一边。截成的铁丝最小为 1,因此可以放 2 个 1,第三条线段就是 2(为了使得n最大,因此要使剩下来的铁丝尽可能长,因此每一条线段总是前面的相邻2段之和),依次为:1、1、2、3、5、8、13、21、34、55,以上各数之和为 143,与 144 相差 1,因此可以取最后一段为 56,这时 n 达到最大为 10。

我们看到,“每段的长度不小于 1”这个条件起了控制全局的作用,正是这个最小数1 产生了斐波那契数列,如果把 1 换成其他数,递推关系保留了,但这个数列消失了。这里,三角形的三边关系定理和斐波那契数列发生了一个联系。

在这个问题中,144>143,这个143是斐波那契数列的前项和,我们是把144超出143的部分加到最后的一个数上去,如果加到其他数上,就有3条线段可以构成三角形了。

影视作品中的斐波那契数列

斐波那契数列在欧美可谓是尽人皆知,于是在电影这种通俗艺术中也时常出现,比如在风靡一时的《达芬奇密码》里它就作为一个重要的符号和情节线索出现,在《魔法玩具城》里又是在店主招聘会计时随口问的问题。可见此数列就像黄金分割一样流行。可是虽说叫得上名,多数人也就背过前几个数,并没有深入理解研究。在电视剧中也出现斐波那契数列,比如:日剧《考试之神》第五回,义嗣做全国模拟考试题中的最后一道数学题~在FOX 热播美剧《Fringe》中更是无数次引用,甚至作为全剧宣传海报的设计元素之一。

龙听 发表于 2021-10-15 10:28

[b]斐波那契弧线[/b]

斐波那契弧线,也称为斐波那契扇形线。第一,此趋势线以二个端点为准而画出,例如,最低点反向到最高点线上的两个点。然后通过第二点画出一条“无形的(看不见的)”垂直线。然后,从第一个点画出第三条趋势线:38.2%, 50%和61.8%的无形垂直线交叉。

斐波纳契弧线,是潜在的支持点和阻力点水平价格。斐波纳契弧线和斐波纳契扇形线常常在图表里同时绘画出。支持点和阻力点就是由这些线的交汇点得出。

要注意的是弧线的交叉点和价格曲线会根据图表数值范围而改变,因为弧线是圆周的一部分,它的形成总是一样的。

[attach]29097[/attach]

质数

斐波那契质数由斐波那契序列中的质数组成,是整数质数序列。

第一组质数序列是:2,3,5,13,89,233,1597,28657,514229,433494437,2971215073……

[b]C#代码实现[/b][code]
public static int GetiNum(int i) {
    long preVal = 1;
    long prePreVal = 0;
    if (n < 2)
        return n;
    long loop = 1;
    long returnVal = 0;
    while (loop < n) {
        returnVal = preVal + prePreVal;
        prePreVal = preVal;
        preVal = returnVal;
        loop++;
    }
    return returnVal;
}
[/code][b]Java代码实现[/b][code]
//①==================================
/**
* 平推方法实现
*/
public static long fibLoop(int num) {
    if(num < 1 || num > 92)
        return 0;
    long a = 1;
    long b = 1;
    long temp;
    for(int i = 2; i < num; i++) {
        temp = a;
        a = b;
        b += temp;
    }
    return b;
}

//②==================================
/**
* 递归方法实现
* f(n) = f(n - 1) + f(n - 2)
* 最高支持 n = 92 ,否则超出 Long.MAX_VALUE
* @param num n
* @return f(n)
*/
public static long fibRec(int num) {
    if(num < 1)
        return 0;
    if(num < 3)
        return 1;
    return fibRec(num - 1) + fibRec(num - 2);
}

//③==================================
static long[] l = new long[93];
static {
    l[1] = 1;
}
/**
* 带有缓存的方法,比fibRec方法性能好很多
*/
public static long fibBuffRec(int num) {
    if(num < 1 || num > 92)
        return 0;
    if(l[num] == 0)
        l[num] = fibBuffRec(num - 1) + fibBuffRec(num - 2);
    return l[num];
}

//④==================================
static List<BigDecimal> list = new ArrayList<BigDecimal>(93);
static {
    list.add(BigDecimal.ZERO);
    list.add(BigDecimal.ONE);
}
/**
* 1,2,3,4,5,6, 7 ,8
* 1,1,2,3,5,8,13,21
* 支持num超过92的超大型数字,使用了ArrayList进行缓存以提高性能
*/
public static BigDecimal fibBig(int num) {
    if(num < 0)
        return list.get(0);
    if (list.size() <= num)
        list.add(fibBig(num - 1).add(fibBig(num - 2)));
    return list.get(num);
}
[/code][b]Javascript代码实现[/b][code]
//循环算法
function f(n){
  if(n == 0){
    return 0;
  }else if(n ==1){
  return 1;
  }else{
    var fn1 = 0;
    var fn2 = 1;
    var fnx = 0;
    for(var i=0;i<n-1; i++){
      var newfn1 = fn2;
      fnx = fn1 + fn2;
      fn1 = fn2;
      fn2 = fnx;
  }
    return fnx;
  }
}
//===============================
//递归算法
function fib(count) {
//参数判断
    var count = parseInt(count);
     if (isNaN(count) || count <= 0) {
         return 0;
    }
    function f(count) {
        if (count <= 2) {
            return 1;
         }
         return f(count - 1) + f(count - 2);
     }
        return f(count);
}[/code][b]C++代码实现
[/b]
基本循环算法[code]
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a=0,b=0,c=1,n;
    cin>>n;//输入n
    for(int i=1;i<=n-1;i++)
    {
        a=b;
        b=c;
        c=a+b;
    }
    cout<<c;//输出最终结果
    return 0;
}[/code]数组算法实现[code]
#include<iostream>
using namespace std;
int main()
{
    int a[30],i,n;
    cin>>n;
    a[1]=a[0]=1;
    for(i=2;i<n;i++)
    {
        a[i]=a[i-2]+a[i-1];
    }
    cout<<a[n-1];
    return 0;
}[/code]递归算法实现[code]
#include<iostream>
using namespace std;
int f(int n)
{
    return (n<3)? 1 : f(n-1)+f(n-2);//如果是前两项,则输出1
}
int main()
{
    int n;
    cin>>n;
    cout<<f(n);
    return 0;
}
[/code]递归算法优化[code]
# include <bits/stdc++.h>
const int MAX=101;
using namespace std;
int a[MAX];
int f(int n)
{
    if(a[n]!=-1) return a[n];
    else
{
        a[n]=f(n-1)+f(n-2);
        return a[n];
    }
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<=MAX-1;i++)
    {//初始化
        a[i]=-1;
    }
    a[0]=0;a[1]=1;
    cout<<f(n);
    return 0;
}[/code]高精度计算[code]
#include <bits/stdc++.h>
using namespace std;
char sum[1200];
int s=0,m=0,n;
int main()
{
    cin>>n;
    string s1,s2;
    int a[1200],b[1200];
    int he,i;
    s1="0";
    s2="1";
    for(m=2;m<n+1;m++)
    {
        memset(a,0,sizeof a);
        memset(b,0,sizeof b);
        a[0]=s1.length();
        for(i=1;i<=a[0];i++)
        {
            a[i]=s1[a[0]-i]-'0';
        }
        b[0]=s2.length();
        for(i=1;i<=b[0];i++)
        {
            b[i]=s2[b[0]-i]-'0';
        }
        he=(a[0]>b[0]?a[0]:b[0]);
        for(i=1;i<=he;i++)
        {
            a[i]+=b[i];
            a[i+1]+=a[i]/10;
            a[i]%=10;
        }
        he++;
        while((a[he]==0)&&(he>1))
        he--;
            for(i=he,s=0;i>=1;i--,s++)
            {
                sum[s]=a[i]+'0';
            }
        s1=s2;
        s2=sum;
    }
    cout<<s2<<endl;
    return 0;
}
[/code][b]Python3代码实现[/b]

#输出在3000以内的斐波那契数列

一、从最大值考虑[code]
numMax = int(input('please input  a maxnumber : '))


def flibsOne(numMax):   
     
    c = []   
     
    a, b = 0, 1   
     
    while a < numMax:
         
        a, b = b, a + b        
         
        c.append(a)   
     
    c.remove(c[-1])   
     
    print(c)[/code]二、从位数考虑[code]
num = int(input('please input  a number : '))

def flibsTwo(num):   
     
    list1 = []   
     
    for i in range(num):        
            if i <=1:
                list1.append(1)
            else:   
                list1.append(list1[-2] + list1[-1])
    return list1   

print(flibsTwo(num)) #输出num位数列[/code]第三种,根据f(n)= f(n-1)+f(n-2)实现[code]
Fbs = [1,1]#斐波那契数列前两位
n = 3
s = input("Maxmun ")#输入最大次数
while n != (int(s)+1) :#因为差一原则所以要再加一
    a = Fbs[-1]
    b = Fbs[-2]
    fb = a+b
    print(str(n)+" "+str(fb))
    n = n +1
    Fbs.append(fb)
[/code][b]php代码实现[/b][code]
  $n = 输入值;
    if ($n >= 3) {
        $x = 1;$y = 1;$n = $n - 2;
        do {
            $fs   = $x + $y;
            $x    = $y;
            $y    = $fs;
            echo $fs.',';
            $n--;
        } while ($n > 0);
}
[/code][b]Rust代码实现[/b][code]
// Rust代码实现

fn main() {
  println!("{} {} {} {} {}", fib(0), fib(1), fib(2), fib(3), fib(4));
}

fn fib(d: i32) -> i32 {
  if d == 0 || d == 1 {
    d
  } else {
    ficc(d - 2) + ficc(d - 1)
  }
}[/code]

龙听 发表于 2021-10-15 11:05

[b]论坛上面相关的贴子:[/b]

[MC源码] ZigZag Fibonacci Plus 指标【主图指标】:[url]http://www.qhlt.cn/thread-67029-1-1.html[/url]

[TS源码] The V-Trade, Part 3:Fibonacci Projections And Daily Pivots源码:[url]http://www.qhlt.cn/thread-23563-1-1.html[/url]

[TS源码] 欧美期货量化策略推荐系列之trading system for FUTURES that uses the Fibonacci number "13:[url]http://www.qhlt.cn/thread-62186-1-1.html[/url]

斐波那契(Leonardo Pisano ,Fibonacci, Leonardo Bigollo,1175年-1250年):[url]http://www.qhlt.cn/thread-115501-1-1.html[/url]

页: [1]