您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

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

时间:2020-10-12 10:05:47  来源:  作者:

1 说明

====

1.1 斐波那契数列的介绍。

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

1.3 斐波那契数列的Python/ target=_blank class=infotextkey>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实现和可视化


Tags:斐波那契数列   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
1 说明====1.1 斐波那契数列的介绍。1.2 斐波那契数列是上帝的指纹,大自然中随处可见,目前广泛应用到黄金分割线的布局美和股市等预测等等。1.3 斐波那契数列的python的matplo...【详细内容】
2020-10-12  Tags: 斐波那契数列  点击:(945)  评论:(0)  加入收藏
▌简易百科推荐
背景对抗是反作弊永恒的主旋律,面对对抗我们需要做到快速响应、见招拆招、在变化中发现不变的本质。在反作弊场景中,黑产必须通过文本进行信息传递或触达受害者,而文本由于其生...【详细内容】
2022-07-14  字节跳动技术团队    Tags:算法   点击:(4)  评论:(0)  加入收藏
请实现一个函数用来匹配包含&#39;. &#39;和&#39;*&#39;的正则表达式。模式中的字符&#39;.&#39;表示任意一个字符,而&#39;*&#39;表示它前面的字符可以出现任意次(含0次)。在本题...【详细内容】
2022-07-13  做架构师不做框架师    Tags:正则表达式   点击:(6)  评论:(0)  加入收藏
高手:滑动窗口是一种比较常用的数据统计算法。简单来说,就是在一个大的数组上,定义一个固定长度的滑动窗口,然后这个窗口在数组上进行滑动。在窗口滑动的过程中,左边会出一个元素...【详细内容】
2022-07-13  跟着Mic学架构    Tags:算法   点击:(8)  评论:(0)  加入收藏
一、希尔排序介绍希尔排序这个名字,来源于它的发明者希尔,也称作“缩小增量排序”,是插入排序的一种更高效的改进版本。希尔排序是基于插入排序的以下两点性质而提出改进方法的...【详细内容】
2022-07-08  程序猿星球    Tags:希尔排序   点击:(14)  评论:(0)  加入收藏
描述为了保证第三方应用与API服务器之间通信的安全性,防止Secret Key盗用、数据篡改等恶意攻击行为,开放平台API 服务器使用签名机制,应用在调用开放平台API,需要计算出一个签...【详细内容】
2022-07-08  零一间    Tags:算法   点击:(9)  评论:(0)  加入收藏
6. 蒙特卡洛算法6.1 计算&pi;" role="presentation" style="display: inline; font-style: normal; font-weight: normal; text-indent: 0px; text-align: left; text-trans...【详细内容】
2022-07-08  海椰人  博客园  Tags:算法   点击:(17)  评论:(0)  加入收藏
数学统计在我们的程序当中特别是数据分析当中是必不可少的一部分,本文就来介绍一下 NumPy 常见的统计函数。最大值与最小值numpy.amin()用于计算数组中的元素沿指定轴的最小...【详细内容】
2022-07-07  VT漫步    Tags:统计函数   点击:(15)  评论:(0)  加入收藏
一、基础概念1、Sorted(单调递增or单调递减)2、Bounded(存在上下界)3、Accessible by index(能够通过索引访问,数组适合,but链表不适合)二分查找是一种在每次比较之后将查找空间一...【详细内容】
2022-07-04  程序猿星球    Tags:算法   点击:(14)  评论:(0)  加入收藏
分布式系统的模型为了更容易理解分布式系统,我们先来构建一个模型。 武当派因为人口增长变成 11 个办事处分散在地图各地; 办事处之间的通信只能依靠信鸽; 一只信鸽可能无法完...【详细内容】
2022-07-01  算法的秘密    Tags:共识算法   点击:(20)  评论:(0)  加入收藏
在本课程中, 您将 详细、逐步地解释经典的精选 LeetCode 问题 ,您将了解解决技术编码面试问题的最佳方法。 这是我在准备面试时希望参加的课程。课程英文名:LeetCode in Java A...【详细内容】
2022-06-30  IT教程精选    Tags:LeetCode   点击:(19)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条