斐波那契數列:python實現和可視化

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實現和可視化

螺紋


分享到:


相關文章: