<返回更多

斐波那契数列:python实现和可视化

2020-10-12    
加入收藏

1 说明

====

1.1 斐波那契数列的介绍。

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

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

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

斐波那契数列: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实现和可视化

500以内的斐波那契数

3.2 图2:

斐波那契数列:python实现和可视化

3.3 图3

斐波那契数列:python实现和可视化
斐波那契数列:python实现和可视化

3.4 图4

斐波那契数列:python实现和可视化
斐波那契数列:python实现和可视化

3.5 图5

斐波那契数列:python实现和可视化

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 大自然

斐波那契数列:python实现和可视化

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


斐波那契数列:python实现和可视化

按照布局的照片最美


斐波那契数列:python实现和可视化
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>