斐波那契数列:python实现和可视化
1 说明
====
1.1 斐波那契数列的介绍 。
1.2 斐波那契数列是上帝的指纹 , 大自然中随处可见 , 目前广泛应用到黄金分割线的布局美和股市等预测等等 。
1.3 斐波那契数列的python的matplotlib和turtle的可视化 。
1.4 本文为整理后的资料 , 小白易懂 , 适合收藏 。
文章插图
斐波那契 - 意大利数学家-1175年-1250年;图片来自网络 , 如有侵权请联系 , 定删
2 斐波那契数列
===========
2.1 斐波那契数列(Fibonacci sequence) , 又称黄金分割数列 。
2.2 因他以兔子繁殖为例子而引入 , 故又称为“兔子数列” 。
2.3 数列为:1、1、2、3、5、 8、12、21、34、55、89、144......
2.4 数列中的数为斐波那契数 。
2.5 斐波那契数列是上帝的指纹 , 是一切自然纹理的规律线 , 文末有图 。
3 先看看python的可视化效果图
=======================
3.1 图1
文章插图
500以内的斐波那契数
3.2 图2:
文章插图
3.3 图3
文章插图
文章插图
3.4 图4
文章插图
文章插图
3.5 图5
文章插图
4 图片的代码
==========
4.1 图1的代码:
import matplotlib.pyplot as plt#定一个空列表 , 存放斐波那契数列的数#作为可视化y坐标轴值y_data=http://kandian.youth.cn/index/[]#数列产生def fib(n):a=0b=1while a<=n:#将产生的数列的数添加到列表中y_data.append(a)a,b=b,a+b#自定义输入自然整数范围n=int(input('请输入非0任意整数: , 推荐500:'))#调出函数产生数列fib(n)#定义x坐标轴数列个数序号x_data=http://kandian.youth.cn/index/[i for i in range(len(y_data))]#标题名plt.title('该数列的个数:'+str(len(y_data))) #作图plt.plot(x_data,y_data,'r',marker='o')#数值标注for xy in zip(x_data, y_data):plt.annotate("(%s,%s)" % xy, xy=xy, xytext=(-20, 10), textcoords='offset points')#图片展示plt.show()
4.2 图2代码
#参考文章:#导出模块import numpy as npimport matplotlib.pyplot as plt#定义数列产生的函数def fibo(n):if n == 0:fibo_list = np.array([0])#修改源代码bugelif n == 1:fibo_list = np.array([0,1])else:f_0, f_1 = 0, 1fibo_list = np.array([f_0,f_1])for i in np.arange(n-2):fibo_num = f_0 + f_1fibo_list = np.append(fibo_list,fibo_num)f_0, f_1 = f_1, fibo_numreturn fibo_list#定义划线函数 , 由列表找到xy坐标def find_o_xy(f_list):#起始圆心坐标x_n, y_n = 0, 0o_x_array, o_y_array = np.array([x_n]), np.array([y_n])for n in np.arange(1,len(f_list)):#需要注意pyhton中计数是从0开始#第一项作为起始点已经给出y_n=y_n+np.mod(n+1,2)*f_list[n]*(-1)**(1+(np.mod(n+1,2)+n+1)/2)x_n=x_n+np.mod(n,2)*f_list[n]*(-1)**(1+(np.mod(n+1,2)+n+1)/2)#横纵坐标(x,y)o_x_array = np.append(o_x_array, x_n)o_y_array = np.append(o_y_array, y_n)return o_x_array, o_y_array#画圆弧设置#以下绘图以n=7为例count = 7f_list = fibo(count)x0_array,y0_array = find_o_xy(f_list)#各个正方形对应的边长,如例图半径从1,2...开始f_list_r = fibo(count+2)[2::]#画出各个正方形内的1/4圆start_angle, end_angle = np.pi, 1.5*np.pifor n in np.arange(len(f_list)):t=np.arange(start_angle,end_angle,0.001)circle_x = (f_list_r[n])*(np.sin(t))+x0_array[n]circle_y = (f_list_r[n])*(np.cos(t))+y0_array[n]start_angle += 0.5*np.piend_angle += 0.5*np.pi#画圆弧形plt.plot(circle_x,circle_y,color='r')#标题plt.title('斐波那契数列螺旋线')#图片展示plt.show()
4.3 图3代码
#导入模块fromturtle import *#输入自定义数列的个数amount=int(input("请输入斐波那契数列的而个数 , 推荐15:"))#数列产生a1=0a2=1tem_he=0shulie=[]for i in range(1,amount):#终端输出数列的数值print(a1,end=',')tem_he=a1+a2a1=a2a2=tem_he#数列添加数值shulie.append(tem_he)#turtle画图 for i in range(1,amount-1):for n in range(4):forward(shulie[i])left(90)#画圆circle(shulie[i],90)#输出数列数值write(shulie[i],font=("微软雅黑",i*2))mainloop()
4.4 图4代码
# encoding:utf-8#参考文章#;spm=1001.2101.3001.4242import turtlefrom random import randomdef draw_square(r):t.fillcolor(random(), random(), random())t.begin_fill()for _ in range(4):t.fd(r)t.left(90)# 填充关键点,正方形填充一半就结束,然后立即开始圆形填充if _ == 1:t.end_fill()t.fillcolor(random(), random(), random())t.begin_fill()t.circle(r, 90)t.end_fill()returnif __name__ == '__main__':t = turtle.Turtle()t.hideturtle()t.up()t.goto(-130, 50)t.down()t.pensize(3)# 黄金比例scale = 0.618# 初始半径r = 50for _ in range(5):draw_square(r)r /= scaleturtle.mainloop()