1 说明
====
1.1 斐波那契数列的介绍。
1.2 斐波那契数列是上帝的指纹,大自然中随处可见,目前广泛应用到黄金分割线的布局美和股市等预测等等。
1.3 斐波那契数列的Python/ target=_blank class=infotextkey>Python的matplotlib和turtle的可视化。
1.4 本文为整理后的资料,小白易懂,适合收藏。
斐波那契 - 意大利数学家-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
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=[]
#数列产生
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代码
#参考文章:https://blog.csdn.NET/cd_don/article/details/87212314
#导出模块
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
#参考文章
#https://blog.csdn.net/jiyeguhong/article/details/108020193?utm_medium=distribute.pc_relevant.none-task-blog-utm_term-2&spm=1001.2101.3001.4242
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
#参看文章:https://blog.csdn.net/cd_don/article/details/87212314
#导出模块
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 大自然
黄金分割数列:黄金分割线
按照布局的照片最美