1 说明

====

1.1 斐波那契数列的介绍。

1.2 斐波那契数列是上帝的指纹,大自然中随处可见,目前广泛应用到黄金分割线的布局美和股市等预测等等。

1.3 斐波那契数列的python的matplotlib和turtle的可视化。

1.4 本文为整理后的资料,小白易懂,适合收藏。




斐波那契数列 Python 不用函数 斐波那契数列python语言_斐波那契数列

斐波那契 - 意大利数学家-1175年-1250年;图片来自网络,如有侵权请联系,定删



2 斐波那契数列

===========

2.1 斐波那契数列(Fibonacci sequence),又称黄金分割数列。

2.2 因他以兔子繁殖为例子而引入,故又称为“兔子数列”。

2.3 数列为:1、1、2、3、5、 8、13、21、34、55、89、144......

2.4 数列中的数为斐波那契数。

2.5 斐波那契数列是上帝的指纹,是一切自然纹理的规律线,文末有图。

3 先看看python的可视化效果图

=======================

3.1 图1




斐波那契数列 Python 不用函数 斐波那契数列python语言_ci_02

500以内的斐波那契数



3.2 图2:




斐波那契数列 Python 不用函数 斐波那契数列python语言_c语言斐波那契数列求和_03


3.3 图3


斐波那契数列 Python 不用函数 斐波那契数列python语言_ci_04


斐波那契数列 Python 不用函数 斐波那契数列python语言_斐波那契数列_05


3.4 图4


斐波那契数列 Python 不用函数 斐波那契数列python语言_斐波那契数列_06


斐波那契数列 Python 不用函数 斐波那契数列python语言_ci_07


3.5 图5


斐波那契数列 Python 不用函数 斐波那契数列python语言_ci_08


4 图片的代码

==========

4.1 图1的代码:

import matplotlib.pyplot as plt
#定一个空列表,存放斐波那契数列的数
#作为可视化y坐标轴值
y_data=[]
#数列产生
def fib(n):
 a=0
 b=1
 while a<=n:
 #将产生的数列的数添加到列表中
 y_data.append(a)
 a,b=b,a+b
#自定义输入自然整数范围
n=int(input('请输入非0任意整数:,推荐500:'))
#调出函数产生数列
fib(n)
#定义x坐标轴数列个数序号
x_data=[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 np
import matplotlib.pyplot as plt
#定义数列产生的函数
def fibo(n):
 if n == 0:
 fibo_list = np.array([0])
 #修改源代码bug
 elif n == 1:
 fibo_list = np.array([0,1])
 else:
 f_0, f_1 = 0, 1
 fibo_list = np.array([f_0,f_1])
 for i in np.arange(n-2):
 fibo_num = f_0 + f_1
 fibo_list = np.append(fibo_list,fibo_num)
 f_0, f_1 = f_1, fibo_num
 return fibo_list
#定义划线函数,由列表找到xy坐标
def find_o_xy(f_list):
 #起始圆心坐标
 x_n, y_n = 0, 0
 o_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 = 7
f_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.pi
for 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.pi
 end_angle += 0.5*np.pi
 #画圆弧形
 plt.plot(circle_x,circle_y,color='r')
 #标题
 plt.title('斐波那契数列螺旋线')
#图片展示
plt.show()

4.3 图3代码

#导入模块
from turtle import *
#输入自定义数列的个数
amount=int(input("请输入斐波那契数列的而个数,推荐15:"))
#数列产生
a1=0
a2=1
tem_he=0
shulie=[]
for i in range(1,amount):
 #终端输出数列的数值
 print(a1,end=',')
 tem_he=a1+a2
 a1=a2
 a2=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
#参考文章
#
import turtle
from random import random
def 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()
 return
if __name__ == '__main__':
 t = turtle.Turtle()
 t.hideturtle()
 t.up()
 t.goto(-130, 50)
 t.down()
 t.pensize(3)
 # 黄金比例
 scale = 0.618
 # 初始半径
 r = 50
 for _ in range(5):
 draw_square(r)
 r /= scale
 turtle.mainloop()

4.5 图5

#参看文章:
#导出模块
import numpy as np
#其实就是matplotlib模块
import pylab as plt
# 产生菲波那切数列
def fibo(n):
 f_0 = 0
 f_1 = 1
 fibo_list = np.array([f_0,f_1])
 for i in np.arange(n-2):
 fibo_num = f_0 + f_1
 fibo_list = np.append(fibo_list,fibo_num)
 f_0, f_1 = f_1, fibo_num
 return fibo_list
#找出各个圆心
def find_o_xy(f_list):
 x_n, y_n = 0, 0 #起始圆心坐标
 o_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)
 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
count = 6 #为7是需要调整figsize=(10,10)大小
f_list = fibo(count)
x0_array,y0_array = find_o_xy(f_list)
#------------------------头像4----------------------------
f_list_r = fibo(count+2)[2::]
start_angle, end_angle = np.pi, 1.5*np.pi
fig = plt.figure(num=1,facecolor='k',figsize=(10,10))
#增加坐标轴对象,显示box
ax = fig.add_axes([0.0, 0.0, 1.0, 1.0], frameon=True,aspect=1)
x_min, x_max, y_min, y_max = 0, 0, 0, 0
for n in np.arange(len(f_list_r)):
 #圆心坐标
 x0 = x0_array[n]
 y0 = y0_array[n]
 #得到对角顶点坐标
 x2 = x0+f_list_r[n]*(-1)**((np.mod(n+1,2)+n+1)/2)
 if n == 0:
 y2 = -1 #起始点特殊目前只想到这么整了
 else:
 y2 = y0+f_list_r[n]*(-1)**(1+(np.mod(n,2)+n)/2)
 #画出圆弧
 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.pi
 end_angle += 0.5*np.pi
 #画图,在坐标轴上画图
 ax.plot(np.append(x0_array[n],np.append(circle_x,x0_array[n])),
 np.append(y0_array[n],np.append(circle_y,y0_array[n])),
 color='k',linewidth=5)
 ax.fill(np.append(circle_x,x0_array[n]),
 np.append(circle_y,y0_array[n]),
 facecolor='gold',alpha = 1)#f5bf03
#设置axes内的填充颜色
ax.patch.set_facecolor('k')
#调节坐标范围
x_min,x_max=8.5,-11.5
y_min,y_max=10,-10
mul_times = 1.5
ax.set_xlim(x_min*mul_times, x_max*mul_times)
ax.set_ylim(y_min*mul_times, y_max*mul_times)
#不显示坐标轴刻度以及刻度线
ax.tick_params(axis='both',labelsize=0,length=0)
#图片展示
plt.show()

5 大自然


斐波那契数列 Python 不用函数 斐波那契数列python语言_ci_09

黄金分割数列:黄金分割线


斐波那契数列 Python 不用函数 斐波那契数列python语言_ci_10

按照布局的照片最美


斐波那契数列 Python 不用函数 斐波那契数列python语言_ci_11

螺纹